2013-07-13 11 views
9

Sono curioso quando la dimensione del contenuto di UITableView viene aggiornata dopo aver fatto una chiamata di inserimento/cancellazione dell'animazione. Ho pensato che sarebbe stato come la maggior parte dei blocchi [Animazione UIView ...] in quanto la dimensione del frame/dimensione del contenuto sarebbe stata aggiornata immediatamente anche se l'animazione non è stata completata, ma non sembra essere così. Qualche idea?Quando si aggiorna la dimensione del contenuto di UITableView con l'inserimento/eliminazione dell'anima

+1

Hai risolto questo? Sto incontrando lo stesso problema. Inserendo/eliminando le righe ci si aspetta che tableView.contentSize sia aggiornato, ma sembra essere asincrono. – VaporwareWolf

risposta

0

La dimensione contenuto sarà cambiato dopo aver chiamato i delegati circa all'altezza:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; 
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section; 
+2

Grazie per la risposta. Posso comunque ricevere una notifica o qualsiasi tipo di metodo delegato che mi dirà che la dimensione del contenuto è cambiata? Sembra che dopo l'animazione sia completa ma spero di ottenere la nuova dimensione del contenuto PRIMA così posso animare le cose attorno al tavolo di conseguenza – SLEW

+0

Ho provato questo e ho messo le dichiarazioni di registro prima e dopo ho chiamato tableview: heightForRowAtIndexPath: metodo e non ho visto la dimensione del contenuto aggiornata. Tuttavia, questo mi ha aiutato a portarmi a una soluzione per calcolare quale sarà la dimensione del contenuto. Pubblicherò la soluzione come risposta separata. – Daren

2

Purtroppo, non sono stato in grado di trovare un buon modo per aggiornare il contentSize quando si aggiungono/cancellazione di righe da un'UITableView sia, ma Ho trovato un modo per calcolare quale sarà se conosci i percorsi dell'indice delle celle che stai aggiungendo/rimuovendo.

Utilizzando il percorso indice delle righe modificate, è possibile calcolare le altezze delle rispettive celle con tableView: heightForRowAtIndexPath: metodo e aggiungere al formato altezza attuale contenuto della vista tabella. Ecco un esempio, se si sta aggiungendo una sola riga:

[self.tableView insertRowsAtIndexPaths:@[indexPathOfNewRow] withRowAnimation:UITableViewRowAnimationAutomatic]; 
CGFloat newCellHeight = [self tableView:self.tableView heightForRowAtIndexPath:indexPathOfNewRow]; 
CGFloat newContentSizeHeight = self.tableView.contentSize.height + newCellHeight 
1

Sembra sizeThatFits() può esporre l'altezza di una nuova contentSize che è in attesa. È quindi possibile assegnare le dimensioni in sospeso per risolverle in anticipo per le animazioni di scorrimento.

con qualcosa di simile:

extension UIScrollView { 

    var pendingContentSize: CGSize { 
     var tallSize = contentSize 
     tallSize.height = .greatestFiniteMagnitude 
     return sizeThatFits(tallSize) 
    } 

    func scrollToBottom(animated: Bool) { 
     contentSize = pendingContentSize 
     let contentRect = CGRect(origin: .zero, size: contentSize) 
     let (bottomSlice, _) = contentRect.divided(atDistance: 1, from: .maxYEdge) 
     guard !bottomSlice.isEmpty else { return } 
     scrollRectToVisible(bottomSlice, animated: animated) 
    } 

} 

Sono in grado di scrivere visualizzazione del codice di controllo in questo modo:

tableView.insertRows(at: [newIndexPath], with: .none) 
tableView.scrollToBottom(animated: true) 

e avere il tavolo scorrere tutta la strada fino in fondo (con il nuovo dimensione del contenuto) invece di scorrere verso il basso fino alla penultima riga (utilizzando la vecchia dimensione del contenuto).

Problemi correlati