Подтвердить что ты не робот

Swift - настройка fontSize в соответствии с шириной макета (программно)

Я искал что-то, чтобы динамически настроить мой fontSize, чтобы он соответствовал ширине моего макета. Но все ответы, которые я могу найти, это либо использовать:

label.adjustsFontSizeToFitWidth = true

Что работает. Но только если у меня нет setTranslatesAutoresizingMaskIntoConstraints, установленного в false.

Обратите внимание, что я не использую раскадровки. Чтобы иметь полный контроль над моими другими ограничениями, мне нужна эта строка:

label.setTranslatesAutoresizingMaskIntoConstraints(false)

Итак, как я могу настроить размер шрифта в соответствии с шириной без использования раскадровки и когда я не могу использовать adjustsFontSizeToFitWidth.

После того, как я выясню, как настроить размер шрифта в соответствии с шириной. Мне также нужно настроить высоту макета, чтобы он соответствовал размеру шрифта. По всей видимости, есть документация, но, если вам также известно ответ на этот вопрос, мы будем очень благодарны.

Заранее спасибо

4b9b3361

Ответ 1

Попробуйте выполнить следующие команды для своей метки:

label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.2

И попробуйте изменить строки метки на 0 и 1 (проверьте оба варианта):

label.numberOfLines = 0 // or 1

Ответ 2

Диапазон MinimumScaleFactor - от 0 до 1. Таким образом, мы устанавливаем MinimumScaleFactor относительно нашего размера шрифта следующим образом

Цель С

[lb setMinimumScaleFactor:10.0/[UIFont labelFontSize]]; lb.adjustsFontSizeToFitWidth = YES;

Swift 3.0

lb.minimumScaleFactor = 10/UIFont.labelFontSize lb.adjustsFontSizeToFitWidth = true

Ответ 3

Я не знаю, полностью ли это ответит на ваш вопрос, но вы можете использовать это расширение для расчета ваших собственных размеров шрифта, чтобы они соответствовали.

extension String {
   func height(constrainedBy width: CGFloat, with font: UIFont) -> CGFloat {
       let constraintSize = CGSize(width: width, height: .max)
       let boundingBox = self.boundingRectWithSize(constraintSize, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

       return boundingBox.height
   }

   func width(constrainedBy height: CGFloat, with font: UIFont) -> CGFloat {
       let constrainedSize = CGSize(width: .max, height: height)
       let boundingBox = self.boundingRectWithSize(constrainedSize, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

       return boundingBox.width
   }
}

Ответ 4

Я просто сделал то, что тебе нужно, отлично работает! (Программно ТОЛЬКО) - Мы устанавливаем большой размер шрифта на ярлык, чтобы повторно масштабировать его до идеального размера шрифта.

self.label.font = UIFont(name: "Heiti TC", size: 60)
self.label.numberOfLines = 0
self.label.minimumScaleFactor = 0.1
self.label.baselineAdjustment = .alignCenters
self.label.textAlignment  = .center

Если вы используете AutoLayout, выполните этот код в viewDidLayoutSubviews (после того, как макет был выложен).

Ваш, Roi

Ответ 5

У меня была похожая проблема с использованием UILabel внутри UITableViewCell, и моя ячейка также динамически корректировала их высоту (обратитесь к этому, если вы хотите узнать больше о динамической высоте ячейки: https://www.raywenderlich.com/129059/self-sizing -table-view-cell)

И что бы я ни делал для минимального масштаба шрифта, это не сработало. Оказывается, чтобы эта функция работала, вы также должны установить для свойства "Разрыв строки" значение "Усеченный хвост", "Средний" или "Голова". Если у вас есть Word Wrap или Character Wrap, он не будет динамически уменьшать ваш шрифт UILabel (у меня был создан специальный шрифт с названием: Title 2).

Надеюсь, что это помогает кому-то другому, пытающемуся понять это.

Вот скриншот моих свойств UILabel:

enter image description here

Ответ 6

Здесь взломанное решение:

var size: CGFloat = 20

    while titleLabel.frame.width > containerView.frame.width {

        titleLabel.font = UIFont.systemFont(ofSize: size)
        titleLabel.sizeToFit()
        size -= 1

    }

Ответ 7

Swift 4 преобразование выше:

extension String
{
    func height(constrainedBy width: CGFloat, with font: UIFont) -> CGFloat
    {
        let constraintSize = CGSize(width: width, height: .greatestFiniteMagnitude)
        let boundingBox = self.boundingRect(with: constraintSize, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil)

        return boundingBox.height
    }

    func width(constrainedBy height: CGFloat, with font: UIFont) -> CGFloat
    {
        let constrainedSize = CGSize(width: .greatestFiniteMagnitude, height: height)
        let boundingBox = self.boundingRect(with: constrainedSize, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil)

        return boundingBox.width
    }
}

Ответ 8

Из-за отсутствия репутации я добавляю ответ на комментарий пользователя25. если вы хотите изменить размер шрифта, чтобы он соответствовал содержанию, вы можете сделать что-то подобное в viewDidLayoutSubviews() (50.0 - это размер шрифта, установленный в раскадровке в моем случае.)

        if let tw = totalWidth, tw < safeAreaWidth {
            let fontSize: CGFloat = 50.0 * safeAreaWidth / tw
            hourLabel.font = UIFont(name: "Menlo-Bold", size: fontSize)
        }