2010-03-01 7 views
12

Comment faire défiler un UITableView vers une position spécifique avec une animation?iPhone SDK - Comment faire pour faire défiler un UITableView par programmation avec animation?

Actuellement, je suis en utilisant ce code pour accéder à une position:

//tableController -> viewDidLoad 
[self.tableView reloadData]; 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0]; 
[self.tableView scrollToRowAtIndexPath:indexPath 
         atScrollPosition:UITableViewScrollPositionTop 
           animated:YES]; 

Le problème avec ce code est que la table saute droit à la bonne position sans aucune animation. Est-il possible d'activer l'animation ou de définir la durée?

Merci pour toute aide.

Répondre

0

J'ai deux suggestions pour vous enquêtez: à

  1. utilisez-vous votre application sur le simulateur ou l'iPhone lui-même? J'ai remarqué que certaines animations se comportent différemment dans le simulateur.

  2. Est-il possible que vous appeliez scrollToRowAtIndexPath: atScrollPosition: animé deux fois de suite? Cela peut "confondre" l'animation. Vous ne devez appeler cette fonction qu'une seule fois lors du traitement d'un événement donné.

+0

Merci pour votre réponse. J'exécute le code sur le périphérique et appelle ce code dans la méthode viewDidLoad. – dan

+0

Il se peut que, pour une raison quelconque, une animation ne puisse pas être démarrée à partir de viewDidLoad car cela fait partie de l'initialisation de la vue. Je ne dis pas que je sais pourquoi exactement, mais cela semble plausible. Essayez de planifier un événement avec la fonction performSelector de NSRunLoop et faites votre défilement lorsque vous l'appelez. – richb

5

Essayez de mettre en commentaire l'appel reloadData. Si je comprends bien votre question, et que vous êtes au viewDidLoad, vous ne devriez pas avoir besoin de l'appeler quand même. De plus, si vous venez d'avoir terminé en appuyant sur le contrôleur de vue, vous n'obtiendrez pas de défilement animé. Vous devrez insérer un délai (j'ai trouvé un quart de seconde fonctionne bien) entre le moment où viewDidLoad a été appelé et quand votre animation commence.

23

Il fonctionne bien pour moi:

-(void) viewDidAppear:(BOOL)animated{ 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:n inSection:0]; 
    [self.tableView scrollToRowAtIndexPath:indexPath 
        atScrollPosition:UITableViewScrollPositionTop 
          animated:YES]; 

} 

Pour être sûr que cela est appelé une seule fois, vous pouvez faire une vérification comme ceci:

if(!isInitialized){ 
    isInitialized = YES; 
    .... 
} 
0

Je sais qu'il est peut-être trop tard, mais peut-être que c'est de l'aide aux autres, maintenant vous pouvez faire défiler une table juste avec [tableView scrollsToTop].

Questions connexes