iOS 7中的UISearchBar文本颜色更改

Gau*_*ang 50 uisearchbar ios7

如何更改文本颜色UISearchBariOS 7

iOS 6,我是子类化UISearchBarlayoutSubviews定制UITextField子视图的属性UISearchBar.

但在iOS 7,UISearchBar没有UITextField作为其子视图.如何解决这个问题?

Tos*_*lji 100

在iOS 7中访问文本字段,您必须在级别上重申更多.像这样更改你的代码

for (UIView *subView in self.searchBar.subviews)
{
    for (UIView *secondLevelSubview in subView.subviews){
        if ([secondLevelSubview isKindOfClass:[UITextField class]])
        {
            UITextField *searchBarTextField = (UITextField *)secondLevelSubview;

            //set font color here
            searchBarTextField.textColor = [UIColor blackColor];

            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:这是非公共API

要么

您可以使用UIControls的外观属性,Like

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor redColor]}];
Run Code Online (Sandbox Code Playgroud)

注意:外观代理可用于iOS 9.0+ OutPut

在此输入图像描述

您可以设置" tintcolor应用于"中的关键元素search bar.

使用tintColor进行着色前景元素.

使用barTintColor进行着色的栏背景.

在iOS v7.0中,UIView的所有子类都从基类派生tintColor的行为.有关更多信息,请参阅UIView级别的tintColor讨论. Apple Doc

  • 我不认为这是iOS的正确答案.请参阅此答案:http://stackoverflow.com/a/19315895/1103584 (3认同)
  • Downvoted是因为这是脆弱的,而另一种公共API可用于实现此目的. (3认同)

San*_*tix 95

您可以设置文本颜色

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor blueColor]];
Run Code Online (Sandbox Code Playgroud)

  • 但这将为应用程序中的所有搜索栏设置外观,而不是特定的搜索栏. (5认同)
  • Upvoted,因为它工作并使用公共API.通过框架类的子视图层次结构递归它不是一个值得推荐的东西 - 它是作为最后的手段完成的事情,当我没有选择时我自己完成了 - 但当公共API时当然不应该使用它是可用的. (5认同)
  • 虽然设置'外观'最初看起来比基于视图层次结构的方法更好/更可靠,但这不会一直有效.我把`UISearchBar`放在`UIView`里面.它首次影响textColor,但随后是父视图的removeFromSuperview/addSubview(以及其他一些流).我在UIViewController的`viewWillAppear` /`viewDidAppear`方法中设置了这个外观.并且,view-heirarchy方法就像魅力(+1). (4认同)
  • 这是我在iOS6下使用的,但它不能在iOS7下运行.如果我使用问题中提到的`layoutSubviews` hack,初始文本是正确的颜色,但一旦用户点击进入,它就会恢复.有任何想法吗? (3认同)

Gra*_*son 35

对于XCode 6(iOS8 SDK),以下操作无效

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor redColor]];
Run Code Online (Sandbox Code Playgroud)

但以下DOES工作(部署到iOS7和iOS8)

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor redColor]}];
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢.UISearchBar我发誓是Apple迄今为止最糟糕的UIKit控制.配置其UI非常困难和尴尬,并且许多方法实际上并不像您期望的那样工作. (9认同)
  • 对我来说,`textColor`只适用于`viewDidAppear`,而`defaultTextAttributes`可以全局工作.但后者似乎将初始"搜索"文本的位置改为几个像素到顶部. (5认同)
  • 不要忘记设置字体以避免不可预测的UI更改:`[[UITextField appearanceWhenContainedIn:[UISearchBar class],nil] setDefaultTextAttributes:@ {NSForegroundColorAttributeName:[UIColor whiteColor],NSFontAttributeName:[UIFont systemFontOfSize:14.0]}] ;`@Koraktor (4认同)

Jor*_*der 5

虽然UIAppearance协议确实是"公共API",但UITextField支持这一点并不正确.

如果您查看UITextField.h并查找字符串"UI_APPEARANCE_SELECTOR",您将看到它没有此字符串的实例.如果你看看UIButton,你会发现很多 - 这些都是UIAppearance API官方支持的所有属性.众所周知UIAextField不受UIAppearance API的支持,因此Sandeep的答案中的代码并不总是有效,而且实际上并不是最好的方法.

这是一篇有用链接的有用帖子:http://forums.xamarin.com/discussion/175/uitextfield-appearance

不幸的是,正确的方法很麻烦 - 遍历子视图(或iOS7的主要子视图的子视图)并手动设置.否则你将得到不可靠的结果.但是你可以为UISearchBar创建一个类别并添加一个setTextColor:(UIColor*)颜色方法.例:

- (void)setTextColor:(UIColor*)color
{
    for (UIView *v in self.subviews)
    {
        if([Environment isVersion7OrHigher]) //checks UIDevice#systemVersion               
        {
            for(id subview in v.subviews)
            {
                if ([subview isKindOfClass:[UITextField class]])
                {
                    ((UITextField *)subview).textColor = color;
                }
            }
        }

        else
        {
            if ([v isKindOfClass:[UITextField class]])
            {
                ((UITextField *)v).textColor = color;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*ler 5

警告:这应该导致应用程序拒绝!

KVC FTW.这样做对我来说.

UITextField *searchField = [self.searchBar valueForKey:@"_searchField"];
searchField.textColor = [UIColor redColor];
Run Code Online (Sandbox Code Playgroud)

  • ***警告:这应该导致应用程序拒绝!*** (30认同)