Вызывать следующий метод каждый раз после изменения размера UILabel.
func labelSizeHasBeenChangedAfterPinch(_ label:UILabel, currentSize:CGSize){
let MAX = 25
let MIN = 8
let RATE = -1
for proposedFontSize in stride(from: MAX, to: MIN, by: RATE){
let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
let attribute = [NSAttributedString.Key.font:UIFont.systemFont(ofSize: CGFloat(proposedFontSize))]
// let context = IF NEEDED ...
let rect = NSString(string: label.text ?? "").boundingRect(with: currentSize, options: options, attributes: attribute, context: nil)
let labelSizeThatFitProposedFontSize = CGSize(width: rect.width , height: rect.height)
if (currentSize.height > labelSizeThatFitProposedFontSize.height) && (currentSize.width > labelSizeThatFitProposedFontSize.width){
DispatchQueue.main.async {
label.font = UIFont.systemFont(ofSize: CGFloat(proposedFontSize))
}
break
}
}
}
Используйте фильтр, тот способ, которым можно поместить тот же самый повторный код в фильтр и сохранить контроллеры сфокусированными на реальном действии.
Вы могли бы попытаться определить это как фильтр вместо того, чтобы копировать код.
Я соглашаюсь с другими предложений фильтра, сделали. Если это не работает на Вас, Вы могли бы определить beforeInterceptor на своем контроллере для уменьшения некоторого дублирования также.
Я думаю с помощью beforeInterceptor, является соответствующим. И дайте некоторый взгляд на этот плагин JSecurity. Для аутентификации пользователя jsecurity плагин очень полезно.