Изменение цвета курсора на UISearchBar без изменения цвета tintColor

Я хочу, чтобы цвет оттенка моей панели поиска был белым (это означает, что кнопка отмены будет белой). Курсор не отображается, если цвет оттенка белый. Есть ли способ установить цвет курсора отдельно?

10 ответов


установите цвет оттенка в цвет, который вы хотите, чтобы кнопка отмены, а затем используйте Протокол UIAppearance чтобы изменить цвет оттенка на текстовом поле, чтобы быть цвет, который вы хотите курсор, чтобы быть. Ex:

[self.searchBar setTintColor:[UIColor whiteColor]];                
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:[UIColor darkGrayColor]];

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

searchController.searchBar.tintColor = UIColor.whiteColor()

searchController.searchBar.subviews[0].subviews.flatMap(){  as? UITextField }.first?.tintColor = UIColor.blueColor()

Swift 3.0 и 4 версии

searchController.searchBar.tintColor = .white        
UITextField.appearance(whenContainedInInstancesOf: [type(of: searchController.searchBar)]).tintColor = .black

обратите внимание, что панель поиска не может быть необязательной.


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


компактное решение Swift 2.0 с использованием Для-где синтаксис (нет необходимости прерывать цикл):

// Make SearchBar's tint color white to get white cancel button.
searchBar.tintColor = UIColor.white()

// Loop into it's 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()
}

для тех, кто хочет сделать то же самое в 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()
        }
    }

}

это, похоже, сработало и для меня в swift.

    searchController.searchBar.tintColor = UIColor.whiteColor()
    UITextField.appearanceWhenContainedInInstancesOfClasses([searchController.searchBar.dynamicType]).tintColor = UIColor.blackColor()

Я бы просто добавил расширение в 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)
        }
    }
}

Это самое простое решение.

let textField = self.searchBar.value(forKey: "searchField") as! UITextField

    textField.tintColor = UIColor.white

iOS 9 и выше

самый простой способ установить tintcolor отличается для кнопки отмены и textField, используйте это:

self.searchBar setTintColor:[UIColor whiteColor]];
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:UIColor.blueColor];