为UIControlStateHighlighted定制UISearchBarIconClear不起作用

时间:2013-02-06 01:21:49

标签: ios objective-c uikit uisearchbar

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

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

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

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

documentation实际陈述

  

有效状态是UIControlStateNormal和UIControlStateDisabled。

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

4 个答案:

答案 0 :(得分:9)

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

首先,不要先UIControlStateNormalUIControlStateHighlighted,而是首先将图像设置为突出显示状态

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

答案 1 :(得分:2)

如何使用外观代理?

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

答案 2 :(得分:2)

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

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

答案 3 :(得分: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. 也许这只是我,但我真的不认为在尝试解决问题时引入两个问题的东西是一种解决方案。 : - )

  4. 如果有人有更好的方法来解决这个问题,我也很乐意听到它。