Autolayout вычисляет размер, прежде чем AdjustTFizeSizeToFitWidth используется с fixedNumberOfLines - PullRequest
0 голосов
/ 06 декабря 2018

Кажется, когда adjustsFontSizeToFitWidth = true и у вас numberOfLines установлена ​​постоянная (я использовал 2), когда Auto Layout вычисляет размер UILabel, он использует размер шрифта, установленный в свойстве font метки, вместоразмера шрифта, к которому он настроен, когда выложен.Когда я увеличиваю размер шрифта, высота рамки метки увеличивается, но отображаемый размер шрифта остается прежним (поскольку он ограничен 2 строками, а его стороны прикреплены к его суперпредставлению).

Мое хакерское решение -каким-то образом найти самый большой размер шрифта, который будет полностью заполнять ширину рамки метки, в то же время помещаясь в 2 строки, а затем установить размер шрифта таким образом, чтобы не происходило автоматическое сжатие.

Есть лиспособ сказать Auto Layout уменьшить текст перед вычислением размера?

1 Ответ

0 голосов
/ 06 декабря 2018

Я уже видел подобные вопросы раньше, и основной ответ выглядит так:

Нет, Autolayout не изменит высоту UILabel с фиксированным номеромстрок и adjustsFontSizeToFitWidth = true.

Один обходной путь:

  • Не не набор adjustsFontSizeToFitWidth = true для вашей метки
  • Создатьвторую, скрытую метку с теми же ограничениями, и do установите 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

}
...