2016-04-07 19 views
6

Sto cercando di imparare alcuni nuovi modelli di programmazione iOS. Ho letto un sacco di API di transizione di UIViewController aggiunte in iOS 7. Sembrano interessanti ma anche abbastanza pesanti per quello che sembra un compito più semplice.Capire il valore delle transizioni UIViewController

Considerare questo caso d'uso: Ho un controller di visualizzazione contenitore personalizzato che gestisce "diapositive". Contiene una serie di controller di diapositive e l'utente può spostarsi avanti e indietro anche toccando un pulsante.

posso realizzare la transizione di questo come segue:

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

Come sarebbero le API più recenti transizione migliorare questo? Da quello che ho capito, queste API sono ancora più complicato da usare se si sta posizionare il proprio controller di vista contenitore (vedi custom-container view controller transitions.

è il valore nelle API transizione per lo più per le transizioni interattive?

Grazie per il chiarimento

risposta

7

Penso che la nuova API transizione (UIViewControllerTransitioningDelegate e gli amici) è semplicemente un passo finale nella generalizzazione di vista transizioni tra i controllori.

nelle prime versioni di UIKit abbiamo dovuto hack the system transition code per ottenere qualsiasi transizioni personalizzate affatto. Anni dopo abbiamo ottenuto il contenimento del controller che ha reso possibile gestire i controller di visualizzazione come cittadini di prima classe e create our own interactive transitions. Il passaggio finale consiste nel disporre di un'API di sistema generale completa per qualsiasi transizione che puoi sognare: questa è la nuova API di transizione.

La nuova API consente di estrarre le transizioni in classi indipendenti. Il che, a sua volta, rende finalmente possibile scaricare una libreria di transizione da GitHub e collegarla al codice esistente come semplice delegato di transizione. Non è necessario derivare i controller di visualizzazione da una particolare superclasse, non è necessario utilizzare un contenitore di controller di terze parti, non è necessario aggiungere estensioni alle classi UIKit. Ora le transizioni sono finalmente cittadini di prima classe anche in UIKit.

+0

Sono d'accordo sul fatto che ci siano molte classi separate coinvolte e a prima vista l'API sembra scoraggiante. Tuttavia, la documentazione di Apple copre tutti i bassi e la quantità di codice che si dovrebbe scrivere per ognuna di quelle classi per (dire) replicare il comportamento di 'UIAlertController' non è molto. –

2

In che modo le nuove API di transizione miglioreranno?

TL; DR manutenibilità tramite incapsulamento, Riusabilità, Testabilità.

Incapsulamento: I commenti indicano che c'è logica da impostare e indicare per tracciare con l'animazione. Il tuo controller di visualizzazione probabilmente è già abbastanza grande; mettere la logica di transizione da qualche altra parte rende ogni pezzo più piccolo e quindi più mantenibile.

Riusabilità: Qual è la prossima cosa che farai dopo questo? Impostare la transizione dal passaggio al controller, senza dubbio. Ed è probabile che sia un'inversione di questa animazione? Abbastanza probabile Quindi copi e incolli questo codice su quel controller e lo inverti lì, probabilmente. Ora hai due copie. Una copia utilizzando le transizioni sarebbe più manutenibile. (Da notare anche l'esistenza di baccelli di transizioni personalizzate, come la riutilizzabilità e la condivisibilità vanno di pari passo.)

Testabilità: codice incorporato in un controller di vista dei pesi massimi è notoriamente difficile da testare.Una transizione personalizzata può essere testata in isolamento senza il sovraccarico di stato delle visualizzazioni live.

Quindi, per qualsiasi codice che intendi esaminare più di una volta, le API di transizione valgono probabilmente la pena!