Панель поиска IOS 7 UISearchDisplayController перекрывает строку состояния при поиске

Я обновляю свое приложение для iOS 7, и в настоящее время я настраиваю все мои представления для новой прозрачной строки состояния (мое приложение будет по-прежнему использовать непрозрачные панели навигации).

Его было относительно легко настроить для строки состояния в каждом представлении, за исключением одной серьезной проблемы, с которой я столкнулся с UISearchBar, подключенным к UISearchDisplayController в одном из моих контроллеров представления.

Панель поиска отображается нормально, как показано ниже:

Search Bar

Проблема в том, что как только я начинаю поиск, панель навигации исчезает (как и должно быть), но все остальное также перемещается вверх, чтобы перекрыть строку состояния:

Broken Search Bar

Похоже, это не работает должным образом, поскольку затемнение экрана происходит на 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;

}

Ответ 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];
    }
}