Как определить изменения размера динамического шрифта из настроек iOS?
Внутренние настройки → общий → размер текста, после изменения размера текста мне придется выйти из собственного приложения, чтобы размеры были применены к
[UIFont preferredFontForTextStyle:..]
Есть ли делегат или уведомление для уведомления моего приложения о повторном применении новых размеров?
Обновление: я пробовал следующее, но интересно, размер шрифта будет применяться после я BG и запустить приложение TWICE.
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fromBg:) name:UIApplicationDidBecomeActiveNotification object:nil];
}
-(void) fromBg:(NSNotification *)noti{
self.headline1.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
self.subHeadline.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];
self.body.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
self.footnote.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote];
self.caption1.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1];
self.caption2.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2];
// [self.view layoutIfNeeded];
}
Ответы
Ответ 1
Вы слушаете Уведомление об изменении размера на UIContentSizeCategory.
Swift 3.0: NSNotification.Name.UIContentSizeCategoryDidChange
Swift 4.0 или более поздняя UIContentSizeCategory.didChangeNotification
: UIContentSizeCategory.didChangeNotification
Ответ 2
С Swift 5 и iOS 12 вы можете выбрать одно из трех следующих решений для решения вашей проблемы.
# 1. Использование UIContentSizeCategoryAdjusting
adjustsFontForContentSizeCategory
свойство
UILabel
, UITextField
и UITextView
соответствуют протоколу UIContentSizeCategoryAdjusting
и поэтому имеют свойство экземпляра, называемое adjustsFontForContentSizeCategory
. adjustsFontForContentSizeCategory
имеет следующее объявление:
Логическое значение, указывающее, будет ли объект автоматически обновлять свой шрифт при изменении категории размера содержимого устройства.
var adjustsFontForContentSizeCategory: Bool { get set }
Реализация UIViewController
ниже, показывает, как обнаруживать и реагировать на динамические изменения размера шрифта в настройках iOS с помощью adjustsFontForContentSizeCategory
:
import UIKit
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
label.numberOfLines = 0
label.font = .preferredFont(forTextStyle: UIFont.TextStyle.body)
label.adjustsFontForContentSizeCategory = true
view.addSubview(label)
// Auto layout
label.translatesAutoresizingMaskIntoConstraints = false
let horizontalConstraint = label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
let verticalConstraint = label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
let widthConstraint = label.widthAnchor.constraint(equalToConstant: 300)
NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint])
}
}
# 2. Использование didChangeNotification
типа UIContentSizeCategory
didChangeNotification
UIContentSizeCategory
имеет свойство типа с именем didChangeNotification
. didChangeNotification
имеет следующую декларацию:
Размещается, когда пользователь изменяет предпочтительный размер контента.
static let didChangeNotification: NSNotification.Name
Это уведомление посылается, когда значение в preferredContentSizeCategory
изменения свойств. Словарь userInfo уведомления содержит ключ newValueUserInfoKey
, который отражает новый параметр.
Реализация UIViewController
ниже показывает, как обнаруживать и реагировать на динамические изменения размера шрифта в настройках iOS с помощью didChangeNotification
:
import UIKit
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
label.numberOfLines = 0
label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body)
view.addSubview(label)
// Register for 'UIContentSizeCategory.didChangeNotification'
NotificationCenter.default.addObserver(self, selector: #selector(preferredContentSizeChanged(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil)
// Auto layout
label.translatesAutoresizingMaskIntoConstraints = false
let horizontalConstraint = label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
let verticalConstraint = label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
let widthConstraint = label.widthAnchor.constraint(equalToConstant: 300)
NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint])
}
@objc func preferredContentSizeChanged(_ notification: Notification) {
label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body)
/* perform other operations if necessary */
}
}
# 3. Использование UITraitCollection
preferredContentSizeCategory
недвижимость
UITraitCollection
имеет свойство preferredContentSizeCategory
. preferredContentSizeCategory
объект preferredContentSizeCategory
имеет следующее объявление:
Опция изменения размера шрифта, предпочитаемая пользователем.
var preferredContentSizeCategory: UIContentSizeCategory { get }
С динамическим типом пользователи могут попросить приложения отображать текст, используя шрифты, которые больше или меньше нормального размера шрифта, определенного системой. Например, пользователь с нарушениями зрения может запросить больший размер шрифта по умолчанию, чтобы было легче читать текст. Используйте значение этого свойства для запроса объекта UIFont
который соответствует запрашиваемому пользователем размеру.
Реализация UIViewController
ниже, показывает, как обнаруживать и реагировать на динамические изменения размера шрифта в настройках iOS с помощью preferredContentSizeCategory
:
import UIKit
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
label.numberOfLines = 0
label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body)
view.addSubview(label)
// Auto layout
label.translatesAutoresizingMaskIntoConstraints = false
let horizontalConstraint = label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
let verticalConstraint = label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
let widthConstraint = label.widthAnchor.constraint(equalToConstant: 300)
NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint])
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if previousTraitCollection?.preferredContentSizeCategory != traitCollection.preferredContentSizeCategory {
self.label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body)
/* perform other operations if necessary */
}
}
}
Источники: