2013-05-13 14 views
9

Ho bisogno di animare l'inserimento di una vista di intestazione vista tabella. Voglio che le righe della tabella scorrano verso il basso mentre la vista dell'intestazione espande la sua cornice.
Finora il miglior risultato ho ottenuto è quello di utilizzare il seguente codice:Come animare la vista dell'intestazione di UITableView

[self.tableView beginUpdates]; 
[self.tableView setTableHeaderView:self.someHeaderView]; 
[self.tableView endUpdates]; 

Il problema di questa soluzione è che l'intestazione stessa non venga animato, la sua struttura non espande.

Quindi l'effetto che sto ottenendo è che le righe della tabella scendono verso il basso (come voglio) ma la vista dell'intestazione viene immediatamente mostrata, e voglio che si espanda il suo frame con l'animazione.

Qualche idea?

Grazie.

+1

provare http://stackoverflow.com/questions/2659428/how-to-animate-the-height-change-of-an-section-header-in- uitableview –

risposta

15

hanno il telaio di raccolta a CGRectZero e impostare il frame utilizzando un'animazione

[self.tableView beginUpdates]; 
[self.tableView setTableHeaderView:self.someHeaderView]; 

[UIView animateWithDuration:.5f animations:^{ 
    CGRect theFrame = someBigger.frame; 
    someHeaderView.frame = theFrame; 
}]; 

[self.tableView endUpdates]; 
+0

Non funziona, sembra che se si imposta l'intestazione della tabella con una vista con altezza zero, quindi non importa se si modifica questa altezza di visualizzazione, l'intestazione della tabella non cambierà .. – Mario

+0

quindi prova ad aumentare l'altezza per TableHeaderView nell'animazione invece del frame someHeaderView – Bonnie

+7

Le chiamate 'beginUpdates' e' endUpdates' non sono richieste. –

5

La risposta selezionato non ha funzionato per me. Doveva fare quanto segue:

[UIView animateWithDuration: 0.5f 
       animations: ^{ 
        CGRect frame = self.tableView.tableHeaderView.frame; 
        frame.size.height = self.headerViewController.preferredHeight; 
        self.tableView.tableHeaderView.frame = frame; 
        self.tableView.tableHeaderView = self.tableView.tableHeaderView; 
        }]; 

La parte veramente singolare è che questo funziona in una vista, ma non in una sottoclasse della stessa gerarchia vista del regolatore/vista.

+0

Perché 'self.tableView.tableHeaderView = self.tableView.tableHeaderView;' richiesto? Non funziona senza questa linea apparentemente ridondante. – OpenUserX03

+0

@ OpenUserX03 Concordato che è ridondante ma è necessario il ripristino del frame per il suo funzionamento. – greg

+0

@ OpenUserX03 Ho visto la stessa cosa, devo reimpostare il 'tableHeaderView' per far visualizzare a TableView la nuova dimensione. Probabilmente fanno qualcosa nel 'didSet', visto che si tratta di un riferimento di classe, non di una struttura, quindi solo un puntatore si trova in una posizione identica. http://stackoverflow.com/questions/16518580/how-to-animate-uitableview-header-view/16518713#comment61586382_16518713 – SimplGy

11

Ecco quello che ho avuto modo di lavorare a Swift, con un'altezza del telaio iniziale di zero e aggiornarlo alla sua altezza nella chiusura animazioni:

// Calculate new frame size for the table header 
var newRect = tableView.tableHeaderView?.frame 
newRect?.size.height = 42 
// Get the reference to the header view 
let tblHeaderView = self.tableView.tableHeaderView 
// Animate the height change 
UIView.animateWithDuration(0.6, animations: {() -> Void in 
    tblHeaderView?.frame = newRect! 
    self.tableView.tableHeaderView = tblHeaderView 
}) 
+1

Questo funziona per me. Per sincronizzare le dimensioni dell'intestazione e le animazioni di spostamento tableCell, ho dovuto utilizzare una animazioneDurata di 0,3. Su iOS 9 questo è. –

+1

La riassegnazione di tableHeaderView nel blocco di animazione ha funzionato anche per me. Questa dovrebbe essere la risposta accettata. –

0

ho trovato il modo definitivo e corretto per ottenere un vero e proprio animazione su tableHeaderView s!

• Innanzitutto, se si è in Autolayout, mantenere il sistema Margin all'interno della vista dell'intestazione. Con Xcode 8 è ora possibile (finalmente!), Non impostare alcun vincolo a nessuna delle sottoview dell'intestazione. Dovrai impostare i margini corretti pensati.

• Quindi utilizzare beginUpdates e endUpdates, ma messo endUpdatein blocco animazione.

Nota: ho provato solo in iOS10, pubblicherò un aggiornamento quando verrà scaricato il mio simulatore iOS9.

EDIT

Purtroppo, non funziona in iOS9 così come iOS10: l'intestazione in sé non cambia la sua altezza, ma subviews intestazione sembra muoversi come se i limiti di intestazione cambiati.

-1

Usa sotto il codice funziona

extension UITableView { 

func hideTableHeaderView() -> Void { 
    self.beginUpdates() 
    UIView.animate(withDuration: 0.2, animations: { 
     self.tableHeaderView = nil 
    }) 
    self.endUpdates() 
} 

func showTableHeaderView(header: UIView) -> Void { 
    let headerView = header 
    self.beginUpdates() 
    let headerFrame = headerView.frame 
    headerView.frame = CGRect() 
    self.tableHeaderView = headerView 
    UIView.animate(withDuration: 0.2, animations: { 
     self.tableHeaderView?.frame = headerFrame 
     self.tableHeaderView?.alpha = 0 
     self.endUpdates() 
    }, completion: { (ok) in 
     self.tableHeaderView?.alpha = 1 
    }) 
    } 
} 
Problemi correlati