2015-04-02 11 views
10

Ich habe this tutorial bei der Implementierung von benutzerdefinierten Ansicht Controller-Übergänge in iOS 8 mit UIPresentationController verfolgt, und bis jetzt macht alles Sinn, aber ich kann nicht scheinen, meine View-Controller die richtige Größe zu bekommen.Warum wird meine View-Controller-Größe nicht mit frameOfPresentedViewInContainerView definiert?

In diesem Tutorial, sie habe den folgenden Code:

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() 
    } 
} 

ich alles verstehen, mit Ausnahme von frameOfPresentedViewInContainerView. Das gibt eine Größe zurück, aber, wenn ich presentedView().frame = frameOfPresentedViewInContainerView() in containerViewWillLayoutSubviews entferne, funktioniert es nicht. Warum muss ich diese Zeile haben? Sie würden denken, die Funktion selbst wäre ausreichend, sonst würde ich einfach eine zufällige Größe in der containerViewWillLayoutSubviews Methode implementieren.

Antwort

0

Sie benötigen diese Zeile nur, wenn der dargestellte Ansichtsrahmen beim Rotieren des Bildschirms aktualisiert werden soll.

3

Die frameOfPresentedViewInContainerView von UIKit verwendet wird, um die anfängliche presentedView des Rahmens zu erhalten, die dann zu einem Animator übergeben wird (zu UIViewControllerAnimatedTransitioning Protokoll entspricht), so dass es die Zielposition der dargebotenen Ansicht weiß, wann eine Animation einrichten. Nachdem die präsentierende Animation beendet und die Präsentation beendet ist, kann sich der Bildschirm oder einer der übergeordneten Ansichtscontroller aufgrund einer Rotation oder einer Größenklassenänderung immer noch in der Größe ändern. Die UIPresentationController-Instanz hat die Möglichkeit, auf diese Änderungen in der Methode containerViewWillLayoutSubviews zu reagieren und die presentedView entsprechend anzupassen. Der Presentation Controller ist also immer dafür verantwortlich, das Layout für die dargestellte Ansicht zu bestimmen, aber er teilt UIKit zunächst mit, was der Frame ist, damit der Animator diese Informationen verwenden kann, aber danach setzt der Präsentations-Controller den Frame auf die präsentierte Ansicht direkt.