Comment faire défiler un UITableView vers une section qui ne contient pas de lignes?

StackOverflow https://stackoverflow.com/questions/159821

  •  03-07-2019
  •  | 
  •  

Question

Dans une application sur laquelle je travaille, j'ai un style simple UITableView qui peut contenir une section contenant zéro ligne. Je veux pouvoir faire défiler cette section à l'aide de scrollToRowAtIndexPath: atScrollPosition: animated: mais j'obtiens une erreur lorsque j'essaie de faire défiler cette section à cause du manque de lignes enfants.

L’application de calendrier d’Apple est capable de le faire. Si vous regardez votre calendrier en mode liste, qu’il n’y ait aucun événement dans votre calendrier pour le jour, une section vide est insérée pour aujourd’hui et vous pouvez y accéder à l’aide du bouton Aujourd'hui. dans la barre d’outils en bas de l’écran. Autant que je sache, Apple utilise peut-être un UITableView personnalisé ou une API privée ...

La seule solution à laquelle je peux penser est d'insérer un UITableCell vide dans une hauteur de 0 pixel et de faire défiler jusqu'à celui-ci. Mais je crois comprendre que le fait de disposer de cellules de différentes hauteurs est très mauvais pour les performances de défilement. Je vais quand même essayer quand même, peut-être que la performance ne sera pas trop mauvaise.

Mettre à jour

Comme il semble n'y avoir aucune solution à ce problème, j'ai déposé un rapport de bug avec Apple. Si cela vous concerne aussi, remplissez un double de rdar: // problem / 6263339 ( lien Ouvrir le radar) si vous voulez que cela soit résolu plus rapidement.

Mise à jour 2

J'ai une solution de contournement à ce problème, jetez un oeil à ma réponse ci-dessous.

Était-ce utile?

La solution

UPDATE: On dirait que ce bogue est corrigé dans iOS 3.0. Vous pouvez utiliser le NSIndexPath suivant pour faire défiler jusqu'à une section contenant 0 rangées:

[NSIndexPath indexPathForRow:NSNotFound inSection:section]

Je laisserai ici ma solution de contournement d'origine à quiconque conservera un projet utilisant le SDK 2.x.

Vous avez trouvé une solution de contournement décente:

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

Le code ci-dessus fait défiler la vue tableau afin que la section souhaitée soit visible mais pas nécessairement en haut ou en bas de la zone visible. Si vous souhaitez faire défiler la section en haut, procédez comme suit:

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

Modifiez sectionRect comme vous le souhaitez pour faire défiler la section souhaitée vers le bas ou le milieu de la zone visible.

Autres conseils

Ceci est une vieille question, mais Apple n'a toujours rien ajouté qui puisse aider ou corriger le bogue bloquant la section où il n'y a pas de lignes.

Pour moi, j’avais vraiment besoin de faire défiler une nouvelle section vers le milieu lorsqu’il a été ajouté. J’utilise maintenant ce code:

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];
}

J'espère que vous l'aimez - il est basé sur le code de Mike Akers, comme vous pouvez le voir, mais effectue le calcul pour le défilement vers le milieu plutôt que vers le haut. Merci Mike - tu es une star.

Une approche rapide de la même chose:

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)
}

Si votre section n'a pas de lignes, utilisez cette

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

Je pense qu'une ligne vide est probablement le seul moyen d'y aller. Est-il possible de redéfinir l’interface utilisateur de telle sorte que le paramètre "vide"? ligne peut afficher quelque chose d'utile?

Je dis de l'essayer et de voir à quoi ressemble la performance. Ils vous avertissent plutôt de l'utilisation de sous-vues transparentes dans vos éléments de liste et je n'ai pas trouvé que cela importait tellement dans ma candidature.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top