根据自动布局更改 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
会起作用。应该是粗略的,但在你的情况下就足够了,而且更容易和更快地实现。
更新
忘了说。我谈到了你的具体例子。行为取决于numberOfLines
和lineBreakMode
。使第一个 != 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 宽度