iOS 11 панель поиска в навигационной панели


с iOS 11 Apple переработала UISearchBar, сделав углы более круглыми и высоту больше. Добавление UISearchBar в навигационную панель довольно просто, просто установив его как titleView navigationItem с помощью navigationItem.titleView = searchBar.

однако в iOS 11 он, похоже, больше не работает, как ожидалось. Посмотрите на экраны, где мы сравниваем одну и ту же настройку с помощью iOS 10 и iOS 11

iOS 10

iOS 11

вы можете ясно видеть, что панель поиска увеличивает размер панели навигации, но кнопки панели не выровнены правильно. Кроме того, панель поиска больше не использует доступное пространство слева.

помещая панель поиска в вид обертки, чтобы получить кнопку отмены на iPad, как описано здесь кнопка отмены не отображается в UISearchBar также больше не работает, так как панель поиска тогда не видна все.

Если у кого есть подобные вопросы и уже знает, как исправить/улучшить это, я был бы очень благодарен.

Это было построено с использованием Xcode 9 Beta 4. Возможно, будущие выпуски исправят эту проблему.

обновление:

Так как это не исправлено, мы решили использовать следующее решение. Мы добавили новый UIBarButtonItem в навигационную панель, которая затем представляет новый ViewController, где мы только помещаем панель поиска и ничего больше в навигационную панель, которая кажется, работает. Использование выбранного ответа может быть лучшим решением, так как Apple с iOS 11 хочет, чтобы мы использовали этот новый дизайн, даже если он не дает нам результат, который мы изначально хотели. Другим способом возможного решения этой проблемы может быть пользовательская панель поиска, но это еще одна тема.

5 65

5 ответов:

есть новое свойство searchController на navigationItem в iOS 11.

https://developer.apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller

использовать такой...

if #available(iOS 11.0, *) {
     navigationItem.searchController = searchController
} else {
     // Fallback on earlier versions
     navigationItem.titleView = searchController?.searchBar
}

в Objective-C оператор if выглядит следующим образом:

if (@available(iOS 11.0, *)) {

на iOS 11, Если вы не установите navigationItem.hidesSearchBarWhenScrolling = false в строке поиска может быть скрыта, если пользователь прокручивает вниз, чтобы показать его. Если вы установите его в false, оказывается укладывается ниже, где заголовок будет идти без необходимости прокрутки пользователем.

вы можете изменить высоту UISearchBar в iOS 11, добавив ограничение высоты 44:

if #available(iOS 11.0, *) {
    searchBar.heightAnchor.constraint(equalToConstant: 44.0).isActive = true
}

У меня была такая же проблема, и через несколько дней, погуглив проблему, я нашел эту страницу - https://translate.google.com/translate?hl=en&sl=zh-CN&u=http://www.jianshu.com/p/262f6e34a7d3&prev=search.

эта страница ведет к этому git repo -https://github.com/DreamTravelingLight/searchBarDemo - этот демонстрационный проект показывает, как использовать старый способ с titleView, чтобы все еще иметь панель поиска без проблемы с размером.

ключевые строки: эти

_searchBar = [self addSearchBarWithFrame:CGRectMake(0, 0, kScreenWidth - 2 * 44 - 2 * 15, 44)];
UIView *wrapView = [[UIView alloc] initWithFrame:_searchBar.frame];
[wrapView addSubview:_searchBar];
self.navigationItem.titleView = wrapView;

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

спасибо, Дэвид

Я думаю, вам придется иметь дело с установкой нового UINavigationItem.свойство searchController для объекта UISearchController. Вот как вы получаете новый эффект, как видно из сообщений. Похоже, что старое поведение просто исчезло. Надеюсь, я ошибаюсь, но весь API получил капитальный ремонт для 11. Я знаю, что это багги в целом, поэтому мы увидим с новыми бета-версиями и GM, если это будет исправлено. (Запись во время бета 6)

это помогло мне:

    if ([self.navigationItem respondsToSelector:@selector(setSearchController:)])
    {
        [self.navigationItem performSelector:@selector(setSearchController:) withObject:self.searchController];
    }
    else
    {
        self.tableView.tableHeaderView = self.searchController.searchBar;
    }