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

change font size in UILabel based on auto layout (swift)

我在 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 的字体大小?这可以使用自动布局吗?

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

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

您可以尝试设置容器的约束以保持 UILabel 的纵横比。这样,当您减小高度时,宽度也会减小,UILabel.adjustsFontSizeToFitWidth 就可以了。应该很粗糙,但对你来说已经足够了,而且实施起来更容易和更快。

更新

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

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

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

请参考附件截图。

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

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

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

您可以试试下面的代码片段。

        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 playground 中添加了一个 gif 示例,上面的代码片段。你可以参考一下。