7

我有一个 UISearchBar,为此我为 UiControlStateNormal 设置了一个自定义 UISearchBarIconClear。

[mySearchBar setImage:myImage forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];

这部分可以正常工作,但不幸的是,当点击清除按钮时,它会从我设置的图像变为原始的默认灰色图像。

我尝试为 UIControlStateHighlighted 设置图像,但显然这不起作用。

文档实际上说明了

有效状态为 UIControlStateNormal 和 UIControlStateDisabled。

如果您无法将其设置为突出显示状态,那么为默认状态设置自定义按钮有什么意义?我错过了什么吗?任何想法或解决方法表示赞赏,谢谢!

4

4 回答 4

9

我有同样的问题,调整语句的顺序解决了它:

因此,不要先做,而是UIControlStateNormal先将UIControlStateHighlighted图像设置为高亮状态

[searchBar setImage:clearIcon forSearchBarIcon:UISearchBarIconClear state:UIControlStateHighlighted];
[searchBar setImage:clearIcon forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];
于 2013-09-20T18:46:16.030 回答
2

使用外观代理怎么样?

[[UIButton appearanceWhenContainedIn:[UITextField class], [UISearchBar class], nil] setImage:myImage forState:UIControlStateHighlighted];
于 2013-05-17T08:20:48.987 回答
2

我刚刚遇到了与您描述的相同的问题,清除图标在被按下后重置为默认图标。

这似乎是由于我尝试对正常和突出显示状态使用相同的 UIImage,为突出显示状态切换到不同的图像解决了问题。

于 2013-07-12T20:29:01.070 回答
0

今天早些时候遇到了同样的问题,这是我自己可能不会使用的非常丑陋的解决方法。

for(UIView *subView in searchBar.subviews) {
    if([subView isKindOfClass: [UITextField class]]){
        UITextField *searchField = (UITextField *)subView;
        CGFloat myWidth = 26.0f;
        CGFloat myHeight = 30.0f;
        UIButton *myButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, myWidth, myHeight)];
        [myButton setImage:[UIImage imageNamed:@"searchbariconclear"] forState:UIControlStateNormal];
        [myButton setImage:[UIImage imageNamed:@"searchbariconclear"] forState:UIControlStateHighlighted];

        [myButton addTarget:self action:@selector(clearsearchbar) forControlEvents:UIControlEventTouchUpInside];

        searchField.rightView = myButton;
        searchField.rightViewMode = UITextFieldViewModeAlways;
        searchField.clearButtonMode = UITextFieldViewModeNever;
    }
}

进而..

- (void)clearsearchbar {
    for(UIView *subView in searchBar.subviews) {
        if([subView isKindOfClass: [UITextField class]]){
            UITextField *searchField = (UITextField *)subView;
            searchField.text = nil;
        }
    }
}

这种方法的三个问题..

  1. 由于我们在搜索栏的子视图中进行挖掘,因此有一天可能会因操作系统更新而中断。

  2. 这与 UISearchBarIconClear 的行为不完全一样,因为清除图标将始终可见。您可以尝试使用这种方法与其他 UITextFieldViewModes 进行测试,我没有这样做的主要原因是,据我所知,其他的都不是理想的在这里,出于某种原因。

  3. 也许只有我一个人,但我真的不认为在试图解决一个问题时引入两个问题的东西是一个解决方案。:-)

如果有人有更好的方法来解决这个问题,我也很想听听。

于 2013-02-08T13:32:44.267 回答