2017-12-21 3 views
0

CATextLayer.font Eigenschaft ist ein opaker CFTypeRef. Gibt es eine Möglichkeit, diese Referenz in eine umzuwandeln? Es macht mir nichts aus, wenn es ein optionales UIFont zurückgibt.CATextLayer-Schrift in UIFont konvertieren

+1

Es kann 'entweder ein CTFont, ein CGFont, eine Instanz von NSFont (nur MacOS) oder eine Zeichenkette sein, die die Schriftart gemäß dem Dokument benennt. Also https://stackoverflow.com/questions/6714858/iphone-convert-ctfont-to-uifont, https://stackoverflow.com/questions/9205709/how-to-convert-cgfontref-to-uifont etc.? Abhängig vom Typ sollte der funktionsgleiche Name in Swift verfügbar sein. https://stackoverflow.com/questions/3471964/determining-what-a-cfttypef-is, um den Typ zu bekommen? – Larme

+0

Seit Sie die Textebene erstellt und konfiguriert haben, wie können Sie nicht wissen, welche Schriftart Sie zugewiesen haben? – matt

+0

Einfach. Dies ist Teil eines allgemeinen Frameworks, und ich verwende Textebenen an verschiedenen Stellen mit unterschiedlichen Schriftarten. In der Tat ist meine Antwort unten eine modifizierte Version einer Protokollimplementierung, die ein "get" und ein "set" erfordert. Es werden keine Annahmen gemacht. –

Antwort

0

ich nur die folgende Erweiterung geschrieben, die behandeln soll: CTFont, CGFont, string name oder 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) 
    } 
} 

Nebenbei bemerkt, ich fand diesen Kommentar in der Dokumentation ungenau:

In iOS können Sie dieser Eigenschaft kein UIFont-Objekt zuweisen.

Von meinen Tests konnte ich ein UIFont auf CATextLayer.font setzen und es scheint gut zu funktionieren.


EDIT

Es stellt sich heraus, wenn Sie ein UIFont-CATextLayer.font Zuweisen zu einem CTFont hinter den Kulissen umgewandelt wird, so um CTFont-UIFont zu konvertieren notwendig es ist, die UIFont wieder raus (was mein Code tut). Einfaches Senden anwürde nicht funktionieren.

0

Sie mögen dies tun können,

let font : UIFont = layer.font as! UIFont 

hoffe, das hilft

+0

Dies ist OK, nur ein UIFont wird an erster Stelle zugewiesen, in jedem anderen Fall wird es fehlschlagen. Nebenbei bemerkt, würde ich Cast nicht erzwingen, da mein Rückgabetyp "UIFont" ist? Kann es einfach "self.font" zurückgeben? UIFont'. –

Verwandte Themen