在UISearchBar文本字段中自定义清除按钮

6

我尝试过:

UITextField *searchtextfield = [searchBar.subviews objectAtIndex:1];
    UIButton *cButton = [UIButton buttonWithType:UIButtonTypeCustom];
    cButton.frame = CGRectMake(0, 0, 20 , 20);
    cButton.backgroundColor = [UIColor clearColor];
    [cButton setImage:[UIImage imageNamed:@"x-button"] forState:UIControlStateNormal];//your button image.
    cButton.contentMode = UIViewContentModeScaleToFill;
    [cButton addTarget:self action:@selector(xButtonPressed) forControlEvents:UIControlEventTouchUpInside];//This is the custom event
    [searchtextfield setRightView:cButton];
    [searchtextfield setRightViewMode:UITextFieldViewModeWhileEditing];

但是它的效果并不好...... 它会显示自定义按钮,但当您输入内容时,旧的按钮会重新出现......

我该如何做呢?


请按照我的回答,访问以下链接:https://dev59.com/qmvXa4cB1Zd3GeqPNuT8#13799144 - Rajneesh071
6个回答

8
如果你想在 UISearchBar 中设置一个自定义的清除按钮,请尝试以下操作:
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"MyClearButton.png"] forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];

不要忘记为UIControlStateHighlighted设置图像。
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"HighlightedClearButton.png"] forSearchBarIcon:UISearchBarIconClear state:UIControlStateHighlighted];

谢谢,运行得非常完美。如果有人正在寻找这段代码的Swift版本,可以在这里找到:https://dev59.com/l4Lba4cB1Zd3GeqPhaje#25419881 - Apfelsaft
它对我起作用了。谢谢。我以为我必须使用UISearchBar对象实例来完成它。 - Augusto Carmo

7

您需要以下内容

[searchBar setImage:[UIImage imageNamed:@"image1"] forSearchBarIcon:UISearchBarIconClear state:UIControlStateHighlighted];
[searchBar setImage:[UIImage imageNamed:@"image2"] forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];

强烈建议按照以下顺序排列字符串,从UIControlStateHighlighted开始,以便在需要使用相同图像时:image1=image2=image。

iOS7中很奇怪,但事实是,UIControlStateNormal和UIControlStateHighlighted的直接顺序不起作用。


0

Swift 4.2,4.1+malex的答案。

UISearchBar.appearance().setImage(UIImage(named: "image1"), for: .clear, state: .normal)
UISearchBar.appearance().setImage(UIImage(named: "image2"), for: .clear, state: .highlighted)

我之前也在这里回答了如何设置清除按钮结果按钮的自定义tintColor


0

searchBarTextDidBeginEditing 中,您可以隐藏取消按钮。

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    [searchBar setShowsCancelButton:NO animated:YES];
}  

而且最令人惊奇的是,您还可以通过以下方式隐藏清除按钮

UITextField *textField=(UITextField*)[[searchBar subviews]objectAtIndex:1];
textField.clearButtonMode=UITextFieldViewModeNever; 

如需更多信息,请参考我的答案link


不是取消按钮 @Mert,从函数名称setShows"Cancel"Button已经很清楚了。 - Rajneesh071
是的,你的回答是针对取消按钮的,但@1337code问的是清除按钮。 - Mert

0

clearButtonMode设置为UITextFieldViewModeNever,并将rightViewMode设置为UITextFieldViewModeAlways


0
在Swift 2.2中,以下代码对我有效。
        [UISearchBar .appearance().setImage(UIImage(named: "search_clear_icon"), forSearchBarIcon: .Clear, state: .Normal)]

    [UISearchBar .appearance().setImage(UIImage(named: "search_clear_icon"), forSearchBarIcon: .Clear, state: .Highlighted)]

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