web-dev-qa-db-fra.com

Comment détecter les changements de taille de police dynamique dans les paramètres iOS?

Dans les paramètres intérieurs-> général-> taille du texte, après avoir changé la taille du texte, je devrais quitter ma propre application pour appliquer les tailles

 [UIFont preferredFontForTextStyle:..]

Y a-t-il un délégué ou une notification pour informer mon application de réappliquer les nouvelles tailles?

Mise à jour: j'ai essayé ce qui suit, mais il est intéressant de noter que la taille de la police s'appliquera après avoir BG et lancé l'application DEUX FOIS.

- (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];

}
36
mskw

Vous écoutez la notification de changement de taille sur IContentSizeCategory .

Swift 3.0: NSNotification.Name.UIContentSizeCategoryDidChange

Swift 4.0 ou version ultérieure: UIContentSizeCategory.didChangeNotification

48
Dave DeLong

Avec Swift 5 et iOS 12, vous pouvez choisir l'une des trois solutions suivantes afin de résoudre votre problème.


#1. Utilisation de la propriété UIContentSizeCategoryAdjusting de adjustsFontForContentSizeCategory

UILabel, UITextField et UITextView sont conformes au protocole UIContentSizeCategoryAdjusting et ont donc une propriété d'instance appelée adjustsFontForContentSizeCategory . adjustsFontForContentSizeCategory a la déclaration suivante:

Valeur booléenne indiquant si l'objet met à jour automatiquement sa police lorsque la catégorie de taille de contenu du périphérique change.

var adjustsFontForContentSizeCategory: Bool { get set }

L'implémentation UIViewController ci-dessous montre comment détecter et réagir aux changements de taille de police dynamique dans les paramètres iOS avec 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. Utilisation de la propriété de type UIContentSizeCategory de didChangeNotification

UIContentSizeCategory a une propriété type appelée didChangeNotification . didChangeNotification a la déclaration suivante:

Publié lorsque l'utilisateur modifie le paramètre de taille de contenu préféré.

static let didChangeNotification: NSNotification.Name

Cette notification est envoyée lorsque la valeur de la propriété preferredContentSizeCategory change. Le dictionnaire userInfo de la notification contient la clé newValueUserInfoKey, qui reflète le nouveau paramètre.

L'implémentation UIViewController ci-dessous montre comment détecter et réagir aux changements de taille de police dynamique dans les paramètres iOS avec 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. Utilisation de la propriété UITraitCollection de preferredContentSizeCategory

UITraitCollection possède une propriété appelée preferredContentSizeCategory . preferredContentSizeCategory a la déclaration suivante:

L'option de dimensionnement de police préférée par l'utilisateur.

var preferredContentSizeCategory: UIContentSizeCategory { get }

Avec Dynamic Type, les utilisateurs peuvent demander que les applications affichent du texte en utilisant des polices plus grandes ou plus petites que la taille de police normale définie par le système. Par exemple, un utilisateur ayant une déficience visuelle peut demander une taille de police par défaut plus grande pour faciliter la lecture du texte. Utilisez la valeur de cette propriété pour demander un objet UIFont qui correspond à la taille demandée par l'utilisateur.

L'implémentation UIViewController ci-dessous montre comment détecter et réagir aux changements de taille de police dynamique dans les paramètres iOS avec 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 */
        }
    }

}

Sources:

38
Imanou Petit