изменить размер шрифта в UILabel на основе автоматического макета (swift) - PullRequest
1 голос
/ 16 октября 2019

У меня есть UILabel внутри UINavigationBar. Я хочу увеличить размер шрифта этой метки в зависимости от высоты navigationBar. Когда navigationBar большой, я хочу, чтобы размер шрифта был больше, а когда я прокручиваю и navigationBar сокращается, я хочу, чтобы размер шрифта уменьшился.

Что у меня так далеко (inside 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 в зависимости от высоты navigationBar? Возможно ли это с автоматической разметкой?

Ответы [ 4 ]

2 голосов
/ 16 октября 2019

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

Поэтому вы должны сделать это вручную, изменив шрифт из-за изменения размера (не забудьте проверить размеры результатас UILabel не NSString.sizeWithFont:: результаты будут немного отличаться).

Вы можете попытаться установить ограничения вашего контейнера, чтобы сохранить соотношение сторон UILabel. Таким образом, когда вы уменьшите высоту, ширина тоже будет уменьшена, и UILabel.adjustsFontSizeToFitWidth будет работать. Должно быть грубым, но достаточно в вашем случае и намного проще и быстрее для реализации.

ОБНОВЛЕНИЕ

Забыл упомянуть. Я говорил о вашем конкретном примере. Поведение зависит от numberOfLines и lineBreakMode. Если для первого! = 1 и второго что-то наподобие .byTruncatingTail (значение по умолчанию), отобразится значение, близкое к необходимому (но, например, будет перенос слов, когда ширины недостаточно - в то время как вы вообще не ожидаете перенос).

1 голос
/ 16 октября 2019

Вы можете попробовать фрагмент ниже.

        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)

Это даст вам желаемый результат. Я добавил GIF-пример с приведенным выше фрагментом на игровой площадке XCode. Вы можете сослаться на это.

enter image description here

0 голосов
/ 16 октября 2019

В каком методе вы изменяете высоту панели навигации, вставьте это здесь:

height = self.navigationController?.navigationBar.frame.height
dateLabel.font = .boldSystemFont(ofSize: height / 3)

Обратите внимание, что я только что набрал его здесь, может содержать опечатку

0 голосов
/ 16 октября 2019

Да, этого можно добиться, установив следующие свойства в Инспекторе атрибутов.

  • установите для Autoshrink минимальный размер шрифта
  • Укажите минимальный размер шрифта

Пожалуйста, обратитесь к приложенному снимку экрана для справки. UILabel properties for Autoshrink

...