首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIFont单频位数+小盘

UIFont单频位数+小盘
EN

Stack Overflow用户
提问于 2018-08-13 18:29:20
回答 1查看 518关注 0票数 0

我正在尝试创建一个具有以下属性的UIFont

  • 大小写小帽
  • 小写小Caps
  • 单步长数字

我使用的是系统字体(San Francisco),它支持所有这些特性。

据我所知,唯一的方法是使用多个UIFontDescriptor

下面是我使用的代码:

代码语言:javascript
复制
extension UIFont {

    var withSmallCaps: UIFont {
        let upperCaseFeature = [
            UIFontDescriptor.FeatureKey.featureIdentifier : kUpperCaseType,
            UIFontDescriptor.FeatureKey.typeIdentifier : kUpperCaseSmallCapsSelector
        ]
        let lowerCaseFeature = [
            UIFontDescriptor.FeatureKey.featureIdentifier : kLowerCaseType,
            UIFontDescriptor.FeatureKey.typeIdentifier : kLowerCaseSmallCapsSelector
        ]
        let features = [upperCaseFeature, lowerCaseFeature]
        let smallCapsDescriptor = self.fontDescriptor.addingAttributes([UIFontDescriptor.AttributeName.featureSettings : features])

        return UIFont(descriptor: smallCapsDescriptor, size: pointSize)
    }

    var withMonospacedDigits: UIFont {
        let monospacedDigitsFeature = [
            UIFontDescriptor.FeatureKey.featureIdentifier : kNumberSpacingType,
            UIFontDescriptor.FeatureKey.typeIdentifier : kMonospacedNumbersSelector
        ]
        let monospacedDigitsDescriptor = self.fontDescriptor.addingAttributes([UIFontDescriptor.AttributeName.featureSettings : [monospacedDigitsFeature]])

        return UIFont(descriptor: monospacedDigitsDescriptor, size: pointSize)
    }
}

我应该能够获得一种具有前面提到的所有特征的字体,这一行代码:

代码语言:javascript
复制
let font = UIFont.systemFont(ofSize: 16, weight: .regular).withSmallCaps.withMonospacedDigits
// OR
let font = UIFont.monospacedDigitSystemFont(ofSize: 16, weight: .regular).withSmallCaps

但出于某些原因,这是行不通的。我不能让字体有一个数字,同时有小的大写。

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2018-08-16 19:08:04

有关更多细节,请查看参考文献文档。我建议对所有象形文字(数字除外)都使用带有小大写的属性字符串,而对单个数字使用另一种字体。下面是一些示例代码:

代码语言:javascript
复制
let monoSpacedDigits = UIFont.systemFont(ofSize: 13, weight: .medium).withMonospacedDigits
let smallCaps = UIFont.systemFont(ofSize: 16, weight: .regular).withSmallCaps



let attributedString = NSMutableAttributedString(string: """
H3ll0 7here
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999
0000000000
""", attributes: [NSAttributedStringKey.font : smallCaps])

do {
    let regex = try NSRegularExpression(pattern: "[0-9]")
    let range = NSRange(0..<attributedString.string.utf16.count)
    let matches = regex.matches(in: attributedString.string, range: range)
    for match in matches.reversed() {
        attributedString.addAttribute(NSAttributedStringKey.font, value: monoSpacedDigits, range: match.range)
    }
} catch {
    // Do error processing here...
    print(error)
}

myLabel.attributedText = attributedString

我使用了一个13的大小和一个中等的重量,使单步长的数字看起来尽可能类似于小盘。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51828496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档