Показати рядок пошуку на панелі навігації без прокрутки на iOS 11


80

Я прикріплюю UISearchController до navigationItem.searchControllerвластивості UITableViewController на iOS 11. Це чудово працює: я можу використовувати приємний рядок пошуку в стилі iOS 11.

Однак я хотів би зробити рядок пошуку видимим під час запуску. За замовчуванням користувач повинен прокрутити угору в поданні таблиці, щоб побачити рядок пошуку. Хтось знає, як це можливо?

введіть тут опис зображення введіть тут опис зображення

Зліва: ситуація за замовчуванням після запуску. Вправо: рядок пошуку стає видимим (прокручуючи вгору). Я хотів би, щоб панель пошуку була видимою після запуску, як на правому скріншоті.

Я вже виявив, що рядок пошуку можна зробити видимим, встановивши для властивості hidesSearchBarWhenScrollingмого елемента навігації значення false. Однак це призводить до того, що рядок пошуку завжди буде видимим - навіть під час прокрутки вниз -, що я не хочу.


там, де ви додали кодhidesSearchBarWhenScrolling
Anbu.Karthik

1
а як щодо встановлення його як s firstResponder?
Milan Nosáľ

2
Вибрана відповідь нижче працює для мене під час завантаження, але я також хотів би повторно відобразити контролер пошуку при програмному прокручуванні до початку за допомогою scrollView.setContentOffset(_:animated). Хтось має пропозицію?
Джастін Валлелі

@Jonathan hidesSearchBarWhenScrolling = falseрозміщує рядок пошуку над великим заголовком в iOS 13. Будь-яка ідея, чи можу я це якось оновити?
Bonnke

Відповіді:


187

Наведене нижче робить панель пошуку спочатку видимою, а потім дозволяє їй сховатися під час прокрутки:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = true
    }
}

Використання isActiveне зробило того, що я хотів, воно робить рядок пошуку активним (відображається кнопка скасування тощо), коли все, що я хочу, це щоб його було видно.


Дякую, працював у мене. Хоча
цікаве

9
Це рішення працює, але є побічні ефекти, якщо ви також відображаєте панель навігації, якщо вона раніше була прихованою (тобто натискання цього подання з панеллю пошуку на стек навігації) Рядок пошуку буде виглядати статичним на місці, коли панель навігації анімується. Виглядає жахливо :(
Метью Креншоу

12
Ні, якщо ви покладете першу частину viewDidLoadзамістьviewWillAppear
Марк-Александр Берубе

1
Хтось може пояснити, чому це працює, а чому searchController.searchBar.isHidden = falseв viewDidLoad ні? Останнє видається мені набагато логічнішим
pho_pho

5
Це спричиняє візуальну помилку в iOS 13 при поверненні з дочірнього екрану.
nemissm

5

Ви можете встановити для властивості isActiveзначення trueпісля додавання searchController до navigationItem.

Просто так:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}

Немає методу сетера 'setIsActive:'
Микола Краснов

Ви маєте рацію, @ NikolayKrasnov. isActiveє логічним значенням лише для читання. Ви searchController.active = trueзамість цього захочете використовувати .
Mark Jeschke

2

Для мене це спрацювало після додавання наступних рядків у viewDidLoad()метод:

navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()

0

На iOS 13 відповідь @Jordan Wood не спрацювала. Натомість я зробив:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIView.performWithoutAnimation {
        searchController.isActive = true
        searchController.isActive = false
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.