Цвет кнопки отмены UISearchBar?
Когда я отбрасываю UISearchBar в свой вид внутри Interface Builder и меняю свой стиль на Black Opaque, кнопка отмены остается незакрепленной сине-серой и не становится черной.
Как сделать кнопку отмены черной?
EDIT: он работает следующим образом:
// 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.
Ответы
Ответ 1
Я использовал что-то вроде этого и работал со мной:
[[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
Ответ 2
Проблема с вашим решением заключается в том, что в коде предполагается, что objectAtIndex: 3 является кнопкой отмены. Это не только генерирует предупреждение компилятора, но и если вы программно показываете кнопку "Отмена" (например, используя [searchBar setShowsCancelButton:YES]
, вы рискуете скомпрометировать приложение.
Более простым решением является установка стиля всей панели поиска в ViewDidLoad(), используя:
searchBar.tintColor = [UIColor colorWithWhite:0.3 alpha:1.0];
это переопределяет стиль, заданный в построителе интерфейса, но также меняет цвет кнопки "Отмена" на тот же цвет, что и вся панель (хотя это не позволяет вам самостоятельно установить стиль кнопки "Отмена" .
Ответ 3
Я принял ответ Benjamin's и объединил его с безопасным поиском 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's ответ:
extension Array {
subscript(safe index: Int) -> T? {
return indices(self) ~= index ? self[index] : nil
}
}
Ответ 4
Нажмите "Панель поиска" и установите цвет оттенок в представлении "Интерфейс".
![введите описание изображения здесь]()
Ответ 5
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)
}
}
Это сработало для меня
Ответ 6
Это обновленная версия 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)
Ответ 7
Для тех, кто хочет воспроизвести одно и то же поведение в 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()
}
}
}
Ответ 8
для iOS 10:
UISearchBar.appearance().tintColor = UIColor.red //cancel button color
UISearchBar.appearance().barTintColor = UIColor.blue //background button color