Скрыть UISearchBar до прокрутки пользователя?
Я реализовал панель поиска и контроллер отображения в верхней части таблицы.
Когда представление загружает панель поиска, а относительные области видимости всегда видны.
Есть ли простой способ скрыть его до тех пор, пока пользователь не прокрутит вниз, как это происходит в приложении "Музыка"?
Ответы
Ответ 1
Вам нужно добавить строку поиска в виде заголовка представления таблицы, а затем установить свойство contentoffset
в виде таблицы в viewDidLoad
как,
[self.tableView setContentOffset:CGPointMake(0,44) animated:YES];//or (0, 88) depends on the height of it
Для контроллера отображения поиска вы также можете попробовать это,
[self.searchDisplayController setActive:NO animated:YES];
Ответ 2
другой подход без жесткого кода
[self.tableView setContentOffset:CGPointMake(0.0, self.tableView.tableHeaderView.frame.size.height) animated:YES];
Ответ 3
После нескольких часов вытягивания волос, что-то, что работает
- на iOS 9
- не зависит от количества строк в таблице
-
с переменными строками высоты
С учетом строки поиска находится tableView.tableHeaderView
@interface MyTableViewController ()
@property (nonatomic, assign) BOOL firstLayout;
@end
- (void) viewDidLoad {
[super viewDidLoad];
self.firstLayout = YES;
//your code
}
-(void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
if(self.firstLayout){
CGPoint offset = CGPointMake(0, self.tableView.tableHeaderView.frame.size.height - self.tableView.contentInset.top);
[self.tableView setContentOffset:offset];
self.firstLayout = NO;
}
}
Ответ 4
для iOS 7 и используя UINavigationController
[self.tableView setContentOffset:CGPointMake(0, self.searchBar.height + self.navigationController.navigationBar.height)];
Ответ 5
Лучший способ перезагрузить таблицу в
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
[self performSelector:@selector(reload:) withObject:nil afterDelay:0.0];
self.edgesForExtendedLayout = UIRectEdgeNone;
}
- (void)reload:(__unused id)sender {
[self.searchDisplayController setActive:YES];
[self.tableView reloadData];
[self.refreshControl endRefreshing];
} else {
[self.refreshControl endRefreshing];
[[[UIAlertView alloc]initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];
}
}
Спасибо
Ответ 6
Это отлично работает на iOS9 +
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_async(dispatch_get_main_queue(), ^{
self.tableView.contentOffset = CGPointMake(0, -20);
});
}