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

enter image description here

if #available(iOS 11.0, *) {
    navigationController?.navigationBar.prefersLargeTitles = false
    let searchController = UISearchController(searchResultsController: nil)
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false

    searchController.searchBar.placeholder = "Suchen"
    searchController.searchBar.tintColor = .white
}

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

Единственное, что работает, - это изменение цвета мигающего курсора и кнопки «отмена», что делается с помощью свойства .tintColor.

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

Может быть, я упускаю из виду этот «автоматический стиль» в iOS 11. Любая помощь приветствуется.

48
Darko 1 Сен 2017 в 23:00

7 ответов

Лучший ответ

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

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

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]

Спасибо за помощь @Brandon!

enter image description here

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

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

enter image description here

Белый фон:

let searchController = UISearchController(searchResultsController: nil)
searchController.delegate = self

let searchBar = searchController.searchBar
searchBar.tintColor = UIColor.white
searchBar.barTintColor = UIColor.white

if let textfield = searchBar.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 = searchController
navigationItem.hidesSearchBarWhenScrolling = false

enter image description here

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

115
Benjohn 13 Дек 2019 в 09:06

Ставить

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

И

UISearchBar.appearance().tintColor = UIColor.white в AppDelegate.

Или же поместите их обоих в [UIViewController viewDidLoad:]

3
Brandon 2 Сен 2017 в 00:55

Установить цвет текста поиска

(UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]) ).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

Задать цвет заполнителя поиска

(UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]) ).attributedPlaceholder = [NSForegroundColorAttributeName: UIColor.white]
2
Donny 27 Сен 2017 в 07:43

В дополнение к ответу Дарко. В моем случае мне нужно получить чистый белый текстовый цвет для поиска. Также мне нужны пользовательские borderLine и cornerRadius. Так что, если я просто установлю цвет фона на белый, установлю радиус угла и линию границы, у меня получится что-то вроде этого. Посмотрите на этот уродливый серый свет, когда вы нажимаете на текстовое поле

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

@interface YourViewController () <UISearchBarDelegate, UISearchControllerDelegate>
// your properties
@property (nonatomic,strong) UISearchController *searchController;
@property (nonatomic,strong) UISearchBar *searchBar;
@end

- (void)viewDidLoad {
[super viewDidLoad];

_searchController = [[UISearchController alloc] initWithSearchResultsController:self.resultsTableController];
_searchController.delegate = self;
_searchController.searchBar.delegate = self;
_searchBar = self.searchController.searchBar;

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

    UITextField *searchTextField = [_searchBar valueForKey:@"searchField"];
if (searchTextField != nil) {
        searchTextField.layer.cornerRadius = 4.f;
        searchTextField.layer.borderWidth = 1.f;
        searchTextField.clipsToBounds = YES;

        for (UIView *subView in searchTextField.subviews) {
            [subView removeFromSuperview];
        }
}

// Color for "Cancel" button
    _searchBar.tintColor = [UIColor blackColor];
// Add searchController to navgationBar
    _navigationItem.searchController = _searchController;
// Hide searchBar when scroll
    _navigationItem.hidesSearchBarWhenScrolling = YES;
}
}

Теперь у меня есть панель поиска с чистым белым фоном, пользовательский cornerRadius, пользовательская ширина границы. Также я отключил серую подсветку при нажатии. Редактирование поля поиска Отставка первого респондента

0
Alex Kolovatov 27 Мар 2018 в 16:52

Этот код меняет цвет фона текстового поля

Swift 4

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        //background color of text field
         UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = .cyan

        }

Отредактировано: образец UISearchBar в голубой

sample

-4
Marta 25 Янв 2018 в 10:53

Мои два цента за Swift 4.x, слегка убранные.

Добавить в контроллер или приложение делегат:

appearance.backgroundColor = .green
let myFont = UIFont.italicSystemFont(ofSize: 12)
let attribs = [
    NSAttributedString.Key(rawValue: NSAttributedString.Key.font.rawValue): myFont,
    NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.red
]

appearance.defaultTextAttributes =  attribs

В контроллере:

self.searchBar.barTintColor = .blue

Вы получите синий фон, зеленый фон панели поиска, красный шрифт:

enter image description here

1
ingconti 30 Дек 2018 в 10:28

Я попробовал решение Daroko, но у меня была проблема при изменении фона на чисто белый цвет (он был серым). Моим решением было использование setSearchFieldBackgroundImage . также я не хочу полагаться на яблочную структуру для получения UITextField

  if #available(iOS 11.0, *) {
     let whiteImage = UIImage(color: UIColor.white, size: CGSize(width: searchController.searchBar.layer.frame.width, height: searchController.searchBar.layer.frame.height))
     searchController.searchBar.setSearchFieldBackgroundImage(whiteImage, for: .normal)
     self.navigationItem.searchController = searchController
     self.navigationItem.hidesSearchBarWhenScrolling = true
 }


public extension UIImage {
  public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
    let rect = CGRect(origin: .zero, size: size)
     UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
     color.setFill()
     UIRectFill(rect)
     let image = UIGraphicsGetImageFromCurrentImageContext()
     UIGraphicsEndImageContext()
     guard let cgImage = image?.cgImage else { return nil }
     self.init(cgImage: cgImage)
} }

Я использовал расширение UIImage из: Создать сплошной цвет UIImage в Swift

0
Gal Danay 21 Апр 2019 в 15:08