自动布局在adjustsFontSizeToFitWidth 与fixedNumberOfLines 一起使用之前计算大小
Posted
技术标签:
【中文标题】自动布局在adjustsFontSizeToFitWidth 与fixedNumberOfLines 一起使用之前计算大小【英文标题】:Autolayout calculates size before adjustsFontSizeToFitWidth is used with fixedNumberOfLines 【发布时间】:2018-12-06 10:01:01 【问题描述】:似乎当adjustsFontSizeToFitWidth = true
并且您将numberOfLines
设置为常量(我使用2)时,当自动布局计算UILabel 的大小时,它使用标签的font
属性上设置的字体大小,而不是布局时调整的字体大小。当我增加字体大小时,标签框架的高度会增加,但显示的字体大小保持不变(因为它被限制为 2 行并且它的边被固定到它的父视图)。
我的 hacky 解决方案是以某种方式找到最大的字体大小,它可以完全填满标签框架的宽度,同时仍然适合 2 行,然后将字体大小设置为该大小,这样就不会发生自动缩小。
有没有办法告诉自动布局在计算大小之前缩小文本?
【问题讨论】:
【参考方案1】:我以前见过类似的问题,基本答案似乎是:
不,自动布局不会改变具有固定行数的
UILabel
和adjustsFontSizeToFitWidth = true
的高度。
一种解决方法:
不要为您的标签设置adjustsFontSizeToFitWidth = true
创建第二个具有相同约束的隐藏标签,然后做设置adjustsFontSizeToFitWidth = true
并设置.minimumScaleFactor
计算隐藏标签的实际系统调整字体大小,并使用该值设置可见标签的字体大小
例子:
@IBOutlet var myLabelHidden: UILabel!
@IBOutlet var myLabelVisible: UILabel!
func getActualFontSize(_ forLabel: UILabel) -> CGFloat
guard let labelText = forLabel.text else
return 0.0
let labelContext = NSStringDrawingContext()
labelContext.minimumScaleFactor = forLabel.minimumScaleFactor
let attString = NSAttributedString(string: labelText, attributes: [NSAttributedStringKey.font: forLabel.font])
_ = attString.boundingRect(with: forLabel.frame.size,
options: [.usesFontLeading, .usesLineFragmentOrigin],
context: labelContext)
let actualFontSize = forLabel.font.pointSize * labelContext.actualScaleFactor
return actualFontSize
override func viewDidLayoutSubviews()
super.viewDidLayoutSubviews()
var fs = getActualFontSize(myLabelHidden)
// font sizing seems to be most accurate when
// rounded down to a single decimal place
fs = (fs * 10.0).rounded(.down) / 10.0
myLabelVisible.font = myLabelVisible.font.withSize(fs)
override func viewDidLoad()
super.viewDidLoad()
myLabelHidden.text = "This should adjust the font size to fit."
myLabelVisible.text = myLabelHidden.text
myLabelHidden.isHidden = true
【讨论】:
以上是关于自动布局在adjustsFontSizeToFitWidth 与fixedNumberOfLines 一起使用之前计算大小的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 8 中如何在不使用自动布局的情况下布局 UITableViewCell?
出队的 UITableViewCell 在滚动之前布局不正确(使用自动布局)