我的应用中有一个秒表功能,它使用居中的属性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];
答案 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];