web-dev-qa-db-fra.com

iOS 8 UIPageViewController Application de contraintes après les transitions

Mon application dispose d'une vue de style tutoriel à volets multiples que les utilisateurs parcourent pour en savoir plus sur l'application. Ceci est très bien implémenté comme décrit dans ce tutoriel . Après l'avoir implémenté pour iOS 7 et 8, je compare leur fonctionnement et trouve des problèmes avec ce dernier - j'utilise Xcode 6 GM ici.

Il semble que UIPageViewController rend les vues une fois la transition terminée. J'ai remplacé les méthodes de délégué pour voir ce qui se passait:

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers
{
   NSLog(@"Frame size before: %@", NSStringFromCGRect([(UIViewController*)pendingViewControllers[0] view].frame));
}

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
   NSLog(@"Frame size after: %@", NSStringFromCGRect([(UIViewController*)previousViewControllers[0] view].frame));
}

Et voici un exemple de sortie:

Frame size before: {{0, 0}, {600, 600}}
Frame size after: {{0, 0}, {320, 568}}

Cela se manifeste comme suit: faites glisser votre doigt vers la gauche pour afficher la vue suivante et notez un espace blanc de 32 points au bas de la nouvelle vue. Une fois la transition terminée, il se met à sa place.

Est-ce un bug dans iOS 8, peut-être? Je suis tout à fait conjectures à ce stade.

64
Aaron Vegh

J'ai compris que vous deviez baser vos contraintes sur la vue et non sur le guide de disposition de votre contrôleur de vue. Cela garantira que votre contrôleur de vue respecte les contraintes que vous avez définies avant la transition dans un PageViewController.

vous pouvez le faire comme suit:

Constraints example

N'oubliez pas de décocher "Contraindre aux marges"

112
Darryl Bayliss

Pour ceux qui ont ce problème, il me semblait que je présentais des vues "par rapport à la marge" (une nouvelle fonctionnalité d'iOS 8).

Au lieu de:

enter image description here

Utilisation:

enter image description here

41
dfickling

Je me bats avec ça depuis quelques jours. 

J'ai essayé de l'implémenter en instanciant la page ViewController à partir du storyboard. Il y avait un redimensionnement définitif en cours. Vérification de la taille du cadre en 

  1. pageViewController: viewControllerAfterViewController
  2. pageViewController: willTransitionToViewControllers
  3. pageViewController: didFinishAnimating: previousViewControllers

La taille de la trame changerait toujours entre les appels à1et3. Parfois avant2et parfois après.

Si vous utilisez également des storyboards, j'ai pu résoudre le problème en extrayant les éléments de l'interface utilisateur de la page dans son propre fichier XIB, en définissant les contraintes dans IB, puis en créant les pages avec un appel àinitWithNibName

Ce n’est pas une réponse complète, mais cela m’a permis de me sentir productif. J'espère que ça aide.

2
widano

Pour moi, la solution consistait à épingler le haut de la table dans Superview: Éditeur -> Épingler -> Top Space To SuperView (iOS8)

1

C'est un bug dans iOS 8 mais j'ai trouvé une solution de contournement:

Ajoutez une vue vide au-dessus de la barre d'état dans votre Storyboard. La hauteur de la vue doit être égale à la valeur y de votre objet en cours de déplacement.

Image of correct constraints

0
AmiiQo