iOS阻止计时器UILabel'摇动'当数字改变时

时间:2015-11-19 09:55:31

标签: ios swift autolayout adaptive-layout

我有一个UILabel,它以MM:ss:SS(分钟,秒,厘秒)的格式显示定时器的输出,但它"震动"从左到右随着厘秒的宽度变化 - " 11"比#33; 33"更窄例如。

有什么办法可以减轻这种影响吗?我试过把它居中,给它一个固定的宽度,但它们似乎没什么帮助。

3 个答案:

答案 0 :(得分:17)

自iOS 9.0起,系统字体使用比例数字。如果您想要等宽数字,可以使用+[UIFont monospacedDigitSystemFontOfSize:weight:]获得变体字体。这仅适用于系统字体。

如果您想使用其他字体,您可以尝试使用等宽字体,但可能没有。给定UIFont,您可以请求其fontDescriptor,然后使用-[UIFontDescriptor fontDescriptorWithSymbolicTraits:]UIFontDescriptorTraitMonoSpace请求使用等宽字体(不仅仅是数字)的类似字体描述符。然后,您可以通过将新字体描述符传递给+[UIFont fontWithDescriptor:size:]来创建新字体。

但是,我怀疑是否存在Impact的等宽变体。它不适合您的目的。

答案 1 :(得分:2)

使用等宽字体,也称为固定间距,固定宽度或非比例字体,是一种字体,其字母和字符各自占据相同数量的水平空间。等宽字体的示例包括Courier,Courier New,Lucida Console,Monaco和Consolas

答案 2 :(得分:2)

我遇到了同样的问题。 @KenThomases回答有效。这是Swift版本:

<div class="flex-container">
  <div class="row">
    <div class="navBar">
      <a class="bar title" href="#">title</a>
      <a class="bar right balance" href="#">balance</a>
      <a class="bar right" href="#">three</a>
      <a class="bar right" href="#">two</a>
      <a class="bar right" href="#">one</a>
      
    </div>
    <div>
      <div class="flex-item">element one</div>
      <div class="flex-item ad">element two</div>
    </div>
    <div>
      <a class="bottom" href="#">placeholder</a>
    </div>
  </div>
</div>

即:

// replace whatever font your using with this font instead to stop the shaking
UIFont.monospacedDigitSystemFont(ofSize: 19, weight: UIFont.Weight.regular)

仅供参考,还有其他yourLabel.font = UIFont.monospacedDigitSystemFont(ofSize: 19, weight: UIFont.Weight.regular) 个权重:

UIFont.Weight.black.bold.heavy.light.medium.regular.semibold.thin

According to this other answer以下字体是系统生成的字体,也是等宽,所以它们也不会动摇:

信使

信使粗体

信使BoldOblique

信使斜

CourierNewPS-BoldItalicMT

CourierNewPS-BoldMT

CourierNewPS-ItalicMT

CourierNewPSMT

门洛帕克-粗体

门洛帕克-BOLDITALIC

门洛帕克-斜体

门洛帕克正规

即:

.ultraLight

如果你只使用数字,那么 HelveticaNeue 也是等宽,它不会动摇但是有问题。使用此字体前请先阅读comments below this answer

即:

// no shaking
yourLabel.font = UIFont(name: "Menlo-Regular", size: 19)