UISearchController Настройка iOS 11

Я использовал следующий код до iOS 11, чтобы настроить внешний вид панели поиска UISearchController:

var searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.setDefaultSearchBar()
searchController.searchResultsUpdater = self

if #available(iOS 11.0, *) {
    navigationItem.searchController = searchController
} else {
    tableView.tableHeaderView = searchController.searchBar
}

extension UISearchBar {
    func setDefaultSearchBar() {
        self.tintColor = UIColor.blue
        self.searchBarStyle = .minimal
        self.backgroundImage = UIImage(color: UIColor.clear)
        let searchBarTextField = self.value(forKey: "searchField") as! UITextField
        searchBarTextField.textColor = UIColor.white
        searchBarTextField.tintColor = UIColor.blue
        searchBarTextField = .dark
    }
}

Однако внешний вид панели поиска не обновляется при запуске того же кода в iOS 11.

iOS 10:

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

iOS 11:

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

Большая часть внимания к этому вопросу до сих пор была сосредоточена на цвете текста в строке поиска. Я смотрю не только на это - цвет фона, цвет оттенка, индикатор поиска, цвет кнопки очистки и т. д.


person Alexander MacLeod    schedule 13.08.2017    source источник
comment
Хороший вопрос, но я не удивлюсь, если, когда вы примете представление об управлении полем поиска через панель навигации, среда выполнения наложит на него свой собственный взгляд. Возможно, вы сможете применить свои настройки, отложив их до тех пор, пока среда выполнения не сможет настроить саму панель поиска, но это всего лишь предположение, и меня не удивит, если это тоже не сработает.   -  person matt    schedule 13.08.2017
comment
Вы можете добиться такой настройки, используя прокси внешнего вида. Однако, по моему опыту, это было ошибкой - панель сначала выглядит именно так, как я хочу, но когда другой контроллер представления скрывает ее, она теряет закругленные углы.   -  person Andy Ibanez    schedule 19.08.2017
comment
Попробуйте применить внешний вид шрифта к полю поиска (белый цвет шрифта).   -  person LLIAJLbHOu    schedule 21.08.2017
comment
Попробуйте добавить searchController.searchBar.tintColor = UIColor.white Должно сработать.   -  person Nishant Bhindi    schedule 22.08.2017
comment
Какую версию iOS11 вы используете? Вы сделали полную очистку проекта? Возможно это баг ОС. Однако я постараюсь воспроизвести его и вскоре дам вам обратную связь...! @NishantBhindi, он уже делает это...   -  person Andrea Vultaggio    schedule 24.08.2017
comment
Я использую последнюю бета-версию iOS 11 @AndreaVultaggio   -  person Alexander MacLeod    schedule 24.08.2017
comment
попробуйте установить navigationItem textColor   -  person Wayne    schedule 26.08.2017
comment
Разместите пример проекта на GitHub, возможно, так вы получите дополнительную помощь.   -  person Wayne    schedule 26.08.2017
comment
У меня те же проблемы: stackoverflow.com/questions/45997996 /   -  person Darko    schedule 01.09.2017


Ответы (9)


Я только что узнал, как их установить: (с помощью Брэндона и Крунала, спасибо!)

Текст «Отмена»:

searchController.searchBar.tintColor = .white

Значок поиска:

searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.search, state: .normal)

Значок очистки:

searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.clear, state: .normal)

Текст поиска:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]

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

Заполнитель:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).attributedPlaceholder = NSAttributedString(string: "placeholder", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])

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

Белый фон:

if #available(iOS 11.0, *) {
    let sc = UISearchController(searchResultsController: nil)
    sc.delegate = self
    let scb = sc.searchBar
    scb.tintColor = UIColor.white
    scb.barTintColor = UIColor.white

    if let textfield = scb.value(forKey: "searchField") as? UITextField {
        textfield.textColor = UIColor.blue
        if let backgroundview = textfield.subviews.first {

            // Background color
            backgroundview.backgroundColor = UIColor.white

            // Rounded corner
            backgroundview.layer.cornerRadius = 10;
            backgroundview.clipsToBounds = true;
        }
    }

    if let navigationbar = self.navigationController?.navigationBar {
        navigationbar.barTintColor = UIColor.blue
    }
    navigationItem.searchController = sc
    navigationItem.hidesSearchBarWhenScrolling = false
}

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

Взято из здесь.

person Darko    schedule 02.09.2017
comment
Опять же, этот ответ не очень хорош с цветами. Цвет фона панели навигации всегда кажется темнее, чем указанный вами. - person Alexander MacLeod; 21.09.2017
comment
Привет @AlexanderMacLeod, ты это исправил? - person sancho; 26.09.2017
comment
Следует иметь в виду, что, как и во всех разработчиках iOS, использование любого value:forKey: считается доступом к частным водам API и, скорее всего, будет противоречить условиям Apple. - person Will Von Ullrich; 26.09.2017
comment
ПОЧЕМУ APPLE ЛОМАЕТ ВЕЩИ В КАЖДОМ ВЫПУСКЕ - person hhanesand; 02.10.2017
comment
Этот ответ почти спас меня! Спасибо! Единственная проблема заключается в том, что когда вы перемещаетесь между контроллерами представления, на фоне области навигации мгновенно появляется черная анимированная строка. - person Konstantinos; 04.10.2017
comment
@Konstantinos У меня такая же проблема, вы нашли быстрое решение? - person iruleonu; 07.11.2017
comment
Одна проблема с кодом белого фона: тонкая белая линия появляется над полем поиска при опускании табличного представления. У кого-нибудь есть решение для этого? - person Ely; 07.11.2017
comment
@iruleonu, к сожалению, нет, если вы имеете в виду черный анимированный ряд ... проблема. - person Konstantinos; 19.11.2017
comment
@Konstantinos оказалось, что это цвет фона родительского представления. (эта панель поиска находилась в UIViewController, установленном как корень UINavigationController внутри UITabBarController) - person iruleonu; 19.11.2017
comment
Другая проблема заключается в том, что цвет фона не белый, а беловатый. Кажется, я никак не могу это изменить. Делаю свою реализацию и живу без интеграции с навигацией. - person Warpzit; 03.06.2019
comment
Я нашел решение для белизны. Решение состоит в том, чтобы использовать searchBar.setSearchFieldBackgroundImage(backgroundImage, for: .normal) с прозрачным изображением. Если кому-то нужно решение, напишите мне, и я добавлю его. - person Warpzit; 03.06.2019
comment
navigationbar.isTranslucent = false также потребуется для панели навигации - person Amr Angry; 13.02.2020
comment
Лучший ответ! Перепробовал десятки способов и только этот сработал - person Alexei Mikhailov; 22.01.2021

Чтобы правильно установить белый цвет текста, введенного в строку поиска, используйте (при использовании темного цвета поля):

searchController.searchBar.barStyle = .black

Чтобы установить цвет фона текстового поля

if #available(iOS 11.0, *) {

        if let textfield = searchController.searchBar.value(forKey: "searchField") as? UITextField {
            if let backgroundview = textfield.subviews.first {

                // Background color
                backgroundview.backgroundColor = UIColor.white

                // Rounded corner
                backgroundview.layer.cornerRadius = 10;
                backgroundview.clipsToBounds = true;
            }
        }
    }

Однако, используя что-то вроде

textfield.textColor = UIColor.blue

выше, похоже, не работает.

person Zyntx    schedule 04.12.2017

Попробуйте настроить стиль панели поиска.

searchController.searchBar.barStyle = UIBarStyleBlack;

изображение 1

person Eddie Hsu    schedule 26.09.2017
comment
Превосходно! Это переключает цвет текста с черного на белый. - person Ashley Mills; 17.10.2017

Перемещение вызова setDefaultSearchBar в viewDidAppear должно исправить это.

person Ben Affleck    schedule 21.08.2017
comment
Этот ответ работает с некоторыми свойствами, такими как цвет текста, но не с фоновым изображением. Это также оставляет уродливое изменение привязки при нажатии между представлениями. - person Alexander MacLeod; 22.08.2017
comment
@AlexanderMacLeod очень жаль, но я думаю, вы правы, это не сработает для всех реквизитов :( - person Ben Affleck; 19.09.2017

Вам нужно найти UISearchBar, лежащий в основе UITextField, и изменить цвет его текста.

Обратите внимание, что это действует только тогда, когда контроллер поиска собирается представить (UISearchControllerDelegate.willPresentSearchController) или представить.

class ViewController : UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // setup your search controller...

        // set search controller's delegate
        navigationItem.searchController?.delegate = self
    }
}

extension ViewController : UISearchControllerDelegate {

    func willPresentSearchController(_ searchController: UISearchController) {
        // update text color
        searchController.searchBar.textField?.textColor = .white
    }
}

extension UISearchBar {

    var textField: UITextField? {
        for subview in subviews.first?.subviews ?? [] {
            if let textField = subview as? UITextField {
                return textField
            }
        }
        return nil
    }
}
person Jonny    schedule 24.08.2017
comment
Спасибо, вы спасли мой день) Настроить UISearchBar в IOS действительно сложно. - person Marina; 18.01.2018

Попробуйте: searchController.<YOUR SEARCHBAR>.barStyle = .blackOpaque вместо self.searchBarStyle = .minimal.

Таким образом:

var searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.setDefaultSearchBar()
//Add this line below
searchController.searchBar.barStyle = .blackOpaque
searchController.searchResultsUpdater = self

if #available(iOS 11.0, *) {
    navigationItem.searchController = searchController
} else {
    tableView.tableHeaderView = searchController.searchBar
}

extension UISearchBar {
    func setDefaultSearchBar() {
        self.tintColor = UIColor.blue
        //Delete this line below
        self.searchBarStyle = .minimal
        self.backgroundImage = UIImage(color: UIColor.clear)
        let searchBarTextField = self.value(forKey: "searchField") as! UITextField
        searchBarTextField.textColor = UIColor.white
        searchBarTextField.tintColor = UIColor.blue
        searchBarTextField = .dark
    }
}
person Hoff Silva    schedule 14.04.2018

Если вам нужно изменить цвет фона текстового поля в строке поиска, см. мой ответ здесь: https://stackoverflow.com/a/46315974/1109892

person Adam Studenic    schedule 20.09.2017
comment
Ваш ответ не особенно хорошо работает с цветами - они всегда кажутся намного темнее, чем вы указываете в коде. - person Alexander MacLeod; 20.09.2017
comment
Да, я знаю, но это лучшее, что я мог получить. Дайте мне знать, если вы найдете обходной путь. - person Adam Studenic; 21.09.2017

Вы должны получить доступ к UITextField внутри UISearchBar. Вы можете сделать это, используя

let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField

textFieldInsideSearchBar?.textColor = yourcolor

OR

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

person yogesh wadhwa    schedule 24.08.2017
comment
Вероятно, у вас есть четкий оттенок цвета, это единственная причина, по которой я мог попытаться установить изображение _searchBar.tintColor = [UIColor redColor]; - person yogesh wadhwa; 24.08.2017

person    schedule
comment
Возможно, вы могли бы объяснить свой ответ немного больше? Ответы только на код, как правило, не самые полезные. - person Antimony; 15.11.2017