在不改变tintColor的情况下更改UISearchBar上光标的颜色

42

我希望我的搜索栏的色调颜色是白色,这意味着取消按钮是白色的。当色调颜色为白色时,光标不可见。有没有一种方法可以单独设置光标颜色?


1
我在这里发布了一篇带有详细截图的解决方案:https://dev59.com/G2Ei5IYBdhLWcg3wPadh#42444940 - Derek Soike
12个回答

67

将色调颜色设置为您想要的取消按钮颜色,然后使用UIAppearance协议将文本字段的色调颜色更改为您希望光标的颜色。例如:

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

2
不知道为什么,但是这段代码(第二行)会改变下一个模态场景中barButton的色调。所以我使用了@Felipe在下面的答案。 - zalogatomek
我和tzaloga遇到了同样的问题。有人知道为什么这会影响模态场景的工具栏按钮颜色吗? - hanjustin
自从iOS13以来,您可以使用searchBar.searchTextField.tintColor。 - Kamen Dobrev

17

Swift 3.0和4版本

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

请注意,searchBar不能是可选的。


13

如果你喜欢Swift中的功能强大但又烦人的一行代码,那么我将Benjamin的for循环简化为以下形式:

searchController.searchBar.tintColor = UIColor.whiteColor()

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

8

最简单的方法:使用 Swift 5:

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).tintColor = .black

1
太好了!工作正常! - Senocico Stelian

6

使用for-where语法的简洁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()
}

1
当我想要为一个搜索栏改变光标颜色时,这个方法对我很有用。 - zalogatomek

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


5
这对我在Swift中也有效。
    searchController.searchBar.tintColor = UIColor.whiteColor()
    UITextField.appearanceWhenContainedInInstancesOfClasses([searchController.searchBar.dynamicType]).tintColor = UIColor.blackColor()

Felipe和Eric的解决方案都对我有用,但是我感觉你的解决方案Eric更让我感到舒适。 - David West

4

如果您想在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()
        }
    }

}

3

iOS 9及以上版本

设置取消按钮和文本框不同的tintColor的最简单方法是使用以下代码:

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

1
你的第一行开头缺少一个 [ ... 应该是:[self.searchBar setTintColor:[UIColor whiteColor]]; - Peter Suwara

3
我会为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)
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接