在iOS上,我在项目中加载自定义字体,方法是将其文件名(.otf文件)添加到info.plist文件中,然后使用以下代码行:
UIFont myFont * = [UIFont fontWithName:titleFontName size:titleFontSize];
我获得了可以在UILabels和UITextViews中使用的字体。
如何才能获得此字体仅以小型大写字母显示?如果我在Photoshop中使用它,可以打开小型大写字母开关,将所有单词排版成小型大写字母(因此,我得出结论,字体没有任何缺失)。我怎么能在iOS上获得类似的效果?
由于其他原因,将我的字符串转换为大写不是可行的选择。
更多信息:该字体在其系列中只有一个成员,我可以通过使用以下代码理解,该系列中没有独立的小型成员。
for (NSString * familyName in [UIFont familyNames]) {
NSLog(@"---------------- %@ ---------------", familyName);
for (NSString * fontName in[UIFont fontNamesForFamilyName:familyName] )
NSLog(@"- %@", fontName);
}
答案 0 :(得分:18)
通过开放式功能在字体中启用小型大写字母。在iOS 7中,我们可以使用字体描述符来访问开放式功能并启用小型上限。
This question介绍了如何使用核心文本打开小型大写字母,但同样可以轻松地为UIFonts和UIKit视图做同样的事情。您需要创建UIFontDescriptor
并将UIFontDescriptorFeatureSettingsAttribute
设置为要启用的功能的字典数组。
每个字体要素字典都包含用于指定要素类型的键和值,以及要素选择器的键和值。根据您使用的字体,您需要找到与小型大写相对应的正确值。您可以在注释部分记录的数组中找到它们。
此类别将生成启用了小型大写的UIFont对象。您需要添加正确的字体名称。
#import "UIFont+SmallCaps.h"
#import <CoreText/CoreText.h>
@implementation UIFont (SmallCaps)
+ (UIFont *) applicationSmallCapsFontWithSize:(CGFloat) size {
/*
// Use this to log all of the properties for a particular font
UIFont *font = [UIFont fontWithName: fontName size: fontSize];
CFArrayRef fontProperties = CTFontCopyFeatures ( ( __bridge CTFontRef ) font ) ;
NSLog(@"properties = %@", fontProperties);
*/
NSArray *fontFeatureSettings = @[ @{ UIFontFeatureTypeIdentifierKey: @(kLowerCaseType),
UIFontFeatureSelectorIdentifierKey : @(kLowerCaseSmallCapsSelector) } ];
NSDictionary *fontAttributes = @{ UIFontDescriptorFeatureSettingsAttribute: fontFeatureSettings ,
UIFontDescriptorNameAttribute: FONT_NAME } ;
UIFontDescriptor *fontDescriptor = [ [UIFontDescriptor alloc] initWithFontAttributes: fontAttributes ];
return [UIFont fontWithDescriptor:fontDescriptor size:size];
}
@end
答案 1 :(得分:10)
Swift中UIFont
的扩展名:
extension UIFont {
func smallCaps() -> UIFont {
let settings = [[UIFontFeatureTypeIdentifierKey: kLowerCaseType, UIFontFeatureSelectorIdentifierKey: kLowerCaseSmallCapsSelector]]
let attributes: [String: AnyObject] = [UIFontDescriptorFeatureSettingsAttribute: settings, UIFontDescriptorNameAttribute: fontName]
return UIFont(descriptor: UIFontDescriptor(fontAttributes: attributes), size: pointSize)
}
}
<强>用法:强>
label.font = UIFont(name: "SourceSansPro-Regular", size: 12)?.smallCaps()
示例:强>
macOS版本:
extension NSFont {
func smallCaps() -> NSFont? {
let settings = [[NSFontFeatureTypeIdentifierKey: kLowerCaseType, NSFontFeatureSelectorIdentifierKey: kLowerCaseSmallCapsSelector]]
let attributes: [String: AnyObject] = [NSFontFeatureSettingsAttribute: settings as AnyObject, NSFontNameAttribute: fontName as AnyObject]
return NSFont(descriptor: NSFontDescriptor(fontAttributes: attributes), size: pointSize)
}
}
重要:强>
并非所有字体都适用它,这取决于字体是否包含在字体中,因为 @Anthony Mattox 表示。
请记住将字符串设置为:Example
,而不是EXAMPLE
。
Array<NDSictionary>
,而非NSDictonary
。