Цвет кнопки отмены UISearchBar?

Когда я добавляю UISearchBar в свой вид в Interface Builder и меняю его стиль на Black Opaque, кнопка отмены остается неуместно синей/серой и не становится черной.

Как сделать кнопку отмены черной?

РЕДАКТИРОВАТЬ: это работает так:

// Assume a UISearchBar searchBar.
NSArray *subviews = [searchBar subviews];

// The index depends on how you configure the searchBar.
UIButton *cancelButton = [subviews objectAtIndex:3];

// Set the style to "normal" style.
[cancelButton setStyle:0];

Но метод setStyle: относится к частному фреймворку, поэтому это может быть проблемой при отправке приложения в Apple.


person cactus    schedule 07.05.2010    source источник
comment
вместо использования [canelButton setStyle:0] используйте cancelButton.tintColor=[UIColor blackColor];   -  person Priyanka V    schedule 16.05.2012


Ответы (11)


Я использовал что-то вроде этого и работал со мной:

[[UIBarButtonItem appearanceWhenContainedIn: [UISearchBar class], nil] setTintColor:[UIColor blackColor]];

он изменил цвет кнопки отмены на черный.

Обновление для iOS 9.0, метод appearanceWhenContainedIn устарел, вместо него используйте appearanceWhenContainedInInstancesOfClasses:

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:[UIColor blackColor]];

И в Свифте 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf:[UISearchBar.self]).tintColor = UIColor.black
person Hossam Ghareeb    schedule 03.04.2013
comment
Устарело в iOS 9: документ Apple. Решение: stackoverflow.com/questions/24136874/ - person Simon Epskamp; 19.09.2015
comment
Не работает на iOS 9. Цвет кнопки остается прежним. - person skyline75489; 01.12.2015
comment
Что с этим безумием голосования? Установите tintColor, работа выполнена - person Adam Waite; 15.03.2016
comment
@AdamWaite tintColor меняет цвет курсора и кнопки «Отмена». - person Chaitanya Shah; 25.03.2016
comment
@ChaitanyaShah просто установил для searchBar tintColor желаемый цвет кнопки «Отмена», а для внешнего вида UITextFieldWhenContainedIn... — другой цвет. - person leonaka; 22.10.2016
comment
Swift 3: UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).tintColor = UIColor.black - person iStar; 15.04.2017
comment
Это не работает, если установлено после создания экземпляра UISearchBar. - person Misha; 17.07.2017
comment
Спас день! Элегантный и красивый - person Tim Friedland; 26.07.2017

Проблема с вашим решением заключается в том, что код предполагает, что objectAtIndex:3 является кнопкой отмены. Это не только генерирует предупреждение компилятора, но и если вы программно отображаете кнопку «Отмена» (например, используя [searchBar setShowsCancelButton:YES], вы рискуете привести к сбою приложения.

Более простое решение — установить стиль всей панели поиска в ViewDidLoad(), используя:

searchBar.tintColor = [UIColor colorWithWhite:0.3 alpha:1.0];

это переопределяет стиль, установленный в построителе интерфейсов, НО также изменяет цвет кнопки «Отмена», чтобы он был того же цвета, что и вся полоса (хотя, к сожалению, это не позволяет вам установить стиль кнопки «Отмена» независимо).

person Alun    schedule 07.09.2010
comment
Мы также можем изменить цвет кнопки отмены независимо от цвета панели поиска. searchBar=[[UISearchBar alloc]initWithFrame:CGRectMake(10,346,300,0)]; searchBar.tintColor=[Повторно используемые SKColorFromHexString:@#505a62]; searchBar.delegate=я; searchBar.showsCancelButton=ДА; NSArray *subviews = [подвиды searchBar]; // Индекс зависит от того, как вы настроите searchBar. UIButton *cancelButton = [subviews objectAtIndex:2]; cancelButton.tintColor=[UIColor lightTextColor]; - person Priyanka V; 16.05.2012

Попробуйте это и посмотрите: (я протестировал приведенный ниже код с помощью Swift 4.1 - Xcode 9.3-beta4)

@IBOutlet weak var sbSearchBar: UISearchBar!

sbSearchBar.showsCancelButton = true
sbSearchBar.barTintColor = UIColor.blue
sbSearchBar.tintColor = UIColor.red

if let buttonItem = sbSearchBar.subviews.first?.subviews.last as? UIButton {
    buttonItem.setTitleColor(UIColor.yellow, for: .normal)
}

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

person Krunal    schedule 15.03.2018
comment
Привет, я думаю, вам следует использовать first(where:), чтобы найти UINavigationButton ```, если пусть cancelItem = searchBar.subviews.first?.subviews.first(где: {$0 — UIButton}) как? UIButton { cancelItem.setTitleColor(UIColor.black, for: .normal) } ``` - person Arco; 18.10.2018

В Свифт 4.2

let appearance = UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self])
appearance.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor(named: "goldColor")!], for: .normal)

Это работает для меня. Спасибо @ Тим Семпл

person black_pearl    schedule 28.11.2018

Это обновленная версия ответа Хоссама Гариба выше для Swift 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self] ).tintColor = UIColor.red

Но это не переопределит внешний вид, если он уже был установлен в другом месте для UIBarButtonItem.

Например, в моем контроллере навигационной панели мне пришлось изменить это:

UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal)

Для этого, чтобы решение выше работало:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self] ).setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal)
person Tim Semple    schedule 13.02.2017

для iOS 10:

UISearchBar.appearance().tintColor = UIColor.red //cancel button color
UISearchBar.appearance().barTintColor = UIColor.blue //background button color
person MobileMon    schedule 08.05.2017
comment
Помещение этого в AppDelegate.application() устанавливает его глобально для вашего приложения, что идеально подходит для меня. Просто и эффективно. - person Dale; 10.07.2018

Я взял ответ Бенджамина и объединил его с безопасным Array поиском, чтобы получить короткую, но безопасную функциональную версию:

searchController.searchBar.tintColor = UIColor.whiteColor()
(searchController.searchBar.subviews[safe: 0]?.subviews as? [UIView])?
    .filter({$0.isKindOfClass(UITextField)})
    .map({$0.tintColor = .lightGrayColor()})

В результате кнопка «Отмена» окрашивается в белый цвет, а курсор при наборе текста становится серым. В противном случае он был бы белым и поэтому не был бы виден. searchController — это объект типа UISearchController. Если кто-то хочет использовать его внутри контроллера результатов, замените его на self.

Реализация индекса safe:: ">ответ нкукушкина:

extension Array {
    subscript(safe index: Int) -> T? {
        return indices(self) ~= index ? self[index] : nil
    }
}
person Michal    schedule 10.09.2015

Нажмите на панель поиска и установите цвет tint в представлении из Interface Builder.

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

person Rishab    schedule 21.10.2016

let view: UIView = self.searchBar.subviews[0] as UIView
let subViewsArray = view.subviews

for subView: UIView in subViewsArray {
    if let cancelButt = subView as? UIButton{
        cancelButt.setTitleColor(UIColor.white, for: .normal)         
    }
}

Это сработало для меня

person Ghadeer    schedule 31.12.2016

Придумал следующее решение, и оно также работает на iOS 13.0 и iOS 12.4, должно работать и с предыдущими версиями до iOS 9.0. Следующее решение предназначено для:

  1. Цвет кнопки отмены (обычное состояние).
  2. Цвет кнопки отмены (неактивное состояние).
  3. Цвет фона текстового поля панели поиска (обычное состояние).

Для цели C:

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:[UIColor whiteColor]]; 

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateNormal];

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateDisabled];

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitleTextAttributes:@{NSBackgroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateNormal];

Приведенный выше код также исправил мои проблемы с пользовательским интерфейсом для iOS 13 и iPhone X. Я включил этот код в свой класс AppDelegate.m в функции didFinishLaunchingWithOptions, чтобы можно было внести изменения. во всем приложении.

person Syed Faizan Ahmed    schedule 07.01.2020

Для тех, кто хочет воспроизвести такое же поведение в Swift:

override func viewWillAppear(animated: Bool) {
    self.searchBar.tintColor = UIColor.whiteColor()

    let view: UIView = self.searchBar.subviews[0] as! UIView
    let subViewsArray = view.subviews

    for (subView: UIView) in subViewsArray as! [UIView] {
        println(subView)
        if subView.isKindOfClass(UITextField){
            subView.tintColor = UIColor.blueColor()
        }
    }

}
person Benjamin    schedule 14.04.2015