2013-10-15 9 views
10

Per un'app solo iOS7, ho un UITableView (anche se sarebbe accademico cambiarlo in UICollectionView se ciò sarà di aiuto) in cui le celle hanno questo aspetto:Animazione di sottoview in una transizione interattiva da UITableView a UIView

+----------------------------------+=======+ 
| Label1       | sub- | 
| Label2  Label3    | view | 
+----------------------------------+=======+ 

voglio passare a una seconda vista, dove la visualizzazione secondaria viene ingrandito per essere più grande, e le posizioni delle etichette cambiano, qualcosa di più simile a questo:

  +----------+ 
      |   | 
      | subview | 
      |   | 
      +----------+ 
      Label1 
      Label2 
      Label3 

questo è simile alla iOS7 App di calendario, in cui le viste stanno passando e animando le parti sul modo. So che avrò bisogno di implementare UIViewControllerAnimatedTransitioning, ma concettualmente sto avendo problemi con il funzionamento di qualcosa del genere. Nascondo le visualizzazioni secondarie della cella, le sostituisco con le sottoview della nuova vista ma nello stesso posto, quindi le animiamo? O c'è un modo meno complesso? Qualsiasi codice di esempio sarebbe apprezzato, poiché tutti gli esempi che ho trovato non riportano subviews da una vista all'altra.

ETA: Più penso a questo, più mi chiedo: è questo meglio gestito con un UICollectionView con un layout di flusso, e semplicemente hanno dettaglio essere un animato in ridimensionamento della cella fino alla dimensione del schermo?

+0

Vuoi dire che ti stai spostando tra i controller di visualizzazione? –

+0

Sì. Sto usando un UINavigationController. Toccando la cella nella UITableView si sposterà un dettaglio UIViewController sullo stack, e voglio usare le nuove transizioni animate in iOS7 per farlo. –

+0

Oggi ho giocato a questa stessa cosa. L'unica cosa che ho trovato finora, e non mi piace come ci si sente, è stata nella mia classe di protocollo UIViewControllerAnimatedTransitioning per importare la mia classe di destinazione, esporre le proprietà secondarie come pubbliche, quindi in animateTransition: per regolare i loro frame/scala . Funziona, ma non mi sento a mio agio come soluzione. – Augie

risposta

11

Le animazioni del calendario iOS7 sono, credo, fatte con i layout di transizione animati della collezione view, che sono meravigliosi ma non proprio ciò che si desidera per questa situazione. Inoltre, sembrano tenervi all'interno dello stesso controller di visualizzazione che potrebbe non essere appropriato per uno scenario di dettaglio principale come descritto sopra.

Recentemente ho giocato con le transizioni animate e ho scoperto che le nuove visualizzazioni di istantanee disponibili in iOS7 sono eccezionali per questo genere di cose.

Sono un grande fan del layout automatico ma le animazioni di transizione che utilizzano i vincoli sono troppo complicate. Tuttavia, si può supporre che all'inizio di una transizione, le vostre opinioni sono già disposti, in modo da poter applicare i seguenti principi:

  • Aggiungere la vista in ingresso alla visualizzazione della gerarchia
  • Creare una vista tela in bianco in cima a questa
  • Creare un'istantanea della visualizzazione in uscita (s) e aggiungere questo alla tela
  • Creare un'istantanea della visualizzazione in ingresso (s) e aggiungere questo alla tela
  • Eseguire le animazioni tra la due
  • Rimuovere la tela

perché il layout è già accaduto, è possibile utilizzare i center o frame proprietà delle viste esistenti su queste istantanee, e solo quelli animare. Rende il codice molto più facile da leggere. Questo è il commento di Augie qui sopra.

Nel tuo caso, puoi ottenere l'effetto desiderato legando le varie viste della cella selezionata alle viste del controller in arrivo e animandole nelle loro nuove posizioni.

Ho realizzato un progetto di esempio con questa transizione, disponibile on GitHub.L'effetto finale è simile al seguente:

example video

Questo è solo un esempio veloce per mostrare come potrebbe essere eseguita l'animazione. Nel codice di produzione, è probabile che i controllori partecipanti siano conformi a un protocollo in cui hanno restituito un numero di viste da utilizzare nella transizione anziché esporre direttamente le proprietà e vincolare la transizione a tali classi specifiche.

+0

Grazie! Questa è una tecnica davvero interessante. Non sono sicuro di capire completamente cosa sta succedendo, ma non vedo l'ora di approfondire e capire. –

+0

Felice di aggiungere ulteriori dettagli se ci sono parti specifiche che non segui. Fammelo sapere. – jrturton

+0

@jrturton questo è abbastanza bello, ma volevo chiedere se questa è ancora un'implementazione valida e se le istantanee erano performanti? Sono curioso di sapere perché non puoi semplicemente animare direttamente le etichette? Un'altra domanda sarebbe: se avessi l'immagine solo per spostarti in posizione e quindi altri elementi che erano nuovi, avrebbe senso farli svanire? Forse basta sfumare il colore di sfondo della tela? Sto tentando di replicare Material Design Transitions in Android. – user1416564

Problemi correlati