UISearchBar文字颜色在iOS 7中更改

如何更改iOS 7UISearchBar文本颜色?

iOS 6 ,我是UISearchBar子类,在layoutSubviews定制了UISearchBarUITextField子视图的属性。

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

在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; } } } 

注意:这是Not Public API

要么

你可以使用UIControls的外观属性,像

 [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor redColor]}]; 

注意:外观代理可以用于iOS 9.0以上的OutPut

在这里输入图像描述

您可以将tintcolor设置为应用于search bar关键元素。

使用tintColor来着色前景元素。

使用barTintColor为酒吧背景着色。

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

您可以通过设置文本颜色

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

对于XCode 6(iOS8 SDK),以下方法不起作用

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

但下面的工作(用于部署到iOS7和iOS8)

 [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor redColor]}]; 

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

KVC FTW。 这是为我做的。

 UITextField *searchField = [self.searchBar valueForKey:@"_searchField"]; searchField.textColor = [UIColor redColor]; 

虽然UIAppearance协议确实是一个“公共API”,但UITextField支持这一点并不是真的。

如果你看看UITextField.h并查找string“UI_APPEARANCE_SELECTOR”,你会发现它没有这个string的实例。 如果你看看UIButton,你会发现很多 – 这些都是由UIAppearance API正式支持的所有属性。 UIAextField不被UIAppearance API所支持,这是众所周知的,所以Sandeep的答案中的代码并不总是有效,实际上并不是最好的方法。

这是一个有用的职位,有用的链接: http : //forums.xamarin.com/discussion/175/uitextfield-appearance

不幸的是,正确的做法很麻烦 – 通过子视图(或iOS7主子视图的子视图)迭代并手动设置。 否则你会有不可靠的结果。 但是您可以为UISearchBar创build一个类别并添加一个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; } } } } 

你可以像这样设置文本属性

 [[UITextField appearanceWhenContainedIn:[<YOUR_CONTROLLER_NAME> class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName:[UIFont systemFontOfSize:14.0]}]; 

这里是使用Xamarin在C#中完成的工作示例:

 SearchBar = new UISearchBar (); foreach (var subView in SearchBar.Subviews) { foreach (var field in subView.Subviews) { if (field is UITextField) { UITextField textField = (UITextField)field; textField.TextColor = UIColor.White; } } } 

希望这有助于某人。

这似乎是正确的答案https://stackoverflow.com/a/19315895/2493073

它的Swift版本是:

 UITextField.appearanceWhenContainedInInstancesOfClasses([UISearchBar.self]).textColor = UIColor.blueColor() 

这只适用于iOS 9.0 ,为了使它适用于较低版本,您需要遵循这个问题。 https://stackoverflow.com/a/27807417/2493073

Swift Extension

 public extension UISearchBar { public func setTextColor(color: UIColor) { let svs = subviews.flatMap { $0.subviews } guard let tf = (svs.filter { $0 is UITextField }).first as? UITextField else { return } tf.textColor = color } } 

在我的情况下,我有多个UISearchBar对象,他们需要更改textField字体颜色。 appearanceWhenContainedIn UISearchBar在更新一个UISearchBar行为,但另一个没有。

UISearchBar并实现自定义-(id)initWithFrame:如下,它的工作原理。

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.searchBarStyle = UISearchBarStyleMinimal; self.tintColor = [UIColor whiteColor]; self.barTintColor = [UIColor whiteColor]; [[UITextField appearanceForTraitCollection:self.traitCollection whenContainedIn:[self class], nil] setDefaultTextAttributes: @{ NSForegroundColorAttributeName : [UIColor whiteColor] }]; } return self; } 

UIAppearance Protocol Reference表示,

换句话说,appearanceWhenContainedIn中的包含语句被视为部分sorting。 给定一个具体的顺序(实际的子视图层次结构),当从窗口向下读取实际层次结构时,UIKitselect第一个唯一匹配的部分顺序。

所以, appearanceWhenContainedIn:将不处理UIWindow UISearchBar中的所有UISearchBar 。 这表明这一点。

使用appearanceForTraitCollection:和appearanceForTraitCollection:whenContainedIn:方法来检索具有指定特征集合的类的代理。

最简单的方法是将这段代码放在viewDidAppear或viewWillAppear中

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

与其他一些代码不同, 它适用于iOS 8和Xcode 6 。 它可以混乱的字体和文字大小等,但你可以改变它的文字属性。

这改变了你的应用程序中所有search栏的文字颜色。 如果你只是想改变一个,使用上面的代码,然后在任何其他视图与search栏,使用相同的代码,但设置颜色为任何你想要的。

你可以在文本框内使用search栏

  UISearchBar * searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 50, 320, 44) ]; searchBar.autocorrectionType = UITextAutocapitalizationTypeWords; searchBar.delegate = self; searchBar.searchBarStyle = UISearchBarStyleMinimal; searchBar.barTintColor = [UIColor redColor]; [[UITextField appearanceWhenContainedIn:[searchBar class], nil]setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}]; [self.view addSubview:searchBar]; 

尽pipe我更喜欢使用外观API,但它不适用于iOS8。 这里是我最不喜欢的解决办法:

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if (self.shouldEnableSearchBar) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^ { UITextField *searchBarTextField = [[AFPBaseViewController findSubviewsOfView:self.searchBar ofClass:[UITextField class]] firstObject]; searchBarTextField.textColor = AFPConstantsColorGold; }); } } 

你甚至可以用这个创build一个UIView类别。 在viewDidAppear中调用的原因是UISearchBar实际上包含在一个ViewController中,并且不会加载它的所有子视图直到它出现在屏幕上。 它可以被添加到viewWillAppear,但我没有testing它。

 + (NSArray *)findSubviewsOfView:(UIView *)view ofClass:(Class)class { NSMutableArray *targetSubviews = [NSMutableArray new]; for (id subview in view.subviews) { if ([subview isKindOfClass:class]) { [targetSubviews addObject:subview]; } if ([subview subviews].count) { [targetSubviews addObjectsFromArray:[self findSubviewsOfView:subview ofClass:class]]; } } return targetSubviews.copy; } 

这是iOS8的正确解决scheme:

 [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:14], NSForegroundColorAttributeName:[UIColor lightGrayColor]}]; 

你必须设置字体,否则,字体大小将是错误的。

这个类将让你完全控制UISearchBar每个项目


 import UIKit class SMTSearchBar: UISearchBar { override init(frame: CGRect) { super.init(frame: frame) initialize() } required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder)! initialize() } convenience init() { self.init(frame: CGRectZero) initialize() } // Style the view func initialize() { // Search Area let searchField = valueForKey("searchField") as! UITextField searchField.textColor = Colors.White searchField.font = UIFont(name: Fonts.MuseoSans500, size: 16) searchField.backgroundColor = Colors.Black.colorWithAlphaComponent(0.1) // Icons let searchIcon = UIImage(named: Icons.Search)?.imageWithTint(Colors.White) let smallClearIconNormal = UIImage(named: Icons.SmallClear)?.imageWithTint(Colors.White) let smallClearIconHighLight = UIImage(named: Icons.SmallClear)?.imageWithTint(Colors.White.colorWithAlphaComponent(0.5)) setImage(searchIcon, forSearchBarIcon: .Search, state: .Normal) setImage(smallClearIconHighLight, forSearchBarIcon: .Clear, state: .Highlighted) setImage(smallClearIconNormal, forSearchBarIcon: .Clear, state: .Normal) } func setPlaceHolder(placeholder: String) { for subView in subviews{ for subsubView in subView.subviews { if let textField = subsubView as? UITextField { textField.attributedPlaceholder = NSAttributedString(string: placeholder, attributes: [NSForegroundColorAttributeName: Colors.White.colorWithAlphaComponent(0.5)]) } } } } } 

用法(在导航栏中)

 let searchBar:SMTSearchBar = SMTSearchBar() searchBar.sizeToFit() searchBar.setPlaceHolder("Search for cool things") navigationItem.titleView = searchBar searchBar.becomeFirstResponder() 

在Swift 3中更新

 UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.black