2014-06-27 12 views
8

Próbuję przenieść kod do Swift, który używa UIFont i CTFont, i że (pomyślnie, w Objective-C) używa prostych mostowanych rzutów, aby uzyskać od jednego do drugiego i wzajemnie.Jak przesłać obiekt UIFont do CTFont w Swift

Na przykład, należy rozważyć ten kod (w kategorii UIFontDescriptor):

UIFont *font = [UIFont fontWithDescriptor:self size:0.0]; 
NSArray *features = CFBridgingRelease(CTFontCopyFeatures((__bridge CTFontRef)font)); 

jeszcze nie był w stanie zorientować się, jak wyrazić to w Swift w sposób, który będzie faktycznie skompilować. Poniższy przynajmniej nie:

let font = UIFont(descriptor:self, size: 0.0) 
let features = CTFontCopyFeatures(font as CTFont) 

Błąd: 'UIFont' nie jest wymienialny na 'CTFont'

+0

Cóż, nie wiem, czy to działa, ale możesz spróbować zainicjować 'UIFont'as' AnyObject', a następnie przesłać go do CTFont. Myślę, że przynajmniej rzutowanie powinno działać, ponieważ każda klasa dziedziczy z AnyObject. – borchero

Odpowiedz

1

To najwyraźniej została ustalona w późniejszej wersji Swift i/lub CoreText. Przynajmniej działa teraz w moich testach przy użyciu Xcode 7.0.1.

1

Spróbuj tego. Nie możesz po prostu przymuszać wartości z jednego rodzaju do drugiego. Jeśli utworzysz CTFont z deskryptora i wielkości chociaż wydaje się, że daje poprawną tablicę nawet jeśli nie należą macierzy przekształceń (parametr nil)

let font = CTFontCreateWithFontDescriptor(descriptor, 0.0, nil) 
let features: NSArray = CTFontCopyFeatures(font) 

chodzi o tworzenie CTFontDescriptor, ja 'd użyć CTFontDescriptorCreateWithNameAndSize lub CTFontDescriptorCreateWithAttributes w zależności od tego, co pierwotnie podano. Ten ostatni używa prostego NSDictionary, a pierwszy używa tylko nazwy i rozmiaru czcionki.

Aby przejść z istniejącego czcionki (nazywają to originalFont) po prostu wykonaj następujące czynności, aby uzyskać deskryptor:

let font = CTFontCreateWithName(originalFont.fontName as CFStringRef, 
    originalFont.pointSize as CGFloat, nil) 
+4

Chociaż powinno to z pewnością zadziałać, naprawdę szukam sposobu na przejście z istniejącej instancji 'UIFont' na' CTFont' _nieodtwarzając jej od zera. To naprawdę powinno być możliwe, biorąc pod uwagę, że "jego typ odniesienia, CTFontRef, jest bezpłatny w połączeniu z UIFont w iOS i NSFont w OS X", zgodnie z [docs] (https://developer.apple.com/library/mac /documentation/StringsTextFonts/Conceptual/CoreText_Programming/Overview/Overview.html#//apple_ref/doc/uid/TP40005533-CH3-SW5) –

+3

To wciąż tworzy nowy obiekt czcionki, po prostu używając danych z oryginalnego. Myślę, że powinno być jakoś możliwe, by zrobić odpowiednik bezkolizyjnej, mostkowej obsady w Swift. Może interfejs API Core Text nie został jeszcze adnotowany/zmodernizowany, aby to umożliwić. –

+1

@ldlan gattey: Proponuję zmienić rzutowanie 'originalFont.pointSize' z' CFStringRef' na 'CGFloat', ponieważ jest on obecnie niepoprawnie rzutowany. – iamktothed

Powiązane problemy