Прокрутите UITableView так, чтобы заголовок не был виден
-
22-08-2019 - |
Вопрос
У меня есть UITableView с UISearchBar в качестве tableViews.tableHeaderView .Точно так же, как new Mail.app, Notes.app и т.д.в версии 3.0.Я хочу скрыть панель поиска до тех пор, пока пользователь не перетащит ее в поле своего зрения.
Моя попытка работает только тогда, когда в TableView есть пара элементов, так что TableView действительно хочет прокручиваться.Я вызываю это в loadView:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self._tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
Тем не менее, похоже, что Apple обрабатывает такой serachbar по-другому.После удаления панели поиска она, похоже, больше не привязана к табличным ячейкам (в Notes.app, а не в Mail.app).
Но, возможно, у Apple есть особый метод для этого нового поведения 3.0, и я просто не могу его найти?
Решение
Может быть, ты сможешь попробовать это таким образом...
[self.tableView setContentOffset:CGPointMake(0,40)];
Другие советы
У меня тоже сработало.Я использовал следующее:
[self.tableView setContentOffset:CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height) animated:NO];
чтобы запросить высоту строки поиска.
Это дает вам точно такое же поведение, как у iPod.app:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
CGFloat searchBarHeight = CGRectGetHeight([[[self searchDisplayController] searchBar] frame]);
if ([[self tableView] contentOffset].y < searchBarHeight)
[[self tableView] setContentOffset:CGPointMake(0, searchBarHeight)];
}
У меня это работает.
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.bounces = YES;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.tableView setContentOffset:CGPointMake(0, 44)];
}
Мне пришлось сначала прокрутить до верха, а затем setContentOffset
Для 0
, Тогда будет видна панель поиска :
self.tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: false)
self.tableView.setContentOffset(CGPointMake(0, 0), animated: false)
Мне вроде как нравится делать это таким образом:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// Hide the table view header by default.
NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionTop animated:NO];
}
Таким образом, вам действительно не нужно беспокоиться о том, насколько высок ваш заголовок.Это просто работает!