我有一个UITableViewController的子类。我有代码可以在我的tableView的tableHeaderView中添加/删除UISearchBar。这是我必须执行这些任务的代码:
self.tableView.tableHeaderView = uiSearchBar; //Make the search bar appear
self.tableView.tableHeaderView = nil; //Make the search bar disappear
问题是我想要添加/删除UISearchBar是动画的;当我添加它时从顶部滑入视图,然后当我移除它而不是仅仅出现和消失时向上滑动并离开视图。有什么建议吗?
感谢。
答案 0 :(得分:7)
我终于能够弄明白了。原来很简单。我没有将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];
答案 1 :(得分:4)
一种更简单的方法,也适用于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;
}];
}
我知道这是在OP提出问题三年后,但由于这是达到预期效果的一个很好的选择,我认为对于遇到同样问题的其他人来说这可能是有用的。
答案 2 :(得分:0)
尝试让您的表格视图滚动动画,以便只显示搜索栏下方的行,然后移除搜索栏并滚动到同一行而不显示动画。