2017-12-21 5 views
0

CATextLayer.fontプロパティは不透明ですCFTypeRefです。その参照をUIFontに変換する方法はありますか?私はそれがオプションのUIFontを返すかどうか気にしない。 CTFontCGFont、文字列名またはUIFontCATextLayerフォントをUIFontに変換します。

extension CATextLayer { 
    public var typeFace:UIFont? { 
     let name:String 
     switch font { 
     case let ctFont as CTFont : 
      // If you assign a UIFont to CATextLayer.font 
      // it is implicitly converted to CTFont, 
      // so this case will be called. 
      guard let _name = CTFontCopyName(ctFont, kCTFontPostScriptNameKey) else { 
       return nil 
      } 
      name = _name as NSString as String 
     case let cgFont as CGFont : 
      guard let _name = cgFont.postScriptName else { 
       return nil 
      } 
      name = _name as NSString as String 
     case let string as NSString : 
      name = string as String 
     case let string as String : 
      name = string 
     default: 
      return nil 
     } 
     return UIFont(name:name, size:fontSize) 
    } 
} 

あなたはこのように行うことができます

+1

これは、CTFont、CGFont、NSFont(macOSのみ)のインスタンス、またはdocにしたがってフォントを指定する文字列である可能性があります。だからhttps://stackoverflow.com/questions/6714858/iphone-convert-ctfont-to-uifont、https://stackoverflow.com/questions/9205709/how-to-convert-cgfontref-to-uifontなど?タイプに応じて、機能同等の名前はSwiftで利用できるようにする必要があります。タイプを取得するにはhttps://stackoverflow.com/questions/3471964/determining-what-a-cftyperef-is? – Larme

+0

テキストレイヤーを作成して設定したので、どのフォントを割り当てたかわからないのですか? – matt

+0

簡単。これは一般的なフレームワークの一部であり、私はいくつかの場所で異なるフォントでテキストレイヤーを使用します。実際、以下の私の答えは、 'get'と' set'を必要とするプロトコル実装の修正版です。前提はありません。 –

答えて

0

は、私はちょうど処理する必要があり、以下の拡張子を書いたのに役立ちます副題として、私はこのコメントが不正確であることを発見した:

iOSでは、このプロパティにUIFontオブジェクトを割り当てることはできません。

私のテストでは、をCATextLayer.fontに設定できました。正常に動作しているようです。


EDIT

あなたはUIFontCATextLayer.fontを割り当てるときには(バックアウトUIFontを得るために、それはCTFontからUIFontに変換する必要がありますので、それは、舞台裏CTFontに変換され、判明これは私のコードがします)。 UIFontにキャストするだけでは機能しません。

0

let font : UIFont = layer.font as! UIFont 

ホープこれは

+0

これは、UIFontが最初に割り当てられた場合のみOKです。それ以外の場合は失敗します。私の戻り値の型は 'UIFont 'なので、キャストは強制しません。self.fontを返すだけです。 UIFont。 –

関連する問題