2016-06-27 18 views
6

Come posso scorrere la vista tabella verso il basso quando si utilizza l'altezza della cella dinamica?Scorri la vista tabella in basso quando si utilizza l'altezza della cella dinamica

Per qualche motivo questo codice non funziona in questo scenario:

[self.tableView scrollRectToVisible:CGRectMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height) animated:YES]; 

Grazie!

EDIT: Utilizzare il codice di Hasiya per scorrere verso il basso, per alcuni di voi che da soli potrebbero fare il trucco.

+0

'' [self.tableView setContentOffset: ...] 'funziona? –

+0

No purtroppo ... –

+1

Prova, tableView.scrollToRowAtIndexPath (NSIndexPath (forRow: arrayData.count, inSection: 0), atScrollPosition: UITableViewScrollPosition.Bottom, animato: true) –

risposta

2

Alla fine, ho trovato la risposta. Il motivo per cui lo scorrimento verso il basso non funziona (e l'inserimento/eliminazione delle righe sono anch'essi errati, come ho scoperto in seguito), è dovuto al fatto che l'altezza della cella è not properly estimated. Per ovviare a questo, provare a restituire stime ravvicinate in estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath. Tuttavia, se non è possibile farlo (e nella maggior parte dei casi non si sarà in grado di farlo) c'è ancora un'ottima soluzione: memorizzare le altezze delle celle in un dizionario e restituirle per lo estimatedHeight quando le celle vengono riutilizzate (ad es. la visualizzazione della tabella è scorrevole). Ho trovato questa soluzione in un'altra domanda, quindi per favore vai a controllare per il codice reale su come lo porteresti avanti. (Anche se probabilmente, molti di voi possono scrivere questo per se stessi)

Original solution by @dosdos

EDIT: Forse per fissare solo scorrendo fino in fondo questo non è necessaria, ma altamente consigliato a mio parere. Se non lo si utilizza per stimare l'altezza della riga, si incontreranno altri problemi come lo scorrimento scorretto e prestazioni peggiori in un numero elevato di celle.

Inoltre è necessario aggiungere questo a viewDidAppear

let lastItem = IndexPath(item: dataSource.count - 1, section: 0) 
tableView.scrollToRow(at: lastItem, at: .bottom, animated: true) 
+0

Dovresti segnare la tua risposta come risposta accettata – mrvincenzo

+0

Lo so grazie, ma non posso aspettare altre 15 ore –

1

Spero che questo possa funzionare per voi. Prova questo

[self.tableview setContentOffset:CGPointMake(0, CGFLOAT_MAX)] 

O

if (self.tableview.contentSize.height > self.tableview.frame.size.height) 
    { 
     CGPoint offset = CGPointMake(0, self.tableview.contentSize.height -  self.tableview.frame.size.height); 
     [self.tableview setContentOffset:offset animated:YES]; 
    } 
+1

Ho ottenuto altre soluzioni per funzionare ma l'utilizzo di CGFloat.greatestFiniteMagnitude (versione rapida di CGFLOAT_MAX) era in realtà il più efficiente poiché causava la visualizzazione della tabella solo chiamata cellForRow (a: IndexPath, ...) per le celle molto in basso. Grazie! –

0

Prova con scrollToRowAtIndexPath, come indicato nel codice di seguito.

- (void)viewWillAppear:(BOOL)animated 
{ 

    [super viewWillAppear:animated]; 

    NSInteger no = array.count-1; 

    NSIndexPath *lastIndex = [NSIndexPath indexPathForRow:no inSection:0]; 

    [self.tableView scrollToRowAtIndexPath:lastIndex atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

} 
+0

Ho modificato la mia domanda per riflettere questo! Grazie! –

+0

Benvenuto, buona programmazione. – Hasya

7

Di seguito ha lavorato per il mio 3.1 Swift code utilizzando Xcode 8.3.2 mira iOS 10.1 solo per iPhone.

Ho avuto lo stesso problema dell'OP. La mia app includeva una funzione di messaggistica. Volevo che l'ultimo post fosse visibile quando la visualizzazione dei messaggi è stata inserita nello stack. Le mie altezze di celle tableview sono variabili a causa del contenuto dei messaggi. Nessuna delle soluzioni ha funzionato in modo soddisfacente (l'ultima riga tableview non era visibile o solo parzialmente visibile). Ma, qui è quello che ha funzionato per me:

  • In Interface Builder (IB) impostare l'altezza riga cella per un valore maggiore di quanto mi aspettassi mia altezza media fila per essere nel mio caso 50 (assicuratevi di controllare il Casella di controllo 'personalizzato').
  • Nel ViewController cui tableView è implementato all'interno funzione 'viewDidLoad' impostare proprietà del Tableview 'rowHeight' come segue:

    myTableView.rowHeight = UITableViewAutomaticDimension 
    
  • anche la funzione 'viewDidLoad' impostato del Tableview 'estimatedRowHeight' a un valore superiore a quello previsto per l'altezza della riga media. Nel mio caso 140.

Infine e soprattutto ho scritto questo pezzo di codice:

extension UITableView { 

    func scrollToBottom() { 
     let rows = self.numberOfRows(inSection: 0) 

     let indexPath = IndexPath(row: rows - 1, section: 0) 
     self.scrollToRow(at: indexPath, at: .top, animated: true) 
    } 
} 

Avviso del at: .top — questo è ciò che ha risolto il mio problema. Passare il valore .bottom per il parametro UITableViewScrollPosition non ha funzionato. Anche il passaggio .middle ha funzionato — ma non .bottom.

Così, ogni volta che il mio set di dati devono essere aggiornati o un nuovo messaggio arriva chiamo

func getTableViewData(){ 
    // Get your data here any way you usually do.. 

    // call to reload 
    myTableView.reloadData() 
    // call the scroll function 
    myTableView.scrollToBottom() 
} 

ho testato i risultati di questo 'metodo' semplicemente cambiando il parametro at: .bottom-at: .top. Ogni volta che l'ho modificato su at: .top, le ultime righe della tabella erano completamente visibili e la tabella scendeva fino in fondo.

+0

Infatti - '.top' funziona per scorrere verso il basso molto meglio di' .bottom'. Incredibile scoperta! – villapossu

+0

Incredibile scoperta! Sono stato alla ricerca di una soluzione funzionante a questo problema per settimane e '.top' funziona perfettamente! –

+0

cambia 'bottom' in' top' funziona per me !!! Grazie! – Elvin

Problemi correlati