2014-09-12 18 views
8

In ios 7 e precedenti, stavo aggiornando i limiti di PresentationController.view.superview per personalizzare la dimensione del controller di visualizzazione presentato, ma sembra che non sarebbe il caso in meno 8 altro. Poiché non è possibile impostare superview sul controller della vista (restituire nil quando si tenta di richiamarlo nel debugger).ios 8 modifica la dimensione del controller vista/modal view

Qualche suggerimento su come aggiornare le dimensioni del controller di visualizzazione presentato? Questo sarebbe usato per la transizione di presentazione personalizzata.

risposta

11

Nel caso qualcuno si imbattesse in questo più tardi, ecco come lo risolvo.

Sottoclasse UIPresentationController e restituisce il frame in frameOfPresentedViewInContainerView. Inseriscilo nel transitioningDelegate che crei per ViewController presentato.

Oppure, è possibile impostare il frame finale per PresentationView in AnimateTransition :, che appartiene all'oggetto animatore creato per transitioningDelegate. Tuttavia, questo è il vecchio modo di iOS 7 per farlo. Dal momento che Apple presenta UIPresentationController, qualsiasi modifica di dimensione/cornice dovrebbe essere fatta lì, che è il metodo precedente che ho menzionato.

Ecco alcune informazioni aggiuntive che potrebbero non essere direttamente correlate alla risoluzione del problema.

Per quelli di voi che non hanno mai messo le mani sulla api di transizione del controller di visualizzazione apple, proprio come me, ecco i passaggi.

  1. Crea YourTransitioningDelegate, che conforma UIViewControllerTransitioningDelegate. Qui, in generale, è necessario impostare tre elementi, PresentationController, PresentedAnimationController, RespintoAnimationController.

  2. Crea YourTransitionAnimator, che conforma UIViewControllerAnimatedTransitioning. Qui, due funzioni devono essere sovrascritte, transitionDuration e animateTransition (qui è dove si svolge tutta l'animazione, aggiungendo/rimuovendo e animando la PresentationView. Chiamate completeTransition su transitionContext per terminare l'animazione).

  3. Sottoclasse UIPresentationController. Dipende da ogni singola esigenza, puoi fare un sacco di cose qui. Ho appena aggiunto un dimmingView e modificato il frame di PresentationViewontroller.

  4. Infine, agganciare le cose prima di presentare il controller di visualizzazione, che sta modificando il modalPresentationStyle per essere personalizzato e impostare il delegato di transizione.

cose che ho trovato veramente utile, due 2014 video WWDC ("Visualizza controllori progressi" e "Uno sguardo dentro i controller di presentazione") e il progetto di esempio di Apple (LookInside-photoEditingApp).

+0

è l'unico modo per fare questo compatibile con iOS 7 e iOS 8 per aggiungere due metodi completamente separati di presentazione di una vista (con codice corrispondente), a seconda che si tratti di iOS 8 o meno? –

+0

Sì, UIPresentationController è solo iOS 8. –

15

Credo che la segue è più facile e funziona in 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]; 
+0

Se lo stile di transizione predefinito è tutto ciò che serve, allora si. – Xing

+0

preferredContentSize sta funzionando bene per me. Ma ho bisogno di cambiare la mia posizione in iOS 8. Quale proprietà devo usare? –

+1

Questa è la risposta corretta! – pixelfreak

1

Invece di sottoclassi è possibile utilizzare la proprietà preferredContentSize

- (void)viewDidLoad { 
    [super viewDidLoad]; 

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