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

Как определить изменения размера динамического шрифта из настроек 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];

}
4b9b3361

Ответ 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 */
        }
    }

}

Источники: