如何阻止UILabel在每次增量时调整大小?

时间:2014-02-05 06:10:57

标签: objective-c swift nsstring nsattributedstring core-text

我的应用中有一个秒表功能,它使用居中的属性UILabel和按比例间隔的字体来渲染时间。每次增加标签的宽度都会发生变化,从而产生一种在快速速度下看起来特别糟糕的弹跳效果。这是一个example

我该如何解决这个问题?

iOS 9更新

现在是单行:

UIFont.monospacedDigitSystemFontOfSize(17, weight: UIFontWeightRegular)

另外,我上次尝试时,下面的解决方案对iOS 9无效。在标题中绊倒之前,浪费了相当多的时间进行调试。

在iOS 7中使用Text Kit变得微不足道。

确保导入核心文本:

#import <CoreText/CoreText.h>

创建一个将比例数转换为等宽数字的设置:

NSArray *monospacedSetting = @[@{UIFontFeatureTypeIdentifierKey: @(kNumberSpacingType),
                                 UIFontFeatureSelectorIdentifierKey: @(kMonospacedNumbersSelector)}];

通过附加UILabel使用的当前字体描述符来创建新的字体描述符:

UIFontDescriptor *newDescriptor = [[timeLabel.font fontDescriptor] fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute: monospacedSetting}];

更新标签的字体:

// Size 0 to use previously set font size
timeLabel.font = [UIFont fontWithDescriptor:newDescriptor size:0];

2 个答案:

答案 0 :(得分:3)

对于未来的读者:

这是如何在旧金山的iOS 9上启用等宽数字:

let originalFont = UIFont.systemFontOfSize(17)
let originalFontDescriptor = originalFont.fontDescriptor()

let fontDescriptorFeatureSettings = [
    [
    UIFontFeatureTypeIdentifierKey: kNumberSpacingType,
    UIFontFeatureSelectorIdentifierKey: kMonospacedNumbersSelector
    ]
]

let fontDescriptorAttributes = [UIFontDescriptorFeatureSettingsAttribute: fontDescriptorFeatureSettings]    
let fontDescriptor = originalFontDescriptor.fontDescriptorByAddingAttributes(fontDescriptorAttributes)
let font = UIFont(descriptor: fontDescriptor, size: 0)

编辑:

也可在GitHub上找到: https://github.com/salutis/swift-font-monospaced-digits

答案 1 :(得分:2)

在创建强制等宽数字的字体时使用等宽字体或传递参数:

//kNumberSpacingType 6
//kMonospacedNumbersSelector 0
NSArray *setting = @[
                         @{
                             UIFontFeatureTypeIdentifierKey: @(6),
                             UIFontFeatureSelectorIdentifierKey: @(0)
                             }
                         ];

return [UIFont fontWithDescriptor:[[self fontDescriptor] fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute : setting}] size:0.0];