Domanda

In un'app su cui sto lavorando, ho un UITableView in stile semplice che può contenere una sezione contenente zero righe. Voglio poter scorrere fino a questa sezione usando scrollToRowAtIndexPath: atScrollPosition: animato: ma ricevo un errore quando provo a scorrere fino a questa sezione a causa della mancanza di righe secondarie.

L'applicazione di calendario di Apple è in grado di farlo, se guardi il tuo calendario nella visualizzazione elenco e non ci sono eventi nel tuo calendario per oggi, viene inserita una sezione vuota per oggi e puoi scorrere fino ad esso usando il pulsante Oggi nella barra degli strumenti nella parte inferiore dello schermo. Per quanto ne so, Apple potrebbe utilizzare un UITableView personalizzato o utilizzare un'API privata ...

L'unica soluzione che mi viene in mente è quella di inserire una UITableCell vuota alta 0 pixel e scorrere fino a quella. Ma ho capito che avere celle di altezze diverse è davvero un male per le prestazioni di scorrimento. Comunque lo proverò comunque, forse il colpo di performance non sarà poi così male.

Aggiorna

Dal momento che sembra non esserci alcuna soluzione a questo, ho presentato una segnalazione di bug con apple. Se ciò influisce anche su di te, archivia un duplicato di rdar: // problem / 6263339 ( Apri link Radar) se vuoi che venga risolto più velocemente.

Aggiornamento n. 2

Ho una soluzione decente a questo problema, dai un'occhiata alla mia risposta di seguito.

È stato utile?

Soluzione

AGGIORNAMENTO: sembra che questo bug sia stato corretto in iOS 3.0. Puoi utilizzare il seguente NSIndexPath per scorrere fino a una sezione contenente 0 righe:

[NSIndexPath indexPathForRow:NSNotFound inSection:section]

Lascerò la mia soluzione originale qui per chiunque mantenga ancora un progetto usando l'SDK 2.x.


Trovato una soluzione decente:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
[tableView scrollRectToVisible:sectionRect animated:YES];

Il codice sopra farà scorrere la vista tabella in modo che la sezione desiderata sia visibile ma non necessariamente nella parte superiore o inferiore dell'area visibile. Se vuoi scorrere in modo che la sezione sia in alto, fai questo:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
sectionRect.size.height = tableView.frame.size.height;
[tableView scrollRectToVisible:sectionRect animated:YES];

Modifica la sezione Recupera come desiderato per scorrere la sezione desiderata nella parte inferiore o centrale dell'area visibile.

Altri suggerimenti

Questa è una vecchia domanda, ma Apple non ha ancora aggiunto nulla che aiuti o risolva il bug di arresto anomalo in cui la sezione non ha righe.

Per me, avevo davvero bisogno di far scorrere una nuova sezione fino al centro quando aggiunto, quindi ora uso questo codice:

if (rowCount > 0) {
    [self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: sectionIndexForNewFolder] 
                          atScrollPosition: UITableViewScrollPositionMiddle
                                  animated: TRUE];
} else { 
    CGRect sectionRect = [self.tableView rectForSection: sectionIndexForNewFolder];
    // Try to get a full-height rect which is centred on the sectionRect
    // This produces a very similar effect to UITableViewScrollPositionMiddle.
    CGFloat extraHeightToAdd = sectionRect.size.height - self.tableView.frame.size.height;
    sectionRect.origin.y -= extraHeightToAdd * 0.5f;
    sectionRect.size.height += extraHeightToAdd;
    [self.tableView scrollRectToVisible:sectionRect animated:YES];
}

Spero ti piaccia - è basato sul codice di Mike Akers come puoi vedere, ma fa il calcolo per scorrere verso il centro anziché verso l'alto. Grazie Mike - sei una stella.

Un approccio rapido allo stesso:

if rows > 0 {
    let indexPath = IndexPath(row: 0, section: section)
    self.tableView.setContentOffset(CGPoint.zero, animated: true)
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}

else {
    let sectionRect : CGRect = tableView.rect(forSection: section)
    tableView.scrollRectToVisible(sectionRect, animated: true)
}

Se la tua sezione non ha righe usa questo

let indexPath = IndexPath(row: NSNotFound, section: section)
tableView.scrollToRow(at: indexPath, at: .middle, animated: true)

Penso che una riga vuota sia probabilmente l'unico modo per arrivarci. È possibile riprogettare l'interfaccia utente in modo tale che "vuoto"? riga può visualizzare qualcosa di utile?

Dico provalo e vedi com'è la performance. Forniscono avvisi piuttosto terribili sull'utilizzo di viste secondarie trasparenti nelle voci dell'elenco e non ho riscontrato che ciò importasse molto nella mia applicazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top