在UISearchBar中设置取消按钮的样式

Chu*_*eow 28 iphone cocoa-touch objective-c uisearchbar ios

我有一个UISearchBar,它有一个取消按钮(显示使用-(void)setShowsCancelButton:animated).tintColor为了获得一个灰色的搜索栏,我已经改变了这样的搜索栏:

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
searchBar.tintColor = [UIColor colorWithWhite:0.8 alpha:1.0];
Run Code Online (Sandbox Code Playgroud)

这就是它现在的样子 - 注意取消按钮也是灰色的:http://twitpic.com/c0hte

有没有办法分别设置取消按钮的颜色,所以它看起来更像这样:http://twitpic.com/c0i6q

lem*_*nar 27

您可以使用UIAppearance样式不反复的子视图的取消按钮UISearchBar,但UIButton头目前没有与任何注释的方法UI_APPEARANCE_SELECTOR.

编辑:深入查看子视图,直到获得取消按钮

但这通常会searchBar.setShowsCancelButton(true, animated: true)在调用之前返回nil .

extension UISearchBar {

var cancelButton : UIButton? {
    if let view = self.subviews.first {
        for subView in view.subviews {
            if let cancelButton = subView as? UIButton {
                return cancelButton
            }
        }
    }
    return nil
}
}
Run Code Online (Sandbox Code Playgroud)

  • [[UIButton的appearanceWhenContainedIn:[MySearchBar类],零]了setBackgroundImage:... forState:UIControlStateNormal]; (42认同)
  • 有趣的是,"取消"按钮表明它是UISearchBar标头中的UIButton,但我的UIBarButton外观代理覆盖了该样式.所以我最终设置了我的取消按钮`[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class],[ContainingClass class],nil] setTintColor:UIColorFromRGB(0xc5c2b6)]; (13认同)
  • 请注意,使用[[UIButton外观...将编辑用于删除键入内容的X按钮.请改用[[UIBarButtonItem外观. (7认同)
  • @JasonZhao UIBarButtonItem有一个不同的背景图像外观选择器,setBackgroundImage:forState:barMetrics: (2认同)

Ner*_*u-J 20

更改"取消"按钮的标题:

[[UIButton appearanceWhenContainedIn:[UISearchBar class], nil] setTitle:@"newTitle" forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

Swift等价物:

   let cancelButton = UIButton.appearance(whenContainedInInstancesOf: [UISearchBar.self])
   cancelButton?.setTitle("cancel".localized, for: .normal)
Run Code Online (Sandbox Code Playgroud)


小智 20

在iOS 5.0+中,您可以使用appearnce代理.

在显示搜索栏之前:

UIBarButtonItem *searchBarButton = [UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil];
[searchBarButton setBackgroundImage:myCancelButtonImageNormal forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[searchBarButton setBackgroundImage:myCancelButtonImageHighlighted forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
[searchBarButton setTitleTextAttributes:barButtonTitleTextAttributesNormal forState:UIControlStateNormal];
[searchBarButton setTitleTextAttributes:barButtonTitleTextAttributesHighlighted forState:UIControlStateHighlighted];
Run Code Online (Sandbox Code Playgroud)

如果使用[UIButton appearanceWhenContainedIn:[UISearchBar class], nil],则会影响其他按钮(例如清除按钮).所以,你最好不要使用它UIButton的出现.试试UIBarButtonItem.


Sar*_*ara 17

虽然这可能与原始问题不完全相关,但解决方案仍然适用于尝试自定义UISearchBar中的"取消"按钮.认为这将有助于其他陷入困境的人.

我的情况是更改取消按钮的标题,但有一个转折,其中我不想显示取消按钮默认但只是希望它显示,当用户进入搜索模式(通过在搜索文本字段内单击).在这一刻,我希望取消按钮带有标题"完成"("取消"给我的屏幕赋予不同的含义,因此定制).

然而,这就是我所做的(caelavel和Arenim解决方案的组合):

使用以下两种方法将UISearchBar子类化为MyUISearchBar:

-(void) setCloseButtonTitle: (NSString *) title forState: (UIControlState)state
{
    [self setTitle: title forState: state forView:self];
}

-(void) setTitle: (NSString *) title forState: (UIControlState)state forView: (UIView *)view
{
    UIButton *cancelButton = nil;
    for(UIView *subView in view.subviews){
        if([subView isKindOfClass:UIButton.class])
        {
            cancelButton = (UIButton*)subView;
        }
        else
        {
            [self setTitle:title forState:state forView:subView];
        }
    }

    if (cancelButton)
        [cancelButton setTitle:title forState:state];

}
Run Code Online (Sandbox Code Playgroud)

在使用此搜索栏的viewcontroller中,以下代码负责显示取消按钮并自定义其标题:

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    MyUISearchBar *sBar = (MyUISearchBar *)searchBar;
    [sBar setShowsCancelButton:YES];
    [sBar setCloseButtonTitle:@"Done" forState:UIControlStateNormal];   
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,我没有做任何事情来隐藏取消按钮,因为它在退出搜索模式时默认隐藏.


Ama*_*mer 13

你想做的事情非常艰难.获取取消按钮没有内置钩子.

但是,如果你愿意打开引擎盖,有几种选择.

首先,UISearchBar是一个UIView,而Cancel按钮也是一个视图,它作为子视图添加到搜索栏中,就像您期望的那样.

我做了一点实验,可以告诉你,当按钮在屏幕上时,它的大小为48,30.

所以在viewWillAppear中,你可以这样做:

  1. 通过查找大小为48,30的查找,在[searchBar子视图]中找到取消按钮视图.(似乎只有一个 - 这可能会改变......)你可能会倍加小心,寻找一个大致正确位置的人(在风景和肖像方面有所不同).

  2. 将子视图添加到取消按钮.

  3. 子视图应该是一个UIControl(这样你就可以设置enabled = NO,以确保触摸事件到达实际的取消按钮)

  4. 它需要有正确的颜色和圆角; 因为我还不明白的原因你需要捏造大小(55,30似乎有效)

  5. 如果searchBar.showsCancelButton始终为YES,这将起作用; 如果您希望它在不编辑搜索字符串时消失,则每次出现取消按钮时都需要找到一个钩子来添加叠加层.

  6. 如你所见,这是一些丑陋的修修补补.睁大眼睛这样做.


And*_*yer 7

您可以通过循环搜索栏的子视图并检查类类型(而不是大小)来找到取消按钮:

UIButton *cancelButton = nil;
for(UIView *subView in yourSearchBar.subviews){
    if([subView isKindOfClass:UIButton.class]){
    cancelButton = (UIButton*)subView;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后改变色调颜色:

[cancelButton setTintColor:[UIColor colorWithRed:145.0/255.0 green:159.0/255.0 blue:179.0/255.0 alpha:1.0]];
Run Code Online (Sandbox Code Playgroud)


小智 7

如果要配置取消按钮,UISearchBar则应UIButtonUISearchBar对象中获取对象.以下示例

UISearchBar *s_bar = [[UISearchBar alloc] initWithFrame:CGRectMake(50,20,300,30)];
s_bar.delegate = self;
s_bar.barStyle = UIBarStyleDefault;
s_bar.showsCancelButton = YES;
UIButton *cancelButton;
for (id button in s_bar.subviews)
{
    if ([button isKindOfClass:[UIButton class]])
    {
        cancelButton=(UIButton*)button;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)