2012-04-03 37 views
2

在OSX中是否有替代Windows的CreateFont(..)功能?在OSX中查找指定特徵的字體

我試着使用NSFontDescriptor及其matchingFontDescriptorsWithMandatoryKeys:方法,但這種方法並不能找到「最接近」字體,它找到匹配的特性,也可以返回nil

有什麼辦法在OSX中按指定特徵(如CreateFont)找到最接近的字體?

更新與NSFontDescriptor

奇怪的事情發生..

我有兩段代碼:

可可:

NSDictionary* fontTraits = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithInt:NSFontSansSerifClass], NSFontSymbolicTrait, 
          [NSNumber numberWithFloat:0.4], NSFontWidthTrait, 
          nil]; 

NSDictionary* fontAttributes = [NSDictionary dictionaryWithObjectsAndKeys: 
        fontTraits, NSFontTraitsAttribute, 
        nil]; 

NSFontDescriptor* fontDescriptor = [NSFontDescriptor fontDescriptorWithFontAttributes:fontAttributes]; 

NSArray* matchedDescriptors = [fontDescriptor matchingFontDescriptorsWithMandatoryKeys:nil]; 

而且使用CoreText API:

CFMutableDictionaryRef fontTraits = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 

float weight = 0.4; 

CFNumberRef fontWeight = CFNumberCreate(kCFAllocatorDefault, kCFNumberFloat32Type, &weight); 

CFDictionaryAddValue(fontTraits, kCTFontWeightTrait, fontWeight); 

int symbolicTraits = kCTFontSansSerifClass; 

CFNumberRef fontSymbolicTraits = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &symbolicTraits); 

CFDictionaryAddValue(fontTraits, kCTFontSymbolicTrait, fontSymbolicTraits); 

CFMutableDictionaryRef fontAttributes = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 

CFDictionaryAddValue(fontAttributes, kCTFontTraitsAttribute, fontTraits); 

CTFontDescriptorRef fontDescriptor = CTFontDescriptorCreateWithAttributes(fontAttributes); 

CFArrayRef matchedDescriptors = CTFontDescriptorCreateMatchingFontDescriptors(fontDescriptor, 0); 

我在這兩種情況下都創建了相同的字體描述符,但在第一種情況下,matchedDescriptorsnil,而CoreText API中有一些字體在matchedDescriptors中。這是一個錯誤嗎?

但一般來說,如果我通過nilXXXMatchingFontDescriptorsXXX作爲強制屬性,它是否應返回至少一個描述符?

回答

0

如果你還沒有,我會請你申請雷達。我自己也有同樣的行爲差異。

調試時出現一個令人驚訝的事情,我發現[fontDescriptor matchingFontDescriptorWithMandatoryKeys:]實際上是被定義的,雖然沒有被記錄,並且對於單個描述符的功能是預期的。意思是,它的工作原理就像CTFontDescriptorCreateMatchingFontDescriptor()

雖然[fontDescriptor matchingFontDescriptorsWithMandatoryKeys:]肯定對我來說是破碎的。

我在使用[UIFont fontWithDescriptor:size:]時發現了這個問題,它正好匹配事情,並且如預期的那樣。然後我切換到[fontDescriptor matchingFontDescriptorsWithMandatoryKeys:nil],它返回nil爲相同的描述符。

感覺有些問題,所以我和CoreText API比較,並得出結論,我在這裏與你分享。

我知道你在看這些方法的名單版本,我想我會分享我用這種方法去在UIFontDescriptor類別:

- (nullable instancetype)my_matchingFontDescriptorWithMandatoryKeys:(nullable NSSet<UIFontDescriptorAttributeName> *)mandatoryKeys { 
    return (__bridge_transfer UIFontDescriptor *)CTFontDescriptorCreateMatchingFontDescriptor((__bridge CTFontDescriptorRef)self, (__bridge CFSetRef)mandatoryKeys); 
} 
相關問題