10
votes

iOS 8 Modifier la taille du contrôleur de vue présenté / modal

dans iOS 7 et auparavant, je mettais à jour les limites de présentationViewController.View.superview à la taille d'une taille du contrôleur de vue présenté, mais il semble que cela ne soit plus le cas dans iOS 8. Comme il n'ya pas de superview ne peut être défini sur le contrôleur d'affichage (renvoyer NIL lorsque vous essayez de l'appeler dans le débogueur).

Toute suggestion Comment mettre à jour la taille du contrôleur d'affichage présenté? Ceci serait utilisé pour la transition de présentation personnalisée.


1 commentaires

J'ai fait un github repo bonsaicontroller juste pour cela.


3 Réponses :


13
votes

Si quiconque l'exécute plus tard, voici comment je le résolvez.

Sous-classe de l'UIPRESENTATIONCONTROLLER ET RETOURNEZ LE CADRE DANS LE CADREFPRESENTEDVIEWInServieView. Nourrissez-les dans la transitionDelegate que vous créez pour la présentationViewController.

Ou, vous pouvez définir la trame finale de la vision présentée dans l'animatetransition:, qui appartient à l'objet d'animateur que vous avez créé pour la transitionDelegate. Cependant, c'est l'ancienne façon de le faire. Étant donné que Apple introduit uipresentationController, toutes les modifications de taille / cadre doivent être effectuées là-bas, qui correspond à la méthode précédente que j'ai mentionnée.

Voici quelques informations supplémentaires qui peuvent ne pas être directement liées à la résolution du problème.

Pour ceux d'entre vous qui n'ont jamais eu la main sur l'API de transition du contrôleur Apple View, tout comme moi auparavant, voici les étapes.

  1. Créez votretransitionDelegate, qui conforme à UIViewControllerTransitioningDelegate. Ici, généralement trois choses doivent être définies, présentationContrôleur, présentationAnimationController, licenciédanimationController.

  2. Créez votretranstionnanimator, qui conforme à UIViewControléranimatedtransitioning. Ici, deux fonctions doivent être remplacées par la transition, la transition et l'animatetransition (c'est là que toute l'animation se produit, ajoutant / supprimant et animer la vision présentée. Faites appel à compléter sur TransitionContext pour mettre fin à l'animation).

  3. UIPRESENTATION SOUSCLASSENTATIONCONTATION. Dépend de chaque besoin de besoins, vous pouvez faire une tonne de choses ici. Je viens d'ajouter un gradmingview et j'ai changé le cadre de présentationViewController.

  4. Enfin, crochet de choses avant de présenter le contrôleur d'affichage, qui modifie le modalpresentationStyle pour être personnalisé et définir le délégué de transition.

    Des choses que j'ai trouvées vraiment utiles, deux vidéos WWDC 2014 ("Visualiser les avancées des contrôleurs" et "Contrôleurs de présentation de la présentation") et le projet d'exemple d'Apple (LookInSide-photoditApp).


2 commentaires

Est le seul moyen de rendre cela compatible avec iOS 7 et iOS 8 pour ajouter deux méthodes complètement distinctes de présentation d'une vue (avec code correspondant), selon que c'est ou non iOS 8?


Oui, UipresentationController est uniquement iOS 8.



17
votes

Je suppose que ce qui suit est plus facile et cela fonctionne dans iOS 8:

self.myViewController.modalPresentationStyle = UIModalPresentationFormSheet;
self.myViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

//This will be the size you want
self.myViewController.preferredContentSize = CGSizeMake(822, 549);

[self presentViewController:self.myViewController animated:YES completion:nil];


3 commentaires

Si le style de transition par défaut est tout ce dont vous avez besoin, alors oui.


PreferreDredContSIser fonctionne bien pour moi. Mais je dois changer ma position dans iOS 8. Quelle propriété que je dois utiliser?


Ne fonctionne pas sur iPhone (iOS 8.4), fonctionnera probablement sur l'iPad.



1
votes

au lieu de sous-classement, vous pouvez utiliser la propriété PreferredContSIser

- (void)viewDidLoad {
   [super viewDidLoad];

   self.preferredContentSize = CGSizeMake((self.view.frame.size.width / 100) * 65, (self.view.frame.size.height / 100) * 65);
}


0 commentaires