根据自动布局更改 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
就可以了。应该很粗糙,但对你来说已经足够了,而且实施起来更容易和更快。
更新
忘记说了。我谈到了你的具体例子。行为取决于 numberOfLines
和 lineBreakMode
。使第一个 != 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 示例,上面的代码片段。你可以参考一下。
我在 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
就可以了。应该很粗糙,但对你来说已经足够了,而且实施起来更容易和更快。
更新
忘记说了。我谈到了你的具体例子。行为取决于 numberOfLines
和 lineBreakMode
。使第一个 != 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 示例,上面的代码片段。你可以参考一下。