2015-04-02 13 views
10

Ho seguito this tutorial sull'implementazione di transizioni personalizzate del controller di visualizzazione in iOS 8 con UIPresentationController, e finora tutto ha senso, ma non riesco a ottenere il mio controller di visualizzazione della giusta dimensione.Perché la definizione della mia dimensione del controller di visualizzazione con frameOfPresentedViewInContainerView non la rende tale dimensione?

In questo tutorial, essi hanno il seguente codice:

class OverlayPresentationController: UIPresentationController { 
    let dimmingView = UIView() 

    override init(presentedViewController: UIViewController!, presentingViewController: UIViewController!) { 
    super.init(presentedViewController: presentedViewController, presentingViewController: presentingViewController) 
    dimmingView.backgroundColor = UIColor(white: 0.0, alpha: 0.5) 
    } 

    override func presentationTransitionWillBegin() { 
    dimmingView.frame = containerView.bounds 
    dimmingView.alpha = 0.0 
    containerView.insertSubview(dimmingView, atIndex: 0) 

    presentedViewController.transitionCoordinator()?.animateAlongsideTransition({ 
     context in 
     self.dimmingView.alpha = 1.0 
    }, completion: nil) 
    } 

    override func dismissalTransitionWillBegin() { 
    presentedViewController.transitionCoordinator()?.animateAlongsideTransition({ 
     context in 
     self.dimmingView.alpha = 0.0 
    }, completion: { 
     context in 
     self.dimmingView.removeFromSuperview() 
    }) 
    } 

    override func frameOfPresentedViewInContainerView() -> CGRect { 
    return containerView.bounds.rectByInsetting(dx: 30, dy: 30) 
    } 

    override func containerViewWillLayoutSubviews() { 
    dimmingView.frame = containerView.bounds 
    presentedView().frame = frameOfPresentedViewInContainerView() 
    } 
} 

ho capito tutto, tranne che per frameOfPresentedViewInContainerView. Che restituisce una dimensione, ma, se rimuovo presentedView().frame = frameOfPresentedViewInContainerView() in containerViewWillLayoutSubviews non funziona. Perché devo avere quella linea? Si potrebbe pensare che la funzione stessa sarebbe sufficiente, altrimenti implementerei solo una dimensione casuale nel metodo containerViewWillLayoutSubviews.

risposta

0

È necessario disporre di tale linea se si desidera che il riquadro di visualizzazione presentato venga aggiornato quando lo schermo ruota.

3

Il frameOfPresentedViewInContainerView viene utilizzato da UIKit per ottenere il frame PresentationView iniziale che viene poi passato a un animatore (conforme al protocollo UIViewControllerAnimatedTransitioning) in modo che esso conosca la posizione di destinazione della vista presentata quando si imposta un'animazione. Dopo che l'animazione di presentazione è terminata e la presentazione è visualizzata sullo schermo o su uno dei controller della vista principale, è possibile che il ridimensionamento venga modificato a causa di una rotazione o di una modifica della classe di dimensioni. L'istanza di UIPresentationController ha la possibilità di rispondere a queste modifiche nel metodo containerViewWillLayoutSubviews e ridimensionare opportunamente il PresentationView.

In altre parole, il controller di presentazione è sempre responsabile della definizione del layout per la vista presentata, ma inizialmente dice a UIKit qual è il frame in modo che l'animatore possa utilizzare queste informazioni ma dopo di ciò il controller di presentazione imposta il frame su la vista presentata direttamente.

Problemi correlati