web-dev-qa-db-fra.com

Comment calculer la taille d'iOS 11 dans différentes orientations?

Je calcule itemSize en fonction de la zone de sécurité pour UICollectionView avec défilement horizontal et mise en page personnalisée.

image

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?

15
bogmila

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:

 enter image description here

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.

11
jonaszmclaren

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.

0
GK100