Domanda

Ho una sottoclasse di UITableViewController. Ho codice che può aggiungere / rimuovere un UISearchBar da / per l'tableHeaderView della mia tableView. Ecco il codice che ho per eseguire queste attività:

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

Il problema è che io voglio l'aggiunta / rimozione del UISearchBar di essere animato; scivolare in vista dalla cima quando lo aggiungo poi scivolare verso l'alto e fuori dalla vista quando rimuovo che invece di apparire e scomparire. Qualche suggerimento?

Grazie.

È stato utile?

Soluzione

Sono stato finalmente in grado di capire questo. Si è rivelato essere piuttosto semplice. Invece di aggiungere l'UISearchBar all'intestazione tavolo, inserisco nella prima cella della tabella con animazione UITableViewRowAnimationTop e rimuoverlo utilizzando lo stesso metodo. Ciò si traduce nella barra di scorrimento dentro e fuori dalla parte superiore. Ecco il codice che fa apparire la barra:

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

E qui è il codice che rimuove la barra di ricerca:

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

Altri suggerimenti

Un modo molto più semplice che è anche adatto per UITableViewStyleGrouped (inclusa Non è necessario cambiare il numero di righe) è animare la contentInset della tabella:

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

So che questo è di tre anni dopo il PO ha posto la domanda, ma poiché questa è una buona alternativa per ottenere l'effetto desiderato, ho pensato che potrebbe essere utile per gli altri che soddisfano lo stesso problema.

Prova avere la vostra vista tabella scroll-animato-in modo che solo la riga sotto la barra di ricerca è visibile, quindi rimuovere la barra di ricerca e scorrere fino alla stessa riga, senza animazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top