2011-01-26 5 views
12

CoreTextにはフォントのSmallCapsバリアントを選択する機能がありますか、フォントにその機能がない場合は小さなキャップを合成する機能はありますか?フォントのバリエーションや機能を扱う機能はありますが、小さな帽子について語っているCoreTextのドキュメントでは何も見つかりません。誰もこれに似た何かをしましたか?CoreTextはSmall Capsをサポートしていますか?

答えて

6

一般にCTFontDescriptorCreateCopyWithFeatureを使用するのが最も簡単です。あなた自身の答えで言及したように、これはあなたが要求している機能を実際に実装しているフォントに対してのみ機能します。

+0

私の場合は、オプションでitalics/boldもオプションでサポートする必要があるので、より一般的な属性バージョンを使用する必要があります。しかし、小文字のオン/オフを単純に切り替えるためには、 'CTFontDescriptorCreateCopyWithFeature'が少し使いやすくなります。 –

10

答えは「はい」と答えています。 Small Caps機能を備えたフォントをサポートしていますが、Small Capsをその機能を持たないフォントで合成することはサポートしていません。この機能を有効にするには、kCTFontFeatureSettingsAttribute属性を持つCTFontDescriptor属性を作成します。この属性は機能ディクテーションの配列に対応します。レターケースの場合はkCTFontFeatureTypeIdentifierKeyキーを3に設定し、スモールキャップの場合はkCTFontFeatureSelectorIdentifierKeyを3に設定する必要があります。 <ATS/SFNTLayoutTypes.h>にはさまざまな値を識別する定数が含まれていますが、このヘッダーはiOS SDKでは使用できません。

iPadの利用可能なフォント

、以下のサポートスモールキャップス:

  • HoeflerText-正規
  • HoeflerText-斜体
  • HoeflerText-ブラック
  • HoeflerText-BlackItalic
  • ディド

注:Italic/Bold foディド族のntsは小さな帽子をサポートしていません。

+0

私はこのヘッダは、今で利用可能だと思いますiOS 5 SDK –

2

ケビン・バラードの答えを広げる。値 '3'と '3'はシステムフォントで動作しますが、普遍的ではないようです。私は外部フォントを使用しており、これらの値は機能しませんでした。

UIFont *font = [UIFont fontWithName: fontName size: fontSize]; 
CFArrayRef fontProperties = CTFontCopyFeatures ((__bridge CTFontRef) font) ; 
NSLog(@"properties = %@", fontProperties); 
CFRelease(fontProperties); 

を、あなたは小さなキャップまたは他のフォント機能を有効にする必要がありますどのようなフォント機能とセレクタ決定:

あなたはこのようなものを利用できるすべてのプロパティをログアウトすることができます。

5

ここでは情報が不完全であるため、この問題を解決しようとする人には、より完全なソリューションを提供するため、ここで回答することにしました。

私は今、アンソニーMattox氏が指摘したように、3,3として記載されていますが、実際に注意しなければならないシステムフォント値は(もiOSの6

のサポートを落としていますので、このソリューションは、iOSの7 UIFontDescriptorを使用していますkLetterCaseTypekSmallCapsSelectorの場合、番号で列挙型を参照しないでください)、カスタムフォントでは機能しません。私はこれがすべてのカスタムフォントの場合であろうと、いくつかのフォントであるかどうかはわかりませんが、私はこれが私の場合であることがわかりました。

これらの列挙型の両方の宣言に目を通すと、実際には廃止予定であることがわかります。おそらく小文字をサポートする少数のシステムフォントに対してのみ機能します。 Anthonyが概説したカスタムフォントの使用可能な属性を記録した後、カスタムフォントに使用する2つの正しい属性が見つかりました。それらはkLowerCaseTypekLowerCaseSmallCapsSelectorです。私は、この組み合わせが他の唯一の選択肢だと考えていますので、あなたが使用しようとしているフォントであれば、どちらか一方のフォントになります。

私は両方のケースのために、この機能をカプセル化するために、いくつかのカテゴリのメソッドを書いた:

- (UIFont *) smallCapSystemFont 
{ 
    UIFontDescriptor *descriptor = [self fontDescriptor]; 
    NSArray *array = @[@{UIFontFeatureTypeIdentifierKey : @(kLetterCaseType), 
         UIFontFeatureSelectorIdentifierKey : @(kSmallCapsSelector)}]; 
    descriptor = [descriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute : array}]; 
    return [UIFont fontWithDescriptor:descriptor size:0]; 
} 

- (UIFont *) smallCapCustomFont 
{ 
    UIFontDescriptor *descriptor = [self fontDescriptor]; 
    NSArray *array = @[@{UIFontFeatureTypeIdentifierKey : @(kLowerCaseType), 
         UIFontFeatureSelectorIdentifierKey : @(kLowerCaseSmallCapsSelector)}]; 
    descriptor = [descriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute : array}]; 
    return [UIFont fontWithDescriptor:descriptor size:0]; 
} 

あなたが正しい名前とサイズのフォントを作成し、返します。それにはこれらの方法のいずれかを呼び出すことによって、これらを使用しますそのフォントの小さなキャップバージョン。あなたは、あなたが使うことを決めた小さな大文字フォントに使う正しい方法を見つけ出す必要があります。

実行時に(フォントプロパティ配列の結果を分析するだけでも)使用可能な型をチェックすることによって、プログラムで使用する方法を見つけ出す巧妙な方法がありますが、私はそうしていますいくつかの異なるフォントとマニュアルチェックしか使用していません。

編集:

私が気づいたことの一つは、数字が別々に処理されることです。数字を小さくしたい場合(実際にはそれをサポートするほとんどのフォントでは "旧式の数字"と呼ばれるようです)、明示的に属性として必要となります。

文字とは異なり、システムフォントとカスタムフォントの両方で同じように見えます。

あなただけの上記アレイのそれぞれにこの辞書を追加します。これは、それ自体が実際にこの属性をサポートする必要があるフォントを動作させるために、もう一度

@{UIFontFeatureTypeIdentifierKey : @(kNumberCaseType), 
         UIFontFeatureSelectorIdentifierKey : @(kLowerCaseNumbersSelector)} 

+0

この方法は、iOS 7システムフォント(Helvetica Neue)では機能しません。 – Legoless

+0

@Legoless Helvetica Neueではフォントが小文字モードになっていないので、明確にするため、Helvetica Neueでは機能しません。これは、それが焼き付けられたフォントに対してのみ機能します。この質問の別の答えには、これらのフォントのリストがあります。これが動作するシステムフォントの例は "Didot"です。それを使って 'smallCapsSystemFont'を試してみてください。そうすれば実際に見られます。 – Dima

+0

Helvetica Neueで小文字を使用する場合は、他の誰かが作成したフォントのバージョンを見つけるか、サイズの小さい大文字を描画して偽装する必要があります。 – Dima

0

ここに誰がスウィフト4サンプルを提供していないとして、私はUILabelでいくつかの小さなキャップのテキストを表示するための遊び場コードを含めるつもりです:

//: Playground - noun: a place where people can play  
import UIKit 
import CoreGraphics 

let pointSize : CGFloat = 24 
let fontDescriptor = UIFont(name: "HoeflerText-Regular", size: pointSize)!.fontDescriptor 



let fractionFontDesc = fontDescriptor.addingAttributes(
    [ 
     UIFontDescriptor.AttributeName.featureSettings: [ 
      [ 
       UIFontDescriptor.FeatureKey.featureIdentifier: kLetterCaseType, 
       UIFontDescriptor.FeatureKey.typeIdentifier: kSmallCapsSelector 
      ] 
     ] 
    ]) 

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 500, height: 100)) 

label.font = UIFont(descriptor: fractionFontDesc, size:pointSize) 
label.text = "Montpelier, Vermont" 
関連する問題