自定义UISearchBarIcon为UIControlStateHighlighted清除不起作用



我有一个UISearchBar,我为它设置了一个用于UiControlStateNormal的自定义UISearchBarIconClear。

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

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

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

文件实际上说明了

有效状态为UIControlStateNormal和UIControlStateDisabled。

如果不能将自定义按钮设置为高亮显示状态,那么将其设置为默认状态有什么意义?我是不是错过了什么?感谢您的任何想法或解决方案,谢谢!

我也遇到了同样的问题,调整语句的顺序解决了这个问题:

因此,与其先进行UIControlStateNormal然后进行UIControlStateHighlighted,不如先将图像设置为高亮状态

[searchBar setImage:clearIcon forSearchBarIcon:UISearchBarIconClear state:UIControlStateHighlighted];
[searchBar setImage:clearIcon forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];

使用外观代理怎么样?

[[UIButton appearanceWhenContainedIn:[UITextField class], [UISearchBar class], nil] setImage:myImage forState:UIControlStateHighlighted];

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

这似乎是因为我试图在正常和高亮显示状态下使用相同的UIImage,在高亮显示状态切换到不同的图像解决了问题。

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

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的行为不同,因为清晰的图标始终可见。。您可以使用这种方法尝试使用其他UITextFieldViewMode进行测试,我没有这样做,主要是因为,据我所知,出于某种原因,其他方法都不理想。

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

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

最新更新