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];
}
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
Avec Swift 5 et iOS 12, vous pouvez choisir l'une des trois solutions suivantes afin de résoudre votre problème.
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])
}
}
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 */
}
}
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: