2009-05-11 8 views
1

Ich habe eine UITableView mit Abschnitten in meiner iPhone-Anwendung, wo es ähnlich aussieht wie das Anzeigen einer Kontaktdetails in Standard-Kontakte App. In einem der Abschnitte habe ich einen UISegmentedControl-Satz als Überschrift des Abschnitts und die Elemente in diesem Abschnitt hängen davon ab, welches Segment im segmentierten Steuerelement ausgewählt ist. Was ich tun wollte, ist, Animationen zu haben, die die Reihen eines Tabs aus der Ansicht auf eine Seite verschieben und die Reihen eines anderen Tabs von der anderen Seite her verschieben. Ich habe es geschafft, dies zu erreichen, indem ich die entsprechenden Zeilen mit den Standard-Animationen von UITableView dafür einfüge/lösche, aber es sieht ein bisschen komisch aus, wenn sich die Anzahl der Zeilen in einer Registerkarte von der anderen unterscheidet. Auch der Code dafür ist ziemlich eklig.Tab-like-Sache mit Tab-Switch-Animation in einem Abschnitt von UITableView

Hier ist der Code, den ich (etwas vereinfacht) haben:

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

ich Objective C und Cocoa ziemlich neu bin, so dass alle Ratschläge sind sehr willkommen.

Antwort

3

Sie können versuchen, eine separate Tabellenansicht zu verwenden, in der Sie direkt animieren. Das Snippet wird hier gerade eingegeben off-the-Manschette, so könnten einige Arbeit benötigen, aber es sollte Ihnen einige Hinweise geben, zumindest:

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

Die Idee dabei ist, dass Sie Setup die neue Tabelle (es das gleiche machen Größe wie die vorhandene), platzieren Sie sie außerhalb des Bildschirms rechts neben der vorhandenen Tabelle und animieren Sie dann die Bewegung beider Tabellen, die nach ihrer Breite liegen. Auf diese Weise wird die vorhandene Tabelle auf dem Bildschirm verschoben, während die neue auf dem Bildschirm verschoben wird. Wenn die Animation abgeschlossen ist, ruft sie die bereitgestellte Methode auf und gibt Ihnen die Möglichkeit, die neue Tabellenansicht zur offiziellen Tabellenansicht zu machen.

Eine andere Möglichkeit wäre, ein Flip Übergang zu verwenden, die so etwas wie dies gehen könnte:

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

Hoffentlich einer von denen, die gewünschte Wirkung haben.

+0

Vielen Dank für Ihre Einsichten! Das Problem ist jedoch, dass ich nur einen einzelnen Abschnitt einer Tabelle animieren möchte, nicht die gesamte Tabelle, und Ihre Lösung scheint das Ganze von dem, was ich sehe, zu animieren. Vielleicht sollte ich eine separate Sache für die Tabbing-Bereich machen und damit arbeiten, aber das Problem ist, dass ich das Aussehen der Standard-UITableView mag und ich mag, dass ich den Inhalt über Tabs aus der Sicht scrollen kann, so bin ich mir nicht sicher Wo lang geht es. – inkredibl

+0

Ah, habe das nicht bemerkt (doh, nicht aufmerksame Person Alarm!). Wenn es sich um einen einzelnen Abschnitt handelt, den Sie ändern möchten, können Sie NSTableView -deleteSection verwenden: atIndex: und insertSection: atIndex: um zu tun, was Sie suchen, denke ich. Vielleicht möchten Sie -beginUpdates/-endUpdates vermeiden, aber es war ein bisschen flockig für mich. Ich beendete meine Löschungen und stellte dann einen 0,3-Sekunden-Timer ein, um die Einfügungen durchzuführen. Ein bisschen anfälliger zu brechen, wenn die implizite Animationsdauer sich jemals ändert, aber es könnte nützlich sein zu versuchen, wenn Sie immer noch grafische Anomalien bekommen. –

Verwandte Themen