Я хочу, чтобы мой цвет оттенка searchBar был белым (это означает, что кнопка отмены будет белой). Курсор не отображается, если цвет оттенка белый. Есть ли способ установить цвет курсора отдельно?
Изменение цвета курсора на UISearchBar без изменения tintColor
Ответ 1
Установите цвет оттенка в том цвете, который вы хотите, чтобы кнопка отмены была, а затем используйте протокол UIAppearance, чтобы изменить цвет оттенка в текстовом поле как цвет вы хотите, чтобы курсор был. Пример:
[self.searchBar setTintColor:[UIColor whiteColor]];
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:[UIColor darkGrayColor]];
Ответ 2
Если вы любите функциональные, но раздражающие однострочники в Swift, я получил Benjamin для этого:
searchController.searchBar.tintColor = UIColor.whiteColor()
searchController.searchBar.subviews[0].subviews.flatMap(){ $0 as? UITextField }.first?.tintColor = UIColor.blueColor()
Ответ 3
Swift 3.0 и 4 версия
searchController.searchBar.tintColor = .white
UITextField.appearance(whenContainedInInstancesOf: [type(of: searchController.searchBar)]).tintColor = .black
Обратите внимание, что searchBar не может быть необязательным.
Ответ 4
Решение Compact Swift 2.0 с использованием синтаксиса for-where (нет необходимости прерывать цикл):
// Make SearchBar tint color white to get white cancel button.
searchBar.tintColor = UIColor.white()
// Loop into it subviews and find TextField, change tint color to something else.
for subView in searchBar.subviews[0].subviews where subView.isKindOfClass(UITextField) {
subView.tintColor = UIColor.darkTextColor()
}
Ответ 5
searchBar.tintColor = [UIColor whiteColor];
searchBar.backgroundColor = [UIColor clearColor];
for ( UIView *v in [searchBar.subviews.firstObject subviews] )
{
if ( YES == [v isKindOfClass:[UITextField class]] )
{
[((UITextField*)v) setTintColor:[UIColor blueColor]];
break;
}
}
Ответ 6
Это, похоже, быстро работало и для меня.
searchController.searchBar.tintColor = UIColor.whiteColor()
UITextField.appearanceWhenContainedInInstancesOfClasses([searchController.searchBar.dynamicType]).tintColor = UIColor.blackColor()
Ответ 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
Я бы просто добавил расширение для UISearchBar со следующим кодом.
extension UISearchBar {
var cursorColor: UIColor! {
set {
for subView in self.subviews[0].subviews where ((subView as? UITextField) != nil) {
subView.tintColor = newValue
}
}
get {
for subView in self.subviews[0].subviews where ((subView as? UITextField) != nil) {
return subView.tintColor
}
// Return default tintColor
return UIColor.eightBit(red: 1, green: 122, blue: 255, alpha: 100)
}
}
}
Ответ 9
iOS 9 и выше
Самый простой способ установить разные цвета tintColor для кнопки отмены и textField, используйте это:
[self.searchBar setTintColor:[UIColor whiteColor]];
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:UIColor.blueColor];
Ответ 10
Это самое простое решение.
let textField = self.searchBar.value(forKey: "searchField") as! UITextField
textField.tintColor = UIColor.white
Ответ 11
Вот "функциональная" версия ответа Фелипе (Swift 4.2)
// Make SearchBar tint color white to get white cancel button.
searchBar.tintColor = .white
// Get the TextField subviews, change tint color to something else.
if let textFields = searchBar.subviews.first?.subviews.compactMap({ $0 as? UITextField }) {
textFields.forEach { $0.tintColor = UIColor.darkGray }
}
Ответ 12
Самый простой в Swift 5:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).tintColor = .black