Изменение цвета курсора на UISearchBar без изменения tintColor
Я хочу, чтобы мой цвет оттенка searchBar был белым (это означает, что кнопка отмены будет белой). Курсор не отображается, если цвет оттенка белый. Есть ли способ установить цвет курсора отдельно?
Ответы
Ответ 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;
}
}
![enter image description here]()
Ответ 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