Цвят на бутона за отмяна на 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]];

И в Swift 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 просто зададе tintColor на лентата за търсене на желания цвят на бутона за отмяна и UITextField's izgledWhenContainedIn... на друг цвят - 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];

това отменя стила, зададен в Interface Builder, НО също така променя цвета на бутона Отказ, за ​​да бъде същия цвят като цялата лента (въпреки че не ви позволява да зададете стила на бутона Отказ независимо, за съжаление.

person Alun    schedule 07.09.2010
comment
Можем също така да променим цвета на бутона за отказ независимо от цвета на лентата за търсене. searchBar=[[UISearchBar alloc]initWithFrame:CGRectMake(10,346,300,0)]; searchBar.tintColor=[Повторно използваеми SKColorFromHexString:@#505a62]; searchBar.delegate=self; searchBar.showsCancelButton=ДА; NSArray *subviews = [searchBar subviews]; // Индексът зависи от това как конфигурирате лентата за търсене. UIButton *cancelButton = [подизгледи 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 ``` if let cancelItem = searchBar.subviews.first?.subviews.first(където: { $0 е UIButton }) като? UIButton { cancelItem.setTitleColor(UIColor.black, за: .normal)} ``` - person Arco; 18.10.2018

В Swift 4.2

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

Това работи за мен. Благодаря @Tim Semple

person black_pearl    schedule 28.11.2018

Това е актуализирана версия на отговора на Hossam Ghareeb по-горе за 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

Взех отговора на Benjamin и го комбинирах с безопасно 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: е nkukushkin отговор:

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

Кликнете върху лентата за търсене и задайте цвета на оттенъка в изгледа от 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