Swift

2014-06-27 33 views
8

'da CTFont'a bir UIFont nesnesini nasıl yayınlayacağım Bazı kodları UIFont ve CTFont kullanan Swift'e taşımaya çalışıyorum ve (Objective-C'de başarıyla), birinden diğerine geçmek için basit köprülü atımlar kullanıyorum ve tersi.Swift

Örneğin, (a UIFontDescriptor kategorisinde) bu kodu göz önünde bulundurun: Henüz aslında derlemek olacak şekilde Swift bu ifade anlamaya edemedik

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

. ardından en az değildir:

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

Hata: 'UIFont' Bunu deneyin 'CTFont'

+0

Bunun işe yarayıp yaramadığını bilmiyorum ama belki 'UIFont' AnyObject 'öğesini başlatıp CTFont'a atabilirsiniz. Bence en azından döküm, her sınıfın AnyObject'ten miras kaldığı şekilde çalışmalı. – borchero

cevap

1

Bu görünüşte Swift ve/veya CoreText sonraki bir sürümünde düzeltildi. En azından şimdi Xcode 7.0.1 kullanarak testimde çalışıyor.

1

dönüştürülebilir değildir. Değerleri yalnızca bir türden diğerine zorlayamazsınız. Eğer tanımlayıcısı ve olsa boyutundan bir CTFont oluşturursanız dönüşümleri için bir matris (sıfır parametre) CTFontDescriptor oluşturmak gelince

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

içermez bile, sana geçerli bir dizi vermek gibi görünüyor Orijinal olarak verdiğiniz şeye göre CTFontDescriptorCreateWithNameAndSize veya CTFontDescriptorCreateWithAttributes kullanın. İkincisi basit bir NSDictionary alır ve eski bir yazı tipi adı ve boyutunu kullanır.

sadece bir tanımlayıcı almak için aşağıdakileri yapın varolan yazı (o originalFont call) gitmek için:

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

Bu kesinlikle işe yaramasa da, gerçekten mevcut bir UIFont örneğinden CTFont'a _without_ sıfırdan yeniden oluşturmanın bir yolunu arıyorum. [Docs] 'a göre (https://developer.apple.com/library/mac adresindeki referans türü, CTFontRef, iOS'ta UIFont ve OS X'te NSFont ile köprüsüz bir köprü oluşturulduğundan) bu gerçekten mümkün olmalıdır. /documentation/StringsTextFonts/Conceptual/CoreText_Programming/Overview/Overview.html#//apple_ref/doc/uid/TP40005533-CH3-SW5) –

+3

Bu, yalnızca orijinal olandan verileri kullanarak yeni bir yazı tipi nesnesi oluşturuyor. Swift'de Objective-C'nin ücretsiz köprülü dökümüne eşdeğer bir şekilde yapılabileceğini düşünüyorum. Belki Çekirdek Metin API'sı buna izin vermek için henüz açıklanmamış/modernize edilmemiştir. –

+1

@dylan gattey: "originalFont.pointSize" in "CFStringRef" den "CGFloat" 'a dönüştürülmesini şu anda hatalı bir şekilde yapılmasını öneririm. – iamktothed