Je calcule itemSize en fonction de la zone de sécurité pour UICollectionView avec défilement horizontal et mise en page personnalisée.
Mais pour iPhone X, la zone de sécurité a une taille différente pour une orientation différente. Ma question est la suivante: comment calculer la taille de la zone de sécurité pour l'orientation paysage dans la fonction viewWillTransition? Ou comment est-il possible de se passer de ce calcul?
MODIFIER
Pour obtenir la taille d'une zone sécurisée sans créer de vues supplémentaires, utilisez ceci:
view.safeAreaLayoutGuide.layoutFrame.size
Si vous voulez utiliser la méthode viewWillTransition
, vous pouvez utiliser ceci:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
// Before rotation
print(view.safeAreaLayoutGuide.layoutFrame.size)
coordinator.animate(alongsideTransition: { (context) in
// During rotation
}) { (context) in
// After rotation
print(self.view.safeAreaLayoutGuide.layoutFrame.size)
}
}
Dans le bloc d'achèvement, vous obtiendrez la taille souhaitée. Notez cependant que ce code s'appellera après la rotation.
Réponse originale
Solution utilisant UIView supplémentaire:
Ce que j’ai fait est de créer une UIView
et de l’épingler avec la constante 0 dans Guides de zone sûre, afin qu’elle corresponde toujours à la taille de la zone sécurisée:
J'ai créé un @IBOutlet
de cette UIView
et dans viewDidLayoutSubviews()
, vérifiez la taille:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
print(containerView.frame.size)
}
Après la rotation, j'obtiens aussi la taille mise à jour de cette UIView.
Utilisez la collectionView de UICollectionViewDelegateFlowLayout (_: layout: sizeForItemAt :). Fonctionne comme un charme . Définir la taille dans le bloc de complétion de coordinator.animate (à côté de Transition: complétion :) dans viewWillTransition (à: avec :) ne fonctionnait pas pour moi car l'animation de taille se produit après la fin de l'animation d'orientation qui a l'air bizarre.