Ответ 1
В качестве напоминания для всех, у кого есть подобные проблемы. Мне нужно было добавить эту строку, которая фиксировала вещи:
self.edgesForExtendedLayout = UIRectEdgeNone;
У меня есть UIViewController, в котором я хочу показать tableview с помощью theBar. Как просто:
//viewDidLoad
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0,
0,
SCREEN_WIDTH(),
SCREEN_HEIGHT())
style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;
[self.view addSubview:_tableView];
// adding uisearch bar
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
_tableView.tableHeaderView = searchBar;
//
searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;
Проблема возникает, когда я нажимаю на панель uisearch, чтобы начать анимацию, и похоже, что она имеет нежелательное смещение 20px.
В качестве напоминания для всех, у кого есть подобные проблемы. Мне нужно было добавить эту строку, которая фиксировала вещи:
self.edgesForExtendedLayout = UIRectEdgeNone;
В вашей раскадровке выберите проблемный контроллер, посмотрите вкладку "Атрибуты" и попробуйте изменить эти параметры:
Я решил аналогичную проблему с unflagging этого параметра.
Я нашел причину этой проблемы. Кажется, что анимация перепуталась, когда вы устанавливаете navigationBar.translucent равным NO. Если вы сделаете свой навигационный полупрозрачный, все должно работать нормально, но это определенно не идеальное решение. Я попытаюсь найти обходное решение.
UITableView *_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0,
64,
self.view.frame.size.width,
self.view.frame.size.height)
style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;
[self.view addSubview:_tableView];
// adding uisearch bar
UISearchBar* searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
_tableView.tableHeaderView = searchBar;
//
UISearchDisplayController* searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;
и я просто заказываю контроллер с контроллером UINavigation и его работу достаточно хорошо.
Вы можете отменить анимацию путем подкласса UISearchDisplayController и добавить это:
- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
if(self.active == visible) return;
[self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
[super setActive:visible animated:animated];
[self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
if (visible) {
[self.searchBar becomeFirstResponder];
} else {
[self.searchBar resignFirstResponder];
}
}
codyko дал мне представление. Это было потому, что навигационная панель не была прозрачной. Поэтому я установил его полупрозрачным на этом контроллере представления и остался, когда оставил следующий код:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.navigationController.navigationBar.translucent = NO;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationController.navigationBar.translucent = YES;
}
Теперь, когда панель навигации на этом контроллере немного поблекла, поэтому я добавил UIView
тот же цвет, что и мой навигатор, расположенный позади него, чтобы он выглядел непрозрачным. Я знаю, что это не идеально, но он работает хорошо.
Почему вы создаете searchBar программно, а не в StoryBoard? В настоящее время я использую searchBar, добавленный в раскадровку, и он отлично работает (мне нужно изменить contentOffset)
Я применил ваш код, Он отлично работает для меня. Просто скройте навигационную панель и запустите панель поиска с y = 20 вместо y = 0;