ios - UIFontDescriptorSymbolicTraits : Printing out ALL of them FOR an Entire Font family

标签 ios objective-c

所以,我一直在研究我的字体,结果我需要一种方法来打印出特定字体的所有 UIFontDescriptorSymbolicTraits。现在设置的方式是,您只能猜测字体可能具有的 21 种符号特征中的哪一种,以确定字体是否支持 UIFontDescriptorTraitExpanded 之类的东西,似乎没有这是一种直接的方式来做一些事情,我插入一个字体名称,然后神奇地 UIFontDescriptorSymbolicTraits 出现在调试器中。现在我可以查询它的字体,它确实返回了“枚举”数值,但这似乎是 Apple 可能已经提供给我们使用的东西,但我遇到了死胡同。我只能得到枚举数值,没有别的。我正在使用下面的这种方法一个一个地找到这些特征,这很烦人:

UIFontDescriptor *helveticaNeueFamily = [UIFontDescriptor fontDescriptorWithFontAttributes: @{UIFontDescriptorFamilyAttribute: @"Helvetica"}];

helveticaNeueFamily=[helveticaNeueFamily fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitExpanded];
NSArray *matches = reallyMatchingFontDescriptorsWithMandatoryKeys(helveticaNeueFamily, nil);

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

这是我的做法,这是很多代码,但没关系,工作已经完成:

main方法,比如你要查看所有的符号描述符,就是这样:

NSArray *fontFamilies = [UIFont familyNames];

for (int i = 0; i < [fontFamilies count]; i++) {
    NSString *fontFamily = [fontFamilies objectAtIndex:i];
    NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
    NSLog (@"%@: %@", fontFamily, fontNames);
    [self findFontDescriptors:fontFamily size:14];
}

方法,这个和上面的方法一起工作,返回你要找的东西。您可以通过使用下面的方法然后插入字体名称和大小来使用它,但是上面的循环显示了所有系统字体的所有内容:

-(void)findFontDescriptors:(NSString*)fontName size:(float)size {
    if ([self isUIFontDescriptorTraitItalic:fontName size:size]) {
        NSLog(@"UIFontDescriptorTraitItalic");
    }
    if ([self isUIFontDescriptorTraitBold:fontName size:size]) {
        NSLog(@"UIFontDescriptorTraitBold");
    }
    if ([self isUIFontDescriptorTraitExpanded:fontName size:size]) {
        NSLog(@"UIFontDescriptorTraitExpanded");
    }
    if ([self isUIFontDescriptorTraitCondensed:fontName size:size]) {
        NSLog(@"UIFontDescriptorTraitCondensed");
    }
    if ([self isUIFontDescriptorTraitMonoSpace:fontName size:size]) {
        NSLog(@"UIFontDescriptorTraitMonoSpace");
    }
    if ([self isUIFontDescriptorTraitVertical:fontName size:size]) {
        NSLog(@"UIFontDescriptorTraitVertical");
    }
    if ([self isUIFontDescriptorTraitUIOptimized:fontName size:size]) {
        NSLog(@"UIFontDescriptorTraitUIOptimized");
    }
    if ([self isUIFontDescriptorTraitTightLeading:fontName size:size]) {
        NSLog(@"UIFontDescriptorTraitTightLeading");
    }
    if ([self isUIFontDescriptorTraitLooseLeading:fontName size:size]) {
        NSLog(@"UIFontDescriptorTraitLooseLeading");
    }
    if ([self isUIFontDescriptorClassMask:fontName size:size]) {
        NSLog(@"UIFontDescriptorClassMask");
    }
    if ([self isUIFontDescriptorClassUnknown:fontName size:size]) {
        NSLog(@"UIFontDescriptorClassUnknown");
    }
    if ([self isUIFontDescriptorClassOldStyleSerifs:fontName size:size]) {
        NSLog(@"UIFontDescriptorClassOldStyleSerifs");
    }
    if ([self isUIFontDescriptorClassTransitionalSerifs:fontName size:size]) {
        NSLog(@"UIFontDescriptorClassTransitionalSerifs");
    }
    if ([self isUIFontDescriptorClassModernSerifs:fontName size:size]) {
        NSLog(@"UIFontDescriptorClassModernSerifs");
    }
    if ([self isUIFontDescriptorClassClarendonSerifs:fontName size:size]) {
        NSLog(@"UIFontDescriptorClassClarendonSerifs");
    }
    if ([self isUIFontDescriptorClassSlabSerifs:fontName size:size]) {
        NSLog(@"UIFontDescriptorClassSlabSerifs");
    }
    if ([self isUIFontDescriptorClassFreeformSerifs:fontName size:size]) {
        NSLog(@"UIFontDescriptorClassFreeformSerifs");
    }
    if ([self isUIFontDescriptorClassSansSerif:fontName size:size]) {
        NSLog(@"UIFontDescriptorClassSansSerif");
    }
    if ([self isUIFontDescriptorClassOrnamentals:fontName size:size]) {
        NSLog(@"UIFontDescriptorClassOrnamentals");
    }
    if ([self isUIFontDescriptorClassScripts:fontName size:size]) {
        NSLog(@"UIFontDescriptorClassScripts");
    }
    if ([self isUIFontDescriptorClassSymbolic:fontName size:size]) {
        NSLog(@"UIFontDescriptorClassSymbolic");
    }
}

- (BOOL)isUIFontDescriptorTraitBold:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorTraitBold) != 0;
}

- (BOOL)isUIFontDescriptorTraitItalic:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorTraitItalic) != 0;
}

- (BOOL)isUIFontDescriptorTraitExpanded:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorTraitExpanded) != 0;
}

- (BOOL)isUIFontDescriptorTraitCondensed:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorTraitBold) != 0;
}

- (BOOL)isUIFontDescriptorTraitMonoSpace:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorTraitMonoSpace) != 0;
}

- (BOOL)isUIFontDescriptorTraitVertical:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorTraitVertical) != 0;
}

- (BOOL)isUIFontDescriptorTraitUIOptimized:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorTraitUIOptimized) != 0;
}

- (BOOL)isUIFontDescriptorTraitTightLeading:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorTraitBold) != 0;
}

- (BOOL)isUIFontDescriptorTraitLooseLeading:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorTraitLooseLeading) != 0;
}

- (BOOL)isUIFontDescriptorClassMask:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorClassMask) != 0;
}

- (BOOL)isUIFontDescriptorClassUnknown:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorClassUnknown) != 0;
}

- (BOOL)isUIFontDescriptorClassOldStyleSerifs:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorClassOldStyleSerifs) != 0;
}

- (BOOL)isUIFontDescriptorClassTransitionalSerifs:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorClassTransitionalSerifs) != 0;
}

- (BOOL)isUIFontDescriptorClassModernSerifs:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorClassModernSerifs) != 0;
}

- (BOOL)isUIFontDescriptorClassClarendonSerifs:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorClassClarendonSerifs) != 0;
}

- (BOOL)isUIFontDescriptorClassSlabSerifs:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorClassSlabSerifs) != 0;
}

- (BOOL)isUIFontDescriptorClassFreeformSerifs:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorClassFreeformSerifs) != 0;
}

- (BOOL)isUIFontDescriptorClassSansSerif:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorClassSansSerif) != 0;
}

- (BOOL)isUIFontDescriptorClassOrnamentals:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorClassOrnamentals) != 0;
}

- (BOOL)isUIFontDescriptorClassScripts:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorClassScripts) != 0;
}

- (BOOL)isUIFontDescriptorClassSymbolic:(NSString*)fontName size:(float)size {
    UIFont* fonts = [UIFont fontWithName:fontName size:size];
    UIFontDescriptorSymbolicTraits symTraits = fonts.fontDescriptor.symbolicTraits;
    return (symTraits & UIFontDescriptorClassSymbolic) != 0;
}

现在,如果你是 super 硬核并且想更深入,你可以使用这个:

UIFont *font = [UIFont fontWithName: @"HelveticaNeue-Medium" size: 12.0];
CFArrayRef fontFeatures = CTFontCopyFeatures((__bridge CTFontRef) font);
NSLog(@"properties = %@", fontFeatures);

上面的方法将返回一些非常简洁的字体特征,这些特征与上面的不同。 Apple 提供了一个很好的指南:

https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009542

为了玩得开心,让我们打印出所有字体描述符:

https://gist.github.com/anonymous/f6ddb0f525b513b10941

格式如下:

2015-08-27 05:32:28.681 [25332:2371074] Marion: ( "Marion-Italic", "Marion-Bold", "Marion-Regular" )

2015-08-27 05:32:28.681 [25332:2371074] UIFontDescriptorClassMask

2015-08-27 05:32:28.681 [25332:2371074] UIFontDescriptorClassSansSerif

2015-08-27 05:32:28.681 [25332:2371074] UIFontDescriptorClassOrnamentals

2015-08-27 05:32:28.681 [25332:2371074] UIFontDescriptorClassScripts

2015-08-27 05:32:28.682 [25332:2371074] UIFontDescriptorClassSymbolic

关于ios - UIFontDescriptorSymbolicTraits : Printing out ALL of them FOR an Entire Font family,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32247648/

相关文章:

iOS - 无法在具有比例变换的 UIViewAnimation 期间点击 UIView

ios - Swift 中一个屏幕上两个 UIViewController 之间的交互

iphone - 如何自动调整子层大小

ios - 使用(正确的)txt 文件填充详细 View

ios - Xcode UIView rotation : How to set the new position coordinates to 0, 0 旋转后不移动图像?

ios - 是否有人为适用于 iOS 的 Nuance Dragon Mobile Speech SDK 创建了 MonoTouch 绑定(bind)?

ios - 清除 UIImageView 触摸绘制的内容

ios - 使用 Firebase 将图像从一个 View Controller 传递到另一个 View Controller (快速)

ios - 替换 UIView 时假的推送和弹出动画

ios - iMessage 扩展 : Get height of compact view