Анимируйте добавление / удаление UISearchBar в / из UITableView tableViewHeader - PullRequest
5 голосов
/ 24 августа 2009

У меня есть подкласс UITableViewController. У меня есть код, который может добавить / удалить UISearchBar в / из tableHeaderView моего tableView. Вот код, который я должен выполнить для этих задач:

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

Проблема в том, что я хочу, чтобы добавление / удаление UISearchBar было анимированным; когда я добавляю его, переходите в вид сверху, а когда удаляете его, сдвигайте вверх и вне поля зрения вместо того, чтобы просто появляться и исчезать. Есть предложения?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 28 августа 2009

Я наконец смог понять это. Оказалось довольно просто. Вместо добавления UISearchBar в заголовок таблицы, я вставляю его в первую ячейку таблицы с анимацией UITableViewRowAnimationTop и удаляю его тем же методом. Это приводит к тому, что бар скользит внутрь и наружу сверху. Вот код, который заставляет появиться панель:

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

А вот код, который удаляет строку поиска:

[uiSearchBar resignFirstResponder];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.baseUiTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
4 голосов
/ 02 мая 2012

Гораздо более простой способ, который также подходит для UITableViewStyleGrouped (плюс не требует изменения количества строк), заключается в анимации contentInset таблицы:

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

Я знаю, что прошло три года после того, как ФП задал вопрос, но, поскольку это хорошая альтернатива для достижения желаемого эффекта, я подумал, что это может быть полезно для других, сталкивающихся с той же проблемой.

0 голосов
/ 25 августа 2009

Попробуйте использовать анимацию прокрутки табличного представления, чтобы была видна только строка под строкой поиска, затем удалите панель поиска и прокрутите до той же строки без анимации.

...