UISearchBar中范围按钮文本的颜色

时间:2013-03-13 12:15:52

标签: iphone ios objective-c xcode uisearchbar

我有一个UISearchBar,它必须有灰色。

我现在遇到的问题是,只要设置任何色调,范围按钮就会得到相同的字体颜色,如果按钮不是这样,会导致对比度非常差地选择。

如果未设置色调,则颜色会根据所选状态而有所不同。有没有办法实现这一点,使用淡色?

默认

with tint

使用色调

no tint

更新

使用po [mySearchBar recursiveDescription]我发现UISearchbar具有以下视图层次结构:

<UISegmentedControl>
    <_UISegmentedControlBackgroundView>
        <UIImageView>
    <UISegment>
        <UISegmentLabel>
        <UIImageView>
    <UISegment>
        <UISegmentLabel>
        <UIImageView>
    <UISegment>
        <UISegmentLabel>
        <UIImageView>
<UISearchBarBackground>

4 个答案:

答案 0 :(得分:10)

我似乎记得在使用色调时会遇到类似的问题。看来不幸的副作用是它默认了它影响的UIKit元素的颜色相关属性。

我不知道在使用色调时是否有办法防止此缺陷(我认为没有),但以下解决方法可能对您有用:

iOS 6及以下

[searchBar setScopeBarButtonTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor], UITextAttributeTextColor, nil] forState:UIControlStateNormal];
[searchBar setScopeBarButtonTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor greenColor], UITextAttributeTextColor, nil] forState:UIControlStateSelected];

iOS 7 +

[searchBar setScopeBarButtonTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal];
[searchBar setScopeBarButtonTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor greenColor], NSForegroundColorAttributeName, nil] forState:UIControlStateSelected];

(图片来源:@willyang)

使用UISearchBar的{​​{1}}方法,您可以配置范围栏按钮标题的属性,包括文本颜色。

答案 1 :(得分:7)

因为在IOS 7中不推荐使用 UITextAttributeTextColor ,所以应该使用 NSForegroundColorAttributeName

[searchBar setScopeBarButtonTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal];
[searchBar setScopeBarButtonTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor greenColor], NSForegroundColorAttributeName, nil] forState:UIControlStateSelected];

参考:http://www.downstairz.net/2013/11/24/uitextattributetextcolor-is-deprecated-in-ios-7/

答案 2 :(得分:1)

斯威夫特3:

如果以编程方式构建SearchBar,可以使用以下命令设置ScopeBar的TextAttributes:

let searchController = UISearchController(searchResultsController: nil) // inside the class

...

// Background color
        searchController.searchBar.setScopeBarButtonTitleTextAttributes([NSBackgroundColorAttributeName: UIColor.yellow ], for: UIControlState.normal)

您可以查看UISearchBar方法(向下滚动以查找ScopeBar方法)来自定义: https://developer.apple.com/reference/uikit/uisearchbar?language=objc

答案 3 :(得分:0)

如果我的问题正确,那么这就是你要做的事情

for (id subview in yourSearchDisplayController.searchBar.subviews )
{

    if([subview isMemberOfClass:[UISegmentedControl class]])
    {

        UISegmentedControl *scopeBar=(UISegmentedControl *) subview;
        [scopeBar setSegmentedControlStyle:UISegmentedControlStyleBar];
        [scopeBar setTintColor: [UIColor redColor]];//you can also set RGB color here 
        //scopeBar.tintColor =  [UIColor blackColor];         
    }

}