2009-08-23 7 views
5

Ich habe eine Unterklasse von UITableViewController. Ich habe Code, der eine UISearchBar zu/von der TableHeaderView meiner TableView hinzufügen/entfernen kann. Hier ist der Code, den ich diese Aufgaben zu erfüllen haben:Animiere Hinzufügen/Entfernen von UISearchBar zu/von UITableView tableViewHeader

self.tableView.tableHeaderView = uiSearchBar; //Make the search bar appear 
self.tableView.tableHeaderView = nil; //Make the search bar disappear 

Das Problem ist, dass ich möchte, dass die Hinzufügen/Entfernen des UISearchBar animiert werden; Wenn ich es hinzufüge, rutsche ich von oben in die Ansicht und rutsche dann nach oben und außer Sicht, wenn ich es entferne, anstatt es nur zu sehen und zu verschwinden. Irgendwelche Vorschläge?

Danke.

Antwort

7

konnte ich endlich herausfinden. Hat sich als ziemlich einfach herausgestellt. Anstatt die UISearchBar zum Tabellenheader hinzuzufügen, füge ich sie in die erste Zelle der Tabelle mit der Animation UITableViewRowAnimationTop ein und entferne sie mit der gleichen Methode. Dies führt dazu, dass der Stab von oben nach innen und außen gleitet. Hier ist der Code, der die Bar erscheinen lässt:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
[self.baseUiTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop]; 
[self.baseUiTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

Und hier ist der Code, der die Suchleiste entfernt:

[uiSearchBar resignFirstResponder]; 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
[self.baseUiTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop]; 
+0

Hat dieser Ansatz Auswirkungen auf den Zeilenindex, der bei der Behandlung von Zellinteraktionen ausgewählt wurde? –

0

Versuchen Sie, Ihre Tabellenansicht scroll-animiert anzuzeigen - so dass nur die Zeile unter der Suchleiste sichtbar ist, entfernen Sie dann die Suchleiste und scrollen Sie zur selben Zeile ohne Animation.

4

Eine viel einfachere Art und Weise, die auch für UITableViewStyleGrouped geeignet ist (plus nicht benötigen die Anzahl der Zeilen zu ändern) wird die contentInset der Tabelle zu animieren:

CGFloat h = uiSearchBar.bounds.size.height; 
UITableView *tv = self.tableView; 
if (tv.tableHeaderView) 
{ // hide bar 
    [UIView animateWithDuration:0.3 animations:^{ 
     tv.contentInset = UIEdgeInsetsMake(-h, 0, 0, 0); 
    } completion:^(BOOL finished) { 
     tv.contentInset = UIEdgeInsetsZero; 
     tv.tableHeaderView = nil; 
     [tv scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
    }]; 
} 
else 
{ // show bar 
    uiSearchBar.frame = CGRectMake(0, -h, tv.frame.size.width, h); 
    [UIView animateWithDuration:0.3 animations:^{ 
     [tv scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
     tv.tableHeaderView = uiSearchBar; 
    }]; 
} 

ich weiß, das ist drei Jahre nach der OP die Frage gestellt, aber da diese ag ood Alternative, um den gewünschten Effekt zu erzielen, dachte ich, es könnte für andere nützlich sein, die das gleiche Problem haben.

+1

Finde einen Fehler ... Oder liege ich falsch? 'tv.size.width' muss' tv.frame.size.width' sein und vielleicht 'tv.size.height' benötigt eine Reduktion auf zB 44.0f oder nur h. – microspino

+0

In der Tat! +1, um dies zu erkennen. Vielen Dank. Ich habe das im obigen Code behoben. –

+0

Das funktioniert perfekt für mich, aber ich versuche herauszufinden, wie der "Show" Teil davon funktioniert. Warum lässt er den Rahmen animieren? Liegt es daran, dass beim Hinzufügen der Leiste zur Tabellenansicht der Frame-Ursprung der Leiste auf 0 gesetzt wird, was dazu führt, dass sie von -h herunter animiert wird? – Marcin

Verwandte Themen