stackoverflow.com/a/46908553/7848589

ибудь успешно сохранилUISearchBar вtableHeaderView изUITableView в ios11? Проблемы обычно возникают с iPhone X в ландшафте:

Apple рекомендует использовать новыйsearchController свойство:

if (@available(iOS 11.0, *)) {
    self.navigationItem.searchController = self.searchController;
    self.navigationItem.hidesSearchBarWhenScrolling = NO;
} else {
    self.tableView.tableHeaderView = self.searchController.searchBar;
}

Однако это не всегда работает. Вот пример с кодом:

iOS11 UISearchBar отсутствует в UINavigationBar при встраивании в UISplitViewController

Таким образом, пытаясь сохранитьsearchBar вtableHeaderView - практическим первым шагом является применение соответствующих ограничений автоматического макета:

if (@available(iOS 11.0, *)) {
    UILayoutGuide *guide = self.tableView.safeAreaLayoutGuide;
    searchBar.translatesAutoresizingMaskIntoConstraints = NO;
    [searchBar.leftAnchor constraintEqualToAnchor:guide.leftAnchor].active = YES;
    [searchBar.rightAnchor constraintEqualToAnchor:guide.rightAnchor].active = YES;
}

searchBar тогда правильно отображается при отображении:

Однако проблема возникает, когдаUISearchBar активировано:

Это кажется старой проблемой. Существует множество вопросов и ответов по стеку, связанных с такими проблемами. В этом случае при проверке иерархии представления появляется ширинаUISearchBar установлен неправильно. Так что это можно исправить:

- (void)didPresentSearchController:(UISearchController *)searchController NS_AVAILABLE_IOS(11_0)
{
    if (@available(iOS 11.0, *)) {
        CGRect frame = self.searchController.searchBar.frame;
        frame.size.width = [self safeWidthAvailable];
        self.searchController.searchBar.frame = frame;
    }
}

- (CGFloat)safeWidthAvailable
{
    CGRect frame = ((AppDelegate *)MyApplication.sharedApplication.delegate).window.frame;
    CGFloat width = frame.size.width;
     if (@available(iOS 11.0, *)) {
       UIEdgeInsets insets = ((AppDelegate *)MyApplication.sharedApplication.delegate).window.safeAreaInsets;
       width -= insets.left;
       width -= insets.right;
    }
    return width;
}

Так что это работает:

Пока вы не вращаетесь сUISearchController активные:

Так опятьUISearchController неуместноUISearchBar.

Почему это так сложно?

Одним из решений является сохранение поиска, отключениеUISearchController после поворота и снова включите его с сохраненным поиском. Это работает, но это не должно быть таким сложным.

Какие-либо предложения?

Ответы на вопрос(0)

Ваш ответ на вопрос