36

WWDC 2015 では、iOS 9 の新しい「サンフランシスコ」システム フォントに関するセッションがありました。iOS 9 SDK にリンクすると、デフォルトで等幅の数字ではなく比例数字のレンダリングが使用されます。NSFont には便利な初期化子があり、これをNSFont.monospacedDigitsSystemFontOfSize(mySize weight:)使用して等幅の数値表示を明示的に有効にすることができます。

ただしUIKit、これに相当するものが見つかりませんでしたUIFont

4

8 に答える 8

53

便利なUIFont拡張機能:

extension UIFont {
    var monospacedDigitFont: UIFont {
        let newFontDescriptor = fontDescriptor.monospacedDigitFontDescriptor
        return UIFont(descriptor: newFontDescriptor, size: 0)
    }
}

private extension UIFontDescriptor {
    var monospacedDigitFontDescriptor: UIFontDescriptor {
        let fontDescriptorFeatureSettings = [[UIFontDescriptor.FeatureKey.featureIdentifier: kNumberSpacingType,
                                              UIFontDescriptor.FeatureKey.typeIdentifier: kMonospacedNumbersSelector]]
        let fontDescriptorAttributes = [UIFontDescriptor.AttributeName.featureSettings: fontDescriptorFeatureSettings]
        let fontDescriptor = self.addingAttributes(fontDescriptorAttributes)
        return fontDescriptor
    }
}

プロパティでの使用法@IBOutlet:

@IBOutlet private var timeLabel: UILabel? {
    didSet {
        timeLabel.font = timeLabel.font.monospacedDigitFont
    }
}

GitHubの最新バージョン。

于 2015-06-22T13:45:21.170 に答える
5

受け入れられたソリューションはうまく機能しますが、コンパイラの最適化を Fast (リリース ビルドのデフォルト) に設定するとクラッシュしていました。このようにコードを書き直しましたが、今はそうではありません:

extension UIFont
{
    var monospacedDigitFont: UIFont
    {
        return UIFont(descriptor: fontDescriptor().fontDescriptorByAddingAttributes([UIFontDescriptorFeatureSettingsAttribute: [[UIFontFeatureTypeIdentifierKey: kNumberSpacingType, UIFontFeatureSelectorIdentifierKey: kMonospacedNumbersSelector]]]), size: 0)
    }
}
于 2016-07-25T13:40:51.930 に答える
3

注:現在受け入れられている回答のメソッドは、リリースビルドでのみ、Xcode 7.3(Swift 2.2)でクラッシュし始めました。中間monospacedDigitFontDescriptor拡張変数を削除すると、問題が修正されます。

extension UIFont {
    var monospacedDigitFont: UIFont {
        let fontDescriptorFeatureSettings = [[UIFontFeatureTypeIdentifierKey: kNumberSpacingType, UIFontFeatureSelectorIdentifierKey: kMonospacedNumbersSelector]]
        let fontDescriptorAttributes = [UIFontDescriptorFeatureSettingsAttribute: fontDescriptorFeatureSettings]
        let oldFontDescriptor = fontDescriptor()
        let newFontDescriptor = oldFontDescriptor.fontDescriptorByAddingAttributes(fontDescriptorAttributes)

        return UIFont(descriptor: newFontDescriptor, size: 0)
    }
}
于 2016-03-29T02:33:15.920 に答える
0

iOS バージョンをチェックする @Rudolf Adamkovic コードの少し改良されたバージョン:

var monospacedDigitFont: UIFont {

    if #available(iOS 9, *) {
        let oldFontDescriptor = fontDescriptor()
        let newFontDescriptor = oldFontDescriptor.monospacedDigitFontDescriptor

        return UIFont(descriptor: newFontDescriptor, size: 0)
    } else {
       return self
    }
}
于 2015-10-02T15:40:36.043 に答える
-3

または、Helvetica を使用してください。それはまだ等幅の数字を持ち、古い iOS バージョンにさかのぼって動作します。

于 2016-04-14T17:01:09.630 に答える