自动布局在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】:

我以前见过类似的问题,基本答案似乎是:

不,自动布局不会改变具有固定行数的UILabeladjustsFontSizeToFitWidth = 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 在滚动之前布局不正确(使用自动布局)

无法在情节提要中启用自动布局

在 UITableView 中使用自动布局进行动态单元格布局和可变行高

在 UITableView 中使用自动布局进行动态单元格布局和可变行高