Панель поиска IOS 7 UISearchDisplayController перекрывает строку состояния при поиске
Я обновляю свое приложение для iOS 7, и в настоящее время я настраиваю все мои представления для новой прозрачной строки состояния (мое приложение будет по-прежнему использовать непрозрачные панели навигации).
Его было относительно легко настроить для строки состояния в каждом представлении, за исключением одной серьезной проблемы, с которой я столкнулся с UISearchBar, подключенным к UISearchDisplayController в одном из моих контроллеров представления.
Панель поиска отображается нормально, как показано ниже:
Проблема в том, что как только я начинаю поиск, панель навигации исчезает (как и должно быть), но все остальное также перемещается вверх, чтобы перекрыть строку состояния:
Похоже, это не работает должным образом, поскольку затемнение экрана происходит на 20 пикселей ниже панели поиска, где строка поиска должна заканчиваться.
Есть ли в iOS 7 встроенное решение для этого? Я бы предпочел не настраивать фрейм вручную для каждого просмотра каждый раз, когда пользователь начинает и заканчивает поиск.
Спасибо!
Ответы
Ответ 1
Спасибо, hodade за то, что он вел меня на правильном пути! Ваше решение сработало, за исключением того, что оно только перемещало рамку панели поиска, оставляя мои другие подпункты в неправильном месте. Единственное, что я изменил, это переместить все подзоны на мой взгляд, а также оживить его.
Спасибо!
-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
[UIView animateWithDuration:0.25 animations:^{
for (UIView *subview in self.view.subviews)
subview.transform = CGAffineTransformMakeTranslation(0, statusBarFrame.size.height);
}];
}
}
-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
[UIView animateWithDuration:0.25 animations:^{
for (UIView *subview in self.view.subviews)
subview.transform = CGAffineTransformIdentity;
}];
}
}
Ответ 2
Помещение следующей строки в viewDidLoad исправлено для меня:
self.edgesForExtendedLayout = UIRectEdgeNone;
Ответ 3
Вы не можете использовать полупрозрачную навигационную панель?
Если это так, это решит проблему.
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
self.navigationController.navigationBar.translucent = YES;
}
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
self.navigationController.navigationBar.translucent = NO;
}
Ответ 4
Просто разместите следующий код в - (void) ViewDidLoad. Он будет работать для iOS 7 и более поздней версии
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
UPDATE:
if(SYSTEM_VERSION_GREATER_THAN(@"6.1")) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
Ответ 5
Это, похоже, описывает проблему, с которой я столкнулся; надеюсь, это поможет кому-то в моем бывшем посту.
-
Подкласс вашего SearchDisplayController, который был добавлен в ваш UIViewController/UITablewViewController,
-
Добавьте что-то подобное к его реализации:
- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
[super setActive:visible animated:animated];
[self.searchContentsController.navigationController setNavigationBarHidden: NO animated: NO];
CGRect frame = self.searchResultsTableView.frame;
frame.origin.y = CGRectGetHeight(self.searchContentsController.navigationController.navigationBar.frame);
frame.size.height = CGRectGetHeight(frame) - CGRectGetMinY(frame);
self.searchResultsTableView.frame = frame;
frame = self.searchBar.frame;
self.searchBar.frame = frame;
[self.searchContentsController.view insertSubview:self.searchBar aboveSubview:self.searchResultsTableView];
}
Ответ 6
Я сделал код ниже, чтобы решить проблему.
- (void) viewDidLayoutSubviews
{
if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
CGRect viewBounds = self.view.bounds;
CGFloat topBarOffset = self.topLayoutGuide.length;
viewBounds.origin.y = topBarOffset * -1;
self.view.bounds = viewBounds;
}
}
Ответ 7
Я думаю, может быть, добавить это в viewDidLoad, поможет:
if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
{
self.edgesForExtendedLayout = UIRectEdgeNone;
}
Ответ 8
просто добавьте
self.definesPresentationContext = YES;
вы можете прочитать больше здесь: UISearchController и определяетPresentationContext
и из документации Apple: Документация UISearchController
Примечание: UISearchDispalyController устарел в iOS7, вместо этого использует UISearchController в iOS8, метод выше использует UISearchController
Ответ 9
В моем случае представления под панелью поиска находились в правильном месте, только строка поиска перекрывала строку состояния. В этом случае этот мир кода работает нормально:
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frame = self.searchBar.frame;
frame.origin.y += statusBarFrame.size.height;
self.searchBar.frame = frame;
}
}
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frame = self.searchBar.frame;
frame.origin.y -= statusBarFrame.size.height;
self.searchBar.frame = frame;
}
}
Надеюсь, что это будет полезно для других.
Ответ 10
-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frame = controller.searchBar.frame;
frame.origin.y += statusBarFrame.size.height;
controller.searchBar.frame = frame;
}
}
-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frame = controller.searchBar.frame;
frame.origin.y -= statusBarFrame.size.height;
controller.searchBar.frame = frame;
}
}
Ответ 11
Вышеуказанные ответы работают только в том случае, если у вас нет скрытой панели навигации . Если у вас есть скрытая навигационная панель, попробуйте следующее:
-(void)viewDidAppear:(BOOL)animated{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
[self.tableView setFrame:CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y+statusBarFrame.size.height, self.tableView.frame.size.width, self.tableView.frame.size.height)];
}
}
Основываясь на этом сообщении: UISearchBar перекрывает строку состояния в iOS
Ответ 12
Подкласс вашего SearchDisplayController
, который был добавлен в ваш UIViewController/UITablewViewController
, и добавьте его в его реализацию -
- (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];
}
}