Ios CoreText支持小型大写字母吗?

Ios CoreText支持小型大写字母吗?,ios,core-text,Ios,Core Text,CoreText是否有任何工具可用于选择字体的小型大写字母变体,或者如果字体没有该功能,是否可用于合成小型大写字母?我在CoreText文档中找不到任何关于小型大写字母的内容,尽管有处理字体变化/特征的工具。有人做过类似的事情吗?答案似乎是有保留的是。它支持具有小大写功能的字体,但不支持在没有该功能的字体中合成小大写。可通过使用映射到功能指令数组的kCTFontFeatureSettingsAttribute属性创建CTFontDescriptor来启用此功能。字母大小写的kCTFontFeat

CoreText是否有任何工具可用于选择字体的小型大写字母变体,或者如果字体没有该功能,是否可用于合成小型大写字母?我在CoreText文档中找不到任何关于小型大写字母的内容,尽管有处理字体变化/特征的工具。有人做过类似的事情吗?

答案似乎是有保留的是。它支持具有小大写功能的字体,但不支持在没有该功能的字体中合成小大写。可通过使用映射到功能指令数组的
kCTFontFeatureSettingsAttribute
属性创建
CTFontDescriptor
来启用此功能。字母大小写的
kCTFontFeatureTypeIdentifierKey
键必须设置为3,小写字母的
kCTFontFeatureSelectorIdentifierKey
键必须设置为3<代码>包含标识各种值的常量,尽管此标头在iOS SDK中不可用

在iPad上可用的字体中,以下字体支持小写:

  • HoeflerText正则表达式
  • HoeflerText斜体
  • 霍夫勒特克斯黑
  • HoeflerText黑色斜体
  • 没有

请注意,Didot系列中的斜体/粗体字体不支持小写。

通常最容易使用
CTFontDescriptorCreateCopyWithFeature
。正如您在自己的回答中提到的,这只适用于实际实现您所请求的功能的字体。

扩展Kevin Ballard的回答。值“3”和“3”适用于系统字体,但似乎不是通用的。我使用的是外部字体,这些值不起作用

您可以通过以下方式注销所有可用属性:

UIFont *font = [UIFont fontWithName: fontName size: fontSize];
CFArrayRef  fontProperties  =  CTFontCopyFeatures ( ( __bridge CTFontRef ) font ) ;
NSLog(@"properties = %@", fontProperties);
CFRelease(fontProperties);

并确定启用小写或其他字体功能所需的字体功能和选择器。

我决定在此处回答,以便为试图解决此问题的任何人提供更完整的解决方案,因为此处的信息不完整

此解决方案使用iOS 7
UIFontDescriptor
,因为我现在正在放弃对iOS 6的支持

正如Anthony Mattox所指出的,系统字体值(列为3和3,但应注意实际为
kLetterCaseType
kSmallCapsSelector
,您不应按编号引用枚举)不适用于自定义字体。我不确定这是适用于所有自定义字体还是仅适用于某些字体,但我发现我的字体也是如此

当深入研究这两个枚举值的声明时,您实际上可以看到它们已被弃用,可能只适用于少数支持小写的系统字体。在记录Anthony概述的自定义字体的可用属性之后,我找到了用于自定义字体的2个正确属性。它们是
kLowerCaseType
kLowerCaseSmallCapsSelector
。我相信这种组合是唯一的选择,所以对于你尝试使用的任何字体,它都是一种或另一种

我编写了一些分类方法来封装这两种情况下的功能:

- (UIFont *) smallCapSystemFont
{
    UIFontDescriptor *descriptor = [self fontDescriptor];
    NSArray *array = @[@{UIFontFeatureTypeIdentifierKey : @(kLetterCaseType),
                         UIFontFeatureSelectorIdentifierKey : @(kSmallCapsSelector)}];
    descriptor = [descriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute : array}];
    return [UIFont fontWithDescriptor:descriptor size:0];
}

- (UIFont *) smallCapCustomFont
{
    UIFontDescriptor *descriptor = [self fontDescriptor];
    NSArray *array = @[@{UIFontFeatureTypeIdentifierKey : @(kLowerCaseType),
                         UIFontFeatureSelectorIdentifierKey : @(kLowerCaseSmallCapsSelector)}];
    descriptor = [descriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute : array}];
    return [UIFont fontWithDescriptor:descriptor size:0];
}
您可以通过创建具有正确名称和大小的字体,然后调用其中一个方法来使用这些方法,该方法将返回该字体的小型版本。您将需要找出正确的方法来使用任何您决定使用的小型大写字体

通过检查可用类型(即使只是分析字体属性数组的结果),可能有一种聪明的方法来确定在运行时以编程方式使用哪种字体,但我没有费心这么做,因为我只使用了一些不同的字体,手动检查对我来说是合适的

编辑: 我注意到,数字是分开处理的。如果您希望数字也有小的封顶(在大多数支持它的字体中,这实际上似乎被称为“旧式数字”),那么您需要将其明确地作为一个属性

看起来支持系统字体和自定义字体都是一样的,不像字母

您只需将此字典添加到上面的每个数组:

@{UIFontFeatureTypeIdentifierKey : @(kNumberCaseType),
                         UIFontFeatureSelectorIdentifierKey : @(kLowerCaseNumbersSelector)}

再次强调,要使其正常工作,字体本身实际上需要支持此属性。

因为这里没有人提供了Swift 4示例,我只想包括游乐场代码,以便在UILabel中显示一些小写文本:

//: Playground - noun: a place where people can play    
import UIKit
import CoreGraphics

let pointSize : CGFloat = 24
let fontDescriptor = UIFont(name: "HoeflerText-Regular", size: pointSize)!.fontDescriptor



let fractionFontDesc = fontDescriptor.addingAttributes(
    [
        UIFontDescriptor.AttributeName.featureSettings: [
            [
                UIFontDescriptor.FeatureKey.featureIdentifier: kLetterCaseType,
                UIFontDescriptor.FeatureKey.typeIdentifier: kSmallCapsSelector
            ]
        ]
    ] )

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 500, height: 100))

label.font = UIFont(descriptor: fractionFontDesc, size:pointSize)
label.text = "Montpelier, Vermont" 

在我的例子中,我还需要可选地支持斜体/粗体,因此我确实需要使用更通用的属性版本。但是你是对的,对于简单的小字体开关,
CTFontDescriptorCreateCopyWithFeature
更容易使用。我认为这个标题现在可以在iOS 5 SDK中使用。这个方法不适用于iOS 7系统字体(Helvetica Neue)。@Legoless澄清一下,它将不适用于Helvetica Neue,因为该字体没有小大写模式。这只适用于已烘焙到其中的字体。在这个问题的另一个答案中有这些字体的列表。系统字体的一个例子是“Didot”。尝试使用该字体
smallCapsSystemFont
,您将看到它的实际应用。如果您想使用Helvetica Neue的SmallCaps,您需要找到其他人制作的内置字体的版本,或者通过绘制较小大小的大写字符来伪造它。提到这些字体的答案是从2011年开始,我想从那时起字体可能已经改变了。但根据我的研究,OSX和iOS都有相同的Helvetica Neue字体。那么,为什么Photoshop可以轻松地在Helvetica Neue中呈现小型大写字母,而iOS却不能呢?您可以再次使用上面答案中的日志功能(
CTFontCopyFeatures
)。这将列出给定字体的属性,您可以查看小大写是否是其中之一。(很明显是哪一个)