2016-04-07 6 views
6

Ich versuche, einige neue iOS-Programmiermuster zu lernen. Ich habe eine ganze Reihe von UIViewController-Übergangs-APIs gelesen, die in iOS 7 hinzugefügt wurden. Sie sehen cool aus, fühlen sich aber auch ziemlich schwer an für scheinbar einfachere Aufgaben.Den Wert der UIViewController-Übergänge verstehen

Betrachten Sie diesen Anwendungsfall: Ich habe einen benutzerdefinierten Container View-Controller, der "Folien" verwaltet. Es enthält eine Reihe von Dia-View-Controllern, und der Benutzer kann sie durch Tippen auf eine Schaltfläche vorwärts und rückwärts bewegen.

kann ich den Übergang für diese Umsetzung wie folgt:

private func transitionToViewController(viewController: UIViewController, direction: TransitionDirection = .Forward, animated: Bool = true) { 
    currentViewController.willMove(toParentViewController: nil) 
    addChildViewController(viewController) 
    // ... set up frames, other animation prep ... 
    contentContainerView.addSubview(comingView) 
    UIView.animate(duration: 0.5, animations: { 
     // do the animations 
    }) { (finished) in 
     leavingView.removeFromSuperview() 
     self.currentViewController.removeFromParentViewController() 
     viewController.didMove(toParentViewController: self) 
     // final clean up 
    } 
} 

Wie würden die neueren Übergang APIs dies verbessern? Von dem, was ich verstehe, diese APIs sind noch komplizierter, wenn Sie verwenden Ihre eigenen Container View-Controller rollen (siehe custom-container view controller transitions.

Ist der Wert in dem Übergang APIs vor allem für interaktive Übergänge?

Dank für die Klärung

Antwort

7

ich denke, das neu transitioning API (UIViewControllerTransitioningDelegate und Freunde) ist einfach ein letzter Schritt in der Verallgemeinerung der Ansicht Übergänge zwischen den Controllern.

in ersten Versionen von UIKit uns hack the system transition code hatten alle benutzerdefinierten Übergänge zu erhalten überhaupt. Jahre später haben wir Controller Containment, die es ermöglicht, View-Controller als erstklassige Bürger und create our own interactive transitions zu verwalten. Der letzte Schritt besteht darin, eine API mit vollem Funktionsumfang für alle Übergänge zu haben, von denen Sie nur träumen können - das ist die neue Übergangs-API.

Die neue API ermöglicht es, die Übergänge in eigenständige Klassen zu extrahieren. Dadurch ist es endlich möglich, einfach eine Übergangsbibliothek von GitHub herunterzuladen und sie als einfachen Übergangsdelegaten in Ihren bestehenden Code zu stecken. Sie müssen Ihre View-Controller nicht von einer bestimmten Superklasse ableiten, Sie müssen keinen Controller-Container eines Drittanbieters verwenden und müssen keine Erweiterungen für UIKit-Klassen hinzufügen. Jetzt sind die Übergänge endlich auch in UIKit erstklassige Bürger.

+0

Ich stimme zu, dass es viele separate Klassen gibt und auf den ersten Blick sieht die API entmutigend aus. Die Dokumentation von Apple umfasst jedoch alle Bässe und die Menge an Code, die Sie für jede dieser Klassen schreiben müssten, um (zum Beispiel) das Verhalten von "UIAlertController" zu replizieren. –

2

Wie würden die neueren APIs das verändern?

TL; DR Wartbarkeit über Encapsulation, Wiederverwendbarkeit, Testbarkeit.

Kapselung: Die Kommentare zeigen an, dass es eine Logik gibt, die eingerichtet werden muss, und den Status, der mit der Animation verfolgt werden soll. Ihr View-Controller ist wahrscheinlich schon groß genug; Die Übergangslogik irgendwo anders zu platzieren, macht jedes Stück kleiner und daher wartungsfreundlicher.

Wiederverwendbarkeit: Was ist das nächste, was Sie danach tun werden? Richten Sie den Übergang vom Übergang zum Controller sicher ein. Und ist es wahrscheinlich eine Umkehrung dieser Animation? Ziemlich wahrscheinlich. Also kopierst du diesen Code und fügst ihn dort ein, wahrscheinlich. Jetzt hast du zwei Kopien. Eine Kopie mit den Übergängen wäre wartungsfreundlicher. (Beachten Sie auch das Vorhandensein von Pods mit benutzerdefinierten Übergängen, da Wiederverwendbarkeit und Teilbarkeit Hand in Hand gehen.)

Testability: Code in einem schwergewichtigen Ansicht Controller eingebettet ist notorisch schwierig zu testen.Ein benutzerdefinierter Übergang kann isoliert ohne den Status-Overhead der Live-Ansichten getestet werden.

Also für jeden Code, den Sie mehr als einmal betrachten möchten, sind die übergangsweise APIs wahrscheinlich die Mühe wert!