42

当我将 UISearchBar 放到 Interface Builder 中的视图中,并将其样式更改为黑色不透明时,取消按钮会保持不合适的蓝色/灰色并且不会变成黑色。

如何使取消按钮变黑?

编辑:它确实像这样工作:

// 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 时这可能是一个问题。

4

11 回答 11

118

我用过这样的东西并和我一起工作:

[[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
于 2013-04-03T15:08:15.303 回答
34

您的解决方案的问题是代码假设 objectAtIndex:3 是取消按钮。这不仅会生成编译器警告,而且如果您以编程方式显示“取消”按钮(例如使用[searchBar setShowsCancelButton:YES],则可能会导致应用程序崩溃。

一个更简单的解决方案是在 ViewDidLoad() 中设置整个搜索栏的样式,使用:

searchBar.tintColor = [UIColor colorWithWhite:0.3 alpha:1.0];

这会覆盖 Interface Builder 中设置的样式,但也会将 Cancel 按钮的颜色更改为与整个栏相同的颜色(尽管不幸的是,它不允许您独立设置 Cancel 按钮的样式。

于 2010-09-07T11:43:04.390 回答
9

试试这个看看:(我用 Swift 4.1 - Xcode 9.3-beta4测试了下面的代码)

@IBOutlet weak var sbSearchBar: UISearchBar!

sbSearchBar.showsCancelButton = true
sbSearchBar.barTintColor = UIColor.blue
sbSearchBar.tintColor = UIColor.red

if let buttonItem = sbSearchBar.subviews.first?.subviews.last as? UIButton {
    buttonItem.setTitleColor(UIColor.yellow, for: .normal)
}

在此处输入图像描述

于 2018-03-15T14:31:00.803 回答
6

在斯威夫特 4.2

let appearance = UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self])
appearance.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor(named: "goldColor")!], for: .normal)

这对我有用。谢谢@Tim Semple

于 2018-11-28T07:03:58.617 回答
5

对于 iOS 10:

UISearchBar.appearance().tintColor = UIColor.red //cancel button color
UISearchBar.appearance().barTintColor = UIColor.blue //background button color
于 2017-05-08T12:33:21.883 回答
4

这是上面对Swift 3的Hossam Ghareeb 回答的更新版本:

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)
于 2017-02-13T12:46:21.117 回答
2

提出了以下解决方案,它也适用于 iOS 13.0 和 iOS 12.4,必须适用于 iOS 9.0 之前的早期版本。以下解决方案适用于:

  1. 取消按钮颜色(正常状态)。
  2. 取消按钮颜色(禁用状态)。
  3. 搜索栏文本字段背景颜色(正常状态)。

对于目标 C:

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:[UIColor whiteColor]]; 

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateNormal];

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateDisabled];

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitleTextAttributes:@{NSBackgroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateNormal];

上面的代码还修复了 iOS 13 和 iPhone X 的 UI 问题。我将此代码包含在didFinishLaunchingWithOptions函数的AppDelegate.m类中,以便可以在整个应用程序中完成更改。

于 2020-01-07T12:33:25.443 回答
1

单击搜索栏并在界面生成器的视图下设置色调颜色。

在此处输入图像描述

于 2016-10-21T09:43:36.367 回答
1

我采用了本杰明的答案并将其与安全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 的回答:

extension Array {
    subscript(safe index: Int) -> T? {
        return indices(self) ~= index ? self[index] : nil
    }
}
于 2015-09-10T11:28:02.220 回答
1
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)         
    }
}

这对我有用

于 2016-12-31T22:24:28.367 回答
0

对于那些希望在 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()
        }
    }

}
于 2015-04-14T14:05:58.067 回答