根据自动布局更改 UILabel 中的字体大小(swift)

Posted

技术标签:

【中文标题】根据自动布局更改 UILabel 中的字体大小(swift)【英文标题】:change font size in UILabel based on auto layout (swift) 【发布时间】:2019-10-16 07:33:10 【问题描述】:

我在 UINavigationBar 中放置了一个 UILabel。 我想根据navigationBar 的高度增加该标签的字体大小。当navigationBar 很大时,我希望字体大小更大,当我滚动并且navigationBar 缩小时,我希望字体大小减小。

到目前为止我得到了什么(在 viewDidLoad 中):

dateLabel.text = "16. Oktober"
dateLabel.font = .boldSystemFont(ofSize: 40)
dateLabel.adjustsFontSizeToFitWidth = true
dateLabel.minimumScaleFactor = 0.5
dateLabel.backgroundColor = .white
dateLabel.numberOfLines = 1
dateLabel.lineBreakMode = .byTruncatingTail
self.navigationController?.navigationBar.addSubview(dateLabel)


dateLabel.translatesAutoresizingMaskIntoConstraints = false
dateLabel.bottomAnchor.constraint(equalTo: (self.navigationController?.navigationBar.bottomAnchor)!, constant: -16).isActive = true
dateLabel.leadingAnchor.constraint(equalTo: redView.trailingAnchor, constant: 16).isActive = true
dateLabel.widthAnchor.constraint(equalToConstant: 200).isActive = true
dateLabel.topAnchor.constraint(equalTo: (self.navigationController?.navigationBar.topAnchor)!, constant: 16).isActive = true

我设置了约束,以便 dateLabel 根据 navigationBar 的高度收缩(如您在屏幕截图中所见)。 但是dateLabel的字体大小没有变化。

屏幕截图显示了我滚动时navigationBar 的不同状态。

如何根据navigationBar 的高度减小dateLabel 的字体大小?这可以通过自动布局实现吗?

【问题讨论】:

【参考方案1】:

UILabel 没有自动减小字体以适应内容大小或高度的方法 - 只有宽度。

因此,您应该根据大小更改手动更改字体(不要忘记使用UILabel 而不是NSString.sizeWithFont: 测试结果大小:结果会略有不同)。

您可以尝试设置容器的约束以保持UILabel 的纵横比。这样,当您减小高度时,宽度也会减小,UILabel.adjustsFontSizeToFitWidth 会起作用。应该是粗略的,但在你的情况下就足够了,而且更容易和更快地实现。

更新

忘了说。我谈到了你的具体例子。行为取决于numberOfLineslineBreakMode。使第一个 != 1 和第二个像 .byTruncatingTail (默认值)将显示接近必要(但是,例如,当宽度不够时会换行 - 而您根本不希望换行)。

【讨论】:

【参考方案2】:

你可以试试下面的sn-p。

        dateLabel.text = "16. Oktober"
        dateLabel.font = .boldSystemFont(ofSize: 40)
        dateLabel.adjustsFontSizeToFitWidth = true
        dateLabel.minimumScaleFactor = 0.5
        dateLabel.backgroundColor = .white
        dateLabel.numberOfLines = 0
        dateLabel.lineBreakMode = .byClipping
        dateLabel.backgroundColor = .orange
        dateLabel.textAlignment = .center
        self.container.addSubview(dateLabel)

它会给你想要的结果。我在 Xcode 操场上添加了上面 sn-p 的示例 gif。你可以参考一下。

【讨论】:

【参考方案3】:

是的,可以通过设置来实现 属性检查器中的以下属性。

将自动缩小设置为最小字体大小 提供最小字体大小

请参阅随附的屏幕截图以供参考。

【讨论】:

【参考方案4】:

你用什么方法改变导航栏的高度,把它放在那里:

height = self.navigationController?.navigationBar.frame.height
dateLabel.font = .boldSystemFont(ofSize: height / 3)

请注意,我只是在这里输入的,可能有错字

【讨论】:

您也可以使用该字体大小计算。例如:2.5*CGFloat.squareRoot(height) 可能会更好。

以上是关于根据自动布局更改 UILabel 中的字体大小(swift)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中根据 dp(不是点数)设置 UILabel 字体大小,就像只有自动布局的 android

自动布局 - UILabel 在方向更改后宽度缩小,这是由另一个应该自动调整字体大小的 UILabel 引起的

如何使用自动布局在 iOS 中根据文本长度更改 UILabel 宽度

两个具有不同字体大小的自动布局 UILabel:文本顶部对齐

多行 UILabel 没有正确换行 [重复]

如何根据标签可用的高度调整 UILabel 字体大小