Я хочу разместить панель поиска в новой панели навигации с новыми iOS 11 большими заголовками. Тем не менее, цвет панели поиска автоматически применяется iOS, и я не могу его изменить.

if #available(iOS 11.0, *) {
    let sc = UISearchController(searchResultsController: nil)
    navigationItem.searchController = sc
    navigationItem.hidesSearchBarWhenScrolling = false
}

Строка поиска имеет глубокий синий фон, но я просто хочу изменить его на белый.

enter image description here

Установка цвета фона приводит к этому:

navigationItem.searchController?.searchBar.backgroundColor = UIColor.white

enter image description here

Я пробовал также setScopeBarButtonBackgroundImage и setBackgroundImage в строке поиска, но все выглядит совершенно странно.

Также, когда я запускаю поиск, нажимая на строку поиска, он переключается в режим с кнопкой отмены справа. («Abbrechen» на немецком языке)

enter image description here

И цвет текста «Abbrechen» также нельзя изменить. (нужно тоже белое)

Любая помощь приветствуется.

Редактировать: По запросу, вот код для стиля панели навигации:

self.navigationBar.tintColor = UIColor.myWhite
self.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.myWhite, NSAttributedStringKey.font: UIFont.myNavigationBarTitle()]
self.navigationBar.barTintColor = UIColor.myTint

if #available(iOS 11.0, *) {
    self.navigationBar.prefersLargeTitles = true
    self.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.myWhite, NSAttributedStringKey.font: UIFont.myNavigationBarLargeTitle()]
}

Текущий результат: я использовал идею Круналса, чтобы установить цвет фона панели поиска, но затем закругленные углы теряются. После переустановки закругленных углов анимация панели поиска, похоже, нарушена.

enter image description here

Так что до сих пор нет удовлетворительного решения. Похоже, что панель поиска при встраивании в панель навигации в iOS 11 не представляется возможным настроить. Между тем мне было бы достаточно просто изменить цвет текста заполнителя, но даже это кажется невозможным. (Я пробовал несколько подходов из StackOverflow - не работает)

24
Darko 1 Сен 2017 в 13:14

7 ответов

Лучший ответ

Теперь это то, что вы хотите ...

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

}

< Сильный > Результат :

enter image description here

enter image description here


С закругленным углом:
Анимация с закругленным углом тоже работает нормально.

enter image description here

21
Darko 16 Сен 2017 в 07:02

Вот код, который я использовал, чтобы сделать панель поиска белым:

if let textfield = searchController.searchBar.value(forKey: "searchField") as? UITextField {
            if let backgroundview = textfield.subviews.first {
                backgroundview.backgroundColor = UIColor.init(white: 1, alpha: 1)
                backgroundview.layer.cornerRadius = 10
                backgroundview.clipsToBounds = true
            }
        }

enter image description here

1
iOS_Mouse 6 Мар 2018 в 23:31

Это должно работать для вас

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

            if let navigationbar = self.navigationController?.navigationBar {
                //navigationbar.tintColor = UIColor.green
                //navigationbar.backgroundColor = UIColor.yellow
                navigationbar.barTintColor = UIColor.blue
            }

            navigationController?.navigationBar.tintColor = UIColor.green
            navigationItem.searchController = sc
            navigationItem.hidesSearchBarWhenScrolling = false
        }
}


< сильный > Результат :

enter image description here

enter image description here

4
Krunal 1 Сен 2017 в 10:50

Я изменил фон текстового поля с помощью этого кода внутри AppDelegate.

Swift 4

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        //background color of text field
         UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = .cyan
        
        }

Это результат

example used to change the background to cyan color

3
Community 20 Июн 2020 в 09:12

Проверено на ios 13

Идеальный белый фон на панели поиска

func setupSearchbarController(){
    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.white
            textfield.backgroundColor = UIColor.white
            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 = AppColor.themeColor
        }
        navigationItem.searchController = sc
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}
1
Ashu 17 Окт 2019 в 07:47

Попробуйте этот код,

UITextField *txfSearchField = [_searchBar valueForKey:@"_searchField"];
txfSearchField.backgroundColor = [UIColor redColor];
0
AshokPolu 1 Сен 2017 в 10:27

Цель С

if (@available(iOS 11.0, *)) {
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.searchResultsUpdater = self;
    self.searchController.searchBar.delegate = self;
    self.searchController.dimsBackgroundDuringPresentation = NO;
    self.navigationItem.searchController=self.searchController;
    self.navigationItem.hidesSearchBarWhenScrolling=NO;
    self.searchController.searchBar.searchBarStyle = UISearchBarStyleProminent;
    self.searchController.searchBar.showsBookmarkButton = NO;
    self.searchController.searchBar.placeholder = @"Search";
    self.searchController.searchBar.tintColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
    self.searchController.searchBar.barTintColor=[UIColor colorWithRed:1 green:1 blue:1 alpha:1];
    UITextField *txfSearchField = [self.searchController.searchBar valueForKey:@"_searchField"];
    txfSearchField.tintColor=[UIColor colorWithRed:21/255.0 green:157/255.0 blue:130/255.0 alpha:1];
    txfSearchField.textColor=[UIColor colorWithRed:1 green:1 blue:1 alpha:1];
    txfSearchField.backgroundColor=[UIColor whiteColor];
    UIView *backgroundview= [[txfSearchField subviews]firstObject ];
    backgroundview.backgroundColor=[UIColor whiteColor];
    // Rounded corner
    backgroundview.layer.cornerRadius = 8;
    backgroundview.clipsToBounds = true;
}
2
nkitku 16 Окт 2017 в 12:50