Анимация добавления/удаления UISearchBar в/из UITableView tableViewHeader
-
19-09-2019 - |
Вопрос
У меня есть подкласс UITableViewController.У меня есть код, который может добавлять/удалять UISearchBar в/из tableHeaderView моего tableView.Вот код, который мне нужен для выполнения этих задач:
self.tableView.tableHeaderView = uiSearchBar; //Make the search bar appear
self.tableView.tableHeaderView = nil; //Make the search bar disappear
Проблема в том, что я хочу, чтобы добавление/удаление UISearchBar было анимировано;переместиться в поле зрения сверху, когда я добавляю его, затем сдвинуть вверх и исчезнуть из поля зрения, когда я его удаляю, а не просто появляться и исчезать.Какие-либо предложения?
Спасибо.
Решение
Я наконец смог это понять.Оказалось довольно просто.Вместо добавления 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];
Другие советы
Гораздо более простой способ, который также подходит для 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;
}];
}
Я знаю, что прошло три года после того, как ФП задал вопрос, но поскольку это хорошая альтернатива для достижения желаемого эффекта, я подумал, что это может быть полезно для других, столкнувшихся с той же проблемой.
Попробуйте использовать анимацию прокрутки представления таблицы, чтобы была видна только строка под панелью поиска, затем удалите панель поиска и прокрутите до той же строки без анимации.