【发布时间】:2010-11-27 07:52:36
【问题描述】:
浏览了文档,我找不到任何可以改变 UISearchBar 颜色的东西。有谁知道如何改变它?没有任何 textColor 属性:/
谢谢
【问题讨论】:
-
Frickin 疯了,它需要这么多的黑客来改变 SearchBar 的文本颜色,C'mon apple!
标签: iphone text sdk colors uisearchbar
浏览了文档,我找不到任何可以改变 UISearchBar 颜色的东西。有谁知道如何改变它?没有任何 textColor 属性:/
谢谢
【问题讨论】:
标签: iphone text sdk colors uisearchbar
适用于 iOS 7 及更高版本:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
NSForegroundColorAttributeName : [UIColor whiteColor],
NSFontAttributeName : [UIFont systemFontOfSize:15]
}];
您也可以删除未使用的属性。
更新。由于 appearanceWhenContainedIn 在 iOS 9 中已弃用,请参阅以下 Dishant 的回答:https://stackoverflow.com/a/38893352/2799722
【讨论】:
您可以执行以下操作:只需从 SearchBar 中获取 searchField 属性,然后更改其 textColor 属性。
UITextField *searchField = [searchbar valueForKey:@"_searchField"];
searchField.textColor = [UIColor redColor]; //You can put any color here.
就是这样!现在您可以以任何可能的方式操作 textField。
【讨论】:
iOS 8:见https://stackoverflow.com/a/28183058/308315
iOS 6 / 7:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor redColor]];
【讨论】:
我怀疑你可以使用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
【讨论】:
这是一个添加此功能的类别:
@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
【讨论】:
对于 iOS11,我发现这很有效:
将searchController 设置为navigationItem 后,搜索文本为黑底黑字。为了让它变白,我必须这样做:
searchController.searchBar.barStyle = .blackTranslucent
这是唯一对我有用的东西。我的应用程序有一个透明的导航栏,可以让背景渐变显示出来,我猜 SearchBar 会呈现这种外观,因为我对 UISearchBar 的外观设置在很大程度上被忽略了,但有一个例外:
UISearchBar.appearance().tintColor = UIColor.red
这使取消按钮和文本插入光标变为红色。占位符文本为浅灰色。
请注意:UISearchBar.appearance().barStyle = .blackTranslucent 不起作用 - 它必须在实例上设置。这对搜索栏也没有明显的影响(它仍然像导航栏一样透明);它只是使搜索文本变白。
【讨论】:
appearanceWhenContainedIn 在 iOS 9 中已弃用,因此我们必须在 iOS 9 及更高版本中使用以下方法。
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
setTintColor:[UIColor whiteColor]];
【讨论】:
在 iOS 11 中,搜索栏有望成为导航栏的一部分,正如您所料,它会添加各种新的“功能”。
我认为这是一个错误,但我发现我需要执行以下操作来更改文本(和取消按钮)颜色:
self.searchController.searchBar.barStyle = UISearchBarStyleMinimal;
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
setTintColor:[UIColor whiteColor]];
我发现,当保留为“默认”时,条形样式会使文本变黑,无论色调如何等。当设置为“最小”或“突出”时,文本是可见的。
【讨论】:
这是一种更简洁的方法:
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];
}
【讨论】:
修改了 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
【讨论】:
在为 iOS 11 设置 navigationItem 中的 searchController 后,我发现尝试通过 UIAppearance 为 UISearchBar 内的任何 UITextField 设置 textColor 没有影响,但自定义外观简单地称为常规 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;
附:同样的技巧帮助我为UIDatePicker 和UIPickerView 看似无法访问的标签着色
【讨论】: