Как получить FontFormat используя CTFontRef - PullRequest
2 голосов
/ 23 августа 2011

Существует старый код углерода, использующий FMGetFontFormat, чтобы определить, имеет ли шрифт "True Type". Поскольку API устарел, есть ли способ найти то же самое с помощью CTFontRef. Я использовал CTFontCopyAttribute, но он возвращает CTTypeRef, и я не могу получить значение? Есть предложения?

1 Ответ

4 голосов
/ 31 августа 2011

A CTTypeRef - универсальный тип. Если вы читаете документы для константы kCTFontFormatAttribute, они утверждают:

Значение, связанное с этим ключом, представляет собой целое число, представленное в виде Объект CFNumberRef, содержащий одну из констант в «Font Format» Константы «.

Это означает, что вам нужно рассматривать атрибут как число, которое затем можно преобразовать в short и сравнить его с известными значениями для CTFontFormat:

//get an array of all the available font names
CFArrayRef fontFamilies = CTFontManagerCopyAvailableFontFamilyNames();

//loop through the array
for(CFIndex i = 0; i < CFArrayGetCount(fontFamilies); i++)
{
    //get the current name
    CFStringRef fontName = CFArrayGetValueAtIndex(fontFamilies, i);

    //create a CTFont with the current font name
    CTFontRef font = CTFontCreateWithName(fontName, 12.0, NULL);

    //ask it for its font format attribute
    CFNumberRef fontFormat = CTFontCopyAttribute(font, kCTFontFormatAttribute);

    //release the font because we're done with it
    CFRelease(font);

    //if there is no format attribute just skip this one
    if(fontFormat == NULL)
    {
        NSLog(@"Could not determine the font format for font named %@.", fontName);
        continue;
    }

    //get the font format as a short
    SInt16 format;
    CFNumberGetValue(fontFormat, kCFNumberSInt16Type, &format);

    //release the number because we're done with it
    CFRelease(fontFormat);

    //create a human-readable string based on the format of the font
    NSString* formatName = nil;
    switch (format) {
        case kCTFontFormatOpenTypePostScript:
            formatName = @"OpenType PostScript";
            break;
        case kCTFontFormatOpenTypeTrueType:
            formatName = @"OpenType TrueType";
            break;
        case kCTFontFormatTrueType:
            formatName = @"TrueType";
            break;
        case kCTFontFormatPostScript:
            formatName = @"PostScript";
            break;
        case kCTFontFormatBitmap:
            formatName = @"Bitmap";
            break;
        case kCTFontFormatUnrecognized:
        default:
            formatName = @"Unrecognized";
            break;
    }
    NSLog(@"Font: '%@' Format: '%@'", fontName, formatName);
}
...