UISearchBar cancel button color?

前端 未结 11 524
耶瑟儿~
耶瑟儿~ 2020-12-13 09:00

When I drop a UISearchBar into my view inside Interface Builder, and change its style to Black Opaque, the cancel button stays unfittingly blue / gray and doesn\'t become bl

相关标签:
11条回答
  • 2020-12-13 09:35

    Try this and see: (I tested below code with 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)
    }
    

    0 讨论(0)
  • 2020-12-13 09:35

    Came up with a following solution and it is working on iOS 13.0 and iOS 12.4 as well, must be working on prior versions to till iOS 9.0. The following solution is for:

    1. Cancel Button Color (Normal State).
    2. Cancel Button Color (Disabled State).
    3. Search Bar Text Field Background Color (Normal State).

    For Objective 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];
    

    The above code also fixed my UI issues for iOS 13 and iPhone X. I included this code in my AppDelegate.m class in didFinishLaunchingWithOptions function, so that the changes could be done in the whole app.

    0 讨论(0)
  • 2020-12-13 09:37

    This is an updated version of Hossam Ghareeb's answer above for Swift 3:

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self] ).tintColor = UIColor.red
    

    But this will not override appearance if it has already been set elsewhere for UIBarButtonItem.

    For example, in my navbar controller I had to change this:

    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal)
    

    To this for the solution above to work:

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self] ).setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal)
    
    0 讨论(0)
  • 2020-12-13 09:46

    I used some thing like this and worked with me:

    [[UIBarButtonItem appearanceWhenContainedIn: [UISearchBar class], nil] setTintColor:[UIColor blackColor]];
    

    it changed the cancel button color to black.

    Update for iOS 9.0, the method appearanceWhenContainedIn is deprecated, use appearanceWhenContainedInInstancesOfClasses instead:

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

    And in Swift 3:

    UIBarButtonItem.appearance(whenContainedInInstancesOf:[UISearchBar.self]).tintColor = UIColor.black
    
    0 讨论(0)
  • 2020-12-13 09:47

    The problem with your solution is that the code is assuming that the objectAtIndex:3 is the cancel button. Not only does this generate a compiler warning, but also if you are displaying the Cancel button programmatically (for example using [searchBar setShowsCancelButton:YES], you risk crashing the application.

    A simpler solution is to set the style of the whole search bar in ViewDidLoad(), using:

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

    this overrides the style set in the Interface Builder BUT also changes the colour of the Cancel button to be same colour as the whole bar (although it doesn't let you set the style of Cancel button independently, unfortunately.

    0 讨论(0)
提交回复
热议问题