Найти шрифт по заданным характеристикам в OSX - PullRequest
2 голосов
/ 03 апреля 2012

Есть ли какая-нибудь замена для функции Windows CreateFont(..) в OSX?

Я пытался использовать NSFontDescriptor и метод matchingFontDescriptorsWithMandatoryKeys:, но этот метод не находит «ближайший» шрифтон находит совпадающие характеристики, а также может возвращать nil.

Есть ли способ найти ближайший шрифт по заданным характеристикам (например, CreateFont ) в OSX?

ОБНОВЛЕНО

Что-то странное происходит с 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);

Я создал одинаковые дескрипторы шрифтов в обоих случаях, но в первом случае matchedDescriptors равен nil, а в CoreText API есть некоторые шрифты в matchedDescriptors.Это ошибка?

Но в целом, если я передам nil в XXXMatchingFontDescriptorsXXX в качестве обязательного атрибута, должен ли он вернуть хотя бы один дескриптор?

1 Ответ

0 голосов
/ 28 февраля 2018

Я бы подала Радар, если вы этого не сделали. Я только что почувствовал эту разницу в поведении.

Удивительно, что при отладке я обнаружил, что [fontDescriptor matchingFontDescriptorWithMandatoryKeys:] на самом деле определено, хотя и не документировано, и функционирует, как и ожидалось, для единственного дескриптора. Это означает, что он работает так же, как CTFontDescriptorCreateMatchingFontDescriptor().

Хотя [fontDescriptor matchingFontDescriptorsWithMandatoryKeys:] определенно кажется мне сломленным.

Я обнаружил эту проблему, когда использовал [UIFont fontWithDescriptor:size:], и она соответствовала вещам просто отлично и, как и ожидалось. Затем я переключился на [fontDescriptor matchingFontDescriptorsWithMandatoryKeys:nil], и он вернул ноль для того же дескриптора.

Что-то нехорошо, поэтому я сравнил API CoreText, как вы, и пришел к выводу, что я делюсь с вами здесь.

Я знаю, что вы просматриваете список версий этих методов, я решил поделиться с этим методом в категории UIFontDescriptor:

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