2009-05-11 3 views
1

J'ai un UITableView avec des sections dans mon application iPhone où il ressemble à quelque chose de similaire à l'affichage d'un contact dans l'application de contacts standard. Dans l'une des sections, j'ai un ensemble UISegmentedControl en tant qu'en-tête de la section et les éléments de cette section dépendent du segment sélectionné dans le contrôle segmenté. Ce que je voulais faire, c'est d'avoir des animations déplaçant les rangées d'un onglet hors de la vue d'un côté et de déplacer les rangées d'un autre onglet de l'autre côté. J'ai réussi à y parvenir en insérant/supprimant les lignes respectives avec les animations UITableView par défaut pour cela, mais cela semble un peu bizarre quand le nombre de lignes dans un onglet est différent de l'autre. Aussi le code pour cela est assez méchant.Tab-like-chose avec animation par tabulation dans une section de UITableView

Voici le code que j'ai (un peu simplifié):

[self.tableView beginUpdates]; 
UITableViewRowAnimation delAnim = UITableViewRowAnimationRight; 
UITableViewRowAnimation insAnim = UITableViewRowAnimationLeft; 
NSUInteger numdel = [self.list count]; 
NSUInteger numins = [newlist count]; 
NSMutableArray* indices = [NSMutableArray arrayWithCapacity: numdel]; 
for (NSUInteger i = 0; i < numins; i++) 
{ 
    [indices addObject: [NSIndexPath indexPathForRow: i inSection: SECT]]; 
} 
[self.tableView insertRowsAtIndexPaths: indices withRowAnimation: insAnim]; 
[indices removeAllObjects]; 
for (NSUInteger i = 0; i < numdel; i++) 
{ 
    [indices addObject: [NSIndexPath indexPathForRow: i inSection: SECT]]; 
} 
[self.tableView deleteRowsAtIndexPaths: indices withRowAnimation: delAnim]; 
self.list = newlist; 
[self.tableView endUpdates]; 

Je suis assez nouveau à l'objectif C et Cocoa, donc tous les conseils sont les bienvenus.

Répondre

3

Vous pouvez essayer d'utiliser une vue de table séparée dans laquelle vous animez directement. L'extrait ici est juste tapé hors le brassard, donc peut-être besoin un peu de travail, mais il devrait vous donner quelques indications au moins:

- (void) switchToNewTableFromRight 
{ 
    UITableView * newTableView = [[UITableView alloc] initWithFrame: self.tableView.frame style: self.tableView.style]; 

    // put it off to the right of the existing table 
    CGRect frame = newTableView.frame; 
    frame.origin.x += frame.size.width; 
    newTableView.frame = frame; 

    // set data for new table 
    // you should ensure you're setup to supply data for the new table here, btw 
    newTableView.delegate = self; 
    newTableView.dataSource = self; 
    [newTableView reloadData]; 

    // add to parent of current table view at this (offscreen) location 
    [self.tableView.superview addSubview: newTableView]; 

    // now we animate 
    [UIView beginAnimations: @"TableFromRight" context: newTableView]; 

    // set the function it should call when the animation completes 
    [UIView setAnimationDelegate: self]; 
    [UIView setAnimationDidStopSelector: @selector(animation:finished:context:)]; 

    // set new table's frame to current table's frame 
    newTableView.frame = self.tableView.frame; 

    // set current table's frame to be offscreen to the left 
    frame = self.tableView.frame; 
    frame.origin.x -= frame.size.width; 
    self.tableView.frame = frame; 

    // commit the animations to start them going 
    [UIView commitAnimations]; 
} 

- (void) animation: (NSString *) animationID finished: (BOOL) finished context: (void *) context 
{ 
    // could be a good idea to check that finished == YES here 
    UITableView * newTableView = (UITableView *) context; 
    self.tableView = newTableView; 

    // newTableView has been inited but not autoreleased, etc. 
    // now the controller (self) owns it, so release that first reference 
    [newTableView release]; 
} 

L'idée ici est que vous configurez la nouvelle table (ce qui en fait la même taille comme l'existant), placez-le hors-champ à droite de la table existante, puis animez le mouvement des deux tables laissées par leur largeur. De cette façon, la table existante se déplacera hors écran pendant que la nouvelle se déplacera à l'écran. Lorsque l'animation est terminée, elle appelle la méthode fournie, ce qui vous donne l'opportunité de faire en sorte que la nouvelle table affiche la vue officielle de la table.

Une autre option serait d'utiliser une transition flip, ce qui pourrait aller quelque chose comme ceci:

// setup new table 
UITableView * newTableView = [[UITableView alloc] initWithFrame: self.tableView.frame style: self.tableView.style]; 
newTableView.delegate = self; 
newTableView.dataSource = self; 
[newTableView reloadData]; 

[UIView beginAnimations: nil context: NULL]; 
[UIView setAnimationDuration: 1.0]; 
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView: self.tableView.superview cache: YES]; 

// generally here you'd remove the old view and add the new view 
// I'm *assuming* that UITableViewController's -setTableView: will do the same thing 
self.tableView = newTableView; 

[UIView commitAnimations]; 

Espérons que l'un de ceux qui auront l'effet désiré.

+0

Merci pour vos idées! Le problème est que je veux seulement animer une seule section d'une table et non pas toute la table et votre solution semble animer le tout de ce que je peux voir. Peut-être que je devrais faire une chose distincte pour la zone de tabulation et travailler avec, mais le problème est que j'aime bien le look de la norme UITableView et j'aime faire défiler le contenu au-dessus des onglets, donc je ne suis pas sûr Quelle direction prendre. – inkredibl

+0

Ah, n'a pas remarqué que (Doh, alerte personne non-observateur!). Si vous voulez changer une seule section, vous pouvez utiliser -deleteSection de NSTableView: atIndex: et insertSection: atIndex: pour faire ce que vous cherchez, je pense. Vous pouvez éviter -beginUpdates/-endUpdates cependant, ça a été un peu flou pour moi. J'ai fini par faire mes suppressions, puis j'ai mis en place une minuterie de 0,3 seconde pour faire les insertions. Un peu plus susceptible de se casser si la durée de l'animation implicite change, mais peut être utile si vous avez encore des anomalies graphiques. –

Questions connexes