UIFont.monospacedDigitSystemFontOfSize()并不是真正的等宽字体?

17

我想使用SF的等宽数字字体来显示一个整数数字在一个文本框中,方法是通过以下方式更改其字体:

textField.font = UIFont.monospacedDigitSystemFont(textField.font!.pointSize, weight: UIFont.Weight.semibold)

但是如果我以60Hz的频率设置文本字段的文本,结果如下:

SF monospaced

对于相同数量的数字,文本的宽度显然不是恒定的,因此它在移动时变得不稳定,因为文本字段被限制在图像下方的“leading”和“trailing”之间。 为什么会出现这种情况,怎样才能解决?

像“Menlo”这样的真正等宽字体表现正确:

Menlo


同样的情况也会发生在宽度受限(启用了“自适应”)的UILabel上。 - YourMJK
你使用的是 Xcode 8 和 Swift 3,是吗? - Code Different
@CodeDifferent 不是,Xcode 7.3.1 和 Swift 2。 - YourMJK
4个回答

9
所以,似乎设置文本字段的“自适应”选项会覆盖字体的等宽属性(即使视图足够大以容纳文本!)
目前我的临时解决方案是:
  • textField.adjustsFontSizeToFitWidth设置为false
  • 重新设置等宽字体(因为某种原因被adjustsFontSizeToFitWidth的setter覆盖了)
  • 开始更改文本
  • 完成后再次将textField.adjustsFontSizeToFitWidth设置为true,以便在用户输入时得到正确的行为
这不是我最初想要的,但它作为一个解决方法可以工作。
图片链接:enter image description here

@matt,其实不是你“让我知道了这个”,我自己发现“调整以适应”会改变整个字体而不是大小。但我仍然非常感谢你的努力!请注意,这不是被接受的答案,我的原始问题仍然存在。我只是想提供一个解决问题的方案并说明问题的来源。同时,我正在考虑向苹果提交一个错误报告。 - YourMJK
4
你不点赞我的回答也不会死,我花了时间来准备,甚至做了一个整个项目来证明“adjust to fit”是问题所在。如果你不奖励他们,人们就没有帮助你的动力。请记住给予奖励。 - matt
在Xcode 9中禁用“自适应”功能,这对我解决了问题。 - nikolovski

2

我有一个项目使用了“自适应调整”选项,如果我对标签输出设置了等宽属性,并且在Xcode 8 Beta 3中使用didSet,似乎可以正常工作。

@IBOutlet weak var textLabel: UILabel! {
    didSet {
        textLabel = UIFont.monospacedDigitSystemFont(ofSize: textLabel!.pointSize, weight: UIFontWeightRegular)
    }
}

谢谢,我会尝试一下!但是应该是 "textLabel.font =" 和 "textLabel!.font!.pointSize" 吧? - YourMJK

0
在我的情况下,我将UILabel的font属性设置为等宽数字字体,并使用attributedText设置文本。这在iOS 9中有效,但在iOS 10中失效了。解决方法是在属性字符串中显式设置字体属性。

0

我曾经遇到过同样的问题,使用了设置代码后问题得以解决。以下是适用于Swift 4的更新:

@IBOutlet weak var textLabel: UILabel! {
    didSet {
        label.font = UIFont.monospacedDigitSystemFont(ofSize: textLabel!.font!.pointSize, weight: UIFont.Weight.regular)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接