为UIControlStateHighlighted定制UISearchBarIconClear不起作用

Dim*_*ima 7 objective-c uikit uisearchbar ios

我有一个UISearchBar,我为UiControlStateNormal设置了一个自定义的UISearchBarIconClear.

[mySearchBar setImage:myImage forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

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

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

文件实际上规定

有效状态是UIControlStateNormal和UIControlStateDisabled.

如果您无法将其设置为突出显示状态,那么为默认状态设置自定义按钮的重点是什么?我错过了什么吗?任何想法或变通方法都表示赞赏,谢谢!

小智 9

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

因此,不要先做,而是UIControlStateNormal首先UIControlStateHighlighted将图像设置为突出显示状态

[searchBar setImage:clearIcon forSearchBarIcon:UISearchBarIconClear state:UIControlStateHighlighted];
[searchBar setImage:clearIcon forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)


Sam*_* J. 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

进而..

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

这种方法存在三个问题..

  1. 由于我们正在搜索栏的子视图内部进行挖掘,因此有一天操作系统更新可能会破坏它。

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

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

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