UISearchBar文字颜色

时间:2009-09-10 21:29:07

标签: iphone text sdk colors uisearchbar

浏览文档,我找不到任何可以改变UISearchBar颜色的内容。有人知道如何改变吗?没有任何textColor属性:/

THX

11 个答案:

答案 0 :(得分:10)

您可以执行以下操作:只需从SearchBar获取searchField属性,然后更改其textColor属性。

UITextField *searchField = [searchbar valueForKey:@"_searchField"];
searchField.textColor = [UIColor redColor]; //You can put any color here.

就是这样!现在你以任何可能的方式操纵textField。

答案 1 :(得分:10)

iOS 8:请参阅https://stackoverflow.com/a/28183058/308315

iOS 6/7:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor redColor]];

答案 2 :(得分:10)

适用于iOS 7及更高版本:

    [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
                                 NSForegroundColorAttributeName : [UIColor whiteColor],
                                 NSFontAttributeName : [UIFont systemFontOfSize:15]
                                 }];

您也可以删除未使用的属性。

<强>更新即可。由于iOS 9中已弃用appearanceWhenContainedIn,请参阅下面的Dishant答案:https://stackoverflow.com/a/38893352/2799722

答案 3 :(得分:3)

我怀疑你可以使用this post

中描述的技巧

稍微修改那里提供的代码,你是UISearchBar的子类:

@interface SearchBar : UISearchBar {
}
@end

然后在您的实施中:

- (void)layoutSubviews {
    UITextField *searchField;
    NSUInteger numViews = [self.subviews count];
    for(int i = 0; i < numViews; i++) {
        if([[self.subviews objectAtIndex:i] isKindOfClass:[UITextField class]]) {
            searchField = [self.subviews objectAtIndex:i];
        }
    }
    if(!(searchField == nil)) {
        searchField.textColor = [UIColor redColor];
    }

    [super layoutSubviews];
}

我没有测试原始帖子的代码或此代码,但看起来它应该有效。  -wkw

答案 4 :(得分:3)

以下是添加此功能的类别:

@implementation UISearchBar (UISearchBar_TextColor)

- (UITextField *)field {
    // HACK: This may not work in future iOS versions
    for (UIView *subview in self.subviews) {
        if ([subview isKindOfClass:[UITextField class]]) {
            return (UITextField *)subview;
        }
    }
    return nil;
}

- (UIColor *)textColor {
    return self.field.textColor;
}

- (void)setTextColor:(UIColor *)color {
    self.field.textColor = color;
}

@end

答案 5 :(得分:3)

对于iOS11,我发现这有效:

searchController设置为navigationItem后,搜索文字为黑色黑色。要使它成为白色,我必须这样做:

searchController.searchBar.barStyle = .blackTranslucent

这是唯一对我有用的东西。我的应用程序有一个透明的导航栏,让背景渐变显示出来,我猜测SearchBar具有该外观,因为UISearchBar的外观设置在很大程度上被忽略,但有一个例外:

UISearchBar.appearance().tintColor = UIColor.red

这使得取消按钮和文本插入光标变为红色。占位符文本为浅灰色。

请注意:UISearchBar.appearance().barStyle = .blackTranslucent不起作用 - 必须在实例上设置它。这对搜索栏也没有明显影响(它仍然像导航栏一样透明);它只是使搜索文本变白。

答案 6 :(得分:2)

在iOS 9中不推荐使用

appearanceWhenContainedIn ,因此我们必须在iOS 9及更高版本中使用以下方法。

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
 setTintColor:[UIColor whiteColor]];

答案 7 :(得分:1)

使用iOS 11,搜索栏有望成为导航栏的一部分,正如您所料,它会添加各种新的功能。&#34;

我认为这是一个错误,但我发现我需要执行以下操作来更改文本(和取消按钮)颜色:

self.searchController.searchBar.barStyle = UISearchBarStyleMinimal;
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
     setTintColor:[UIColor whiteColor]];

我发现条形式,当保留为&#34;默认为&#34;无论色彩等等都会使文本变黑。当设置为Minimal或Prominent时,文本可见。

答案 8 :(得分:0)

这是一种更清洁的方法:

UITextField *searchField = nil;

for (UIView *v in self.searchBar.subviews)
{
    if ([v isKindOfClass:[UITextField class]])
    {
        searchField = (UITextField *)v;
        break;
    }
}

if (searchField)
{
    searchField.textColor = [UIColor whiteColor];
}

答案 9 :(得分:0)

修改David Foster(@ david-foster)建议的类别,以便在iOS 8上工作。

static UITextField *PBFindTextFieldInView(UIView *view) {
    for(UIView *subview in view.subviews) {
        if([subview isKindOfClass:UITextField.class]) {
            return (UITextField *)subview;
        } else {
            UITextField* textField = PBFindTextFieldInView(subview);
            if(textField) {
                return textField;
            }
        }
    }
    return nil;
}

@implementation UISearchBar (Appearance)

- (UITextField *)field {
    return PBFindTextFieldInView(self);
}

- (UIColor *)textColor {
    return self.field.textColor;
}

- (void)setTextColor:(UIColor *)color {
    self.field.textColor = color;
}

@end

答案 10 :(得分:0)

在iOS 11的searchController中设置navigationItem后,我发现尝试为textColor内的任何UIAppearance设置UITextField UISearchBar {1}}没有任何影响,但只是调用常规textColor的自定义外观属性工作得很好。

// Implement a custom appearance property via a UITextField category
@interface UITextField (SearchBarTextColor)

@property (nonatomic, strong) UIColor * textColorWorkaround UI_APPEARANCE_SELECTOR;

@end

@implementation UITextField (SearchBarTextColor)

- (UIColor *)textColorWorkaround {
    return self.textColor;
}

- (void)setTextColorWorkaround:(UIColor *)textColor {
    self.textColor = textColor;
}

@end

然后使用如下:

UITextField *textFieldProxy = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class]];
textFieldProxy.textColorWorkaround = UIColor.lightGrayColor;

P.S。同样的技巧帮助我为看似无法访问的UIDatePickerUIPickerView

标签着色