更改 UISearchBar 搜索字段背景
Posted
技术标签:
【中文标题】更改 UISearchBar 搜索字段背景【英文标题】:Changing UISearchBar search field background 【发布时间】:2013-12-01 04:13:12 【问题描述】:我在UIView
中包含一个UISearchBar
,并且UIView
已分配给UITableView's tableHeaderView.
我正在尝试将UISearchBar
设置为如下所示:
走出大门,就是这个样子:
有很多关于如何设置UISearchBar
样式、搜索字段等的问题和答案,其中一些特别关注背景。其中许多涉及遍历UISearchBar's subviews
,找到UISearchBarBackground
(或_UISearchBarSearchFieldBackgroundView
)对象,并直接设置其背景颜色。我正在尝试找到支持的 API 来执行此操作,但是...
setSearchFieldBackgroundImage:forState:
方法似乎有很大的潜力,但这是我使用UIControlStateNormal
使用 1px 白色(或透明)图像时得到的:
关于如何让它发挥作用的任何想法?我很感激有人将我指向一个回答这个问题的 SO 帖子,但我真的认为我已经阅读了所有内容。非常感谢。
【问题讨论】:
【参考方案1】:请尝试以下代码
[[UISearchBar appearance]setBackgroundImage:[UIImage imageNamed:@“searchbar_bg.png"]];
for (UIView *searchbuttons in searchBar.subviews)
if ([searchbuttons isKindOfClass:[UIButton class]])
UIButton *cancelbutton = (UIButton *)searchbuttons;
[cancelbutton setBackgroundImage:[UIImage imageNamed:@“canelBtn.png"] forState:UIControlStateNormal];
UITextField *searchField = [searchBar valueForKey:@"_searchField"];
searchField.background = [UIImage imageNamed:@"bg.png"];
【讨论】:
这也不完全是。不幸的是,setBackgroundImage:
不太正确——我不是要设置搜索栏的背景图片,而是要设置搜索字段的背景。【参考方案2】:
ios 5.0 以上
[[UISearchBar appearance] setSearchFieldBackgroundImage:[UIImage imageNamed:@"YourBackground.png"]forState:UIControlStateNormal];
【讨论】:
我问题中的第三张图片显示了使用带有透明或白色背景图片的setSearchFieldBackgroundImage:forState:
的结果。【参考方案3】:
您可以使用barTintColor
或UISearchBar
的backgroundImage
属性直接完成您要执行的操作。
我重现了您的问题,似乎可以通过以下方式解决:
self.searchDisplayController.searchBar.barTintColor = [UIColor whiteColor];
或
self.searchDisplayController.searchBar.backgroundImage = [self imageWithColor:[UIColor whiteColor]];
附:如果您使用的是 backgroundImage 解决方案,则需要将方法 imageWithColor
制作如下
- (UIImage *)imageWithColor:(UIColor *)color
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
告诉我它是否有效!
【讨论】:
如果imageWithColor
方法被修改以设置更合适的高度,我能够完成这项工作(宽度将被缩放,但高度不是......至少在 iOS 7.1 中) .试试这个:CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 30.0f);
我将此行更改为将高度定义为 28.0f:CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 28.0f);
它基于 @robotspacer 的响应【参考方案4】:
您可以使用外观WhenContainedIn 来定位元素,而无需遍历视图层次结构。比如:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setBackgroundColor:[UIColor whiteColor]];
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor lightGrayColor]];
更新:
由于 appearanceWhenContainedIn
现在已弃用,请使用
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar self]]] <your setter here>];
【讨论】:
这应该是答案。 ^ 同意。做了我需要的一切。谢谢! 如果您将UISearchBarStyle
设置为.minimal
,则此解决方案不起作用。解决方案:***.com/a/42626728/2229062【参考方案5】:
我认为这里的问题是,当您使用setSearchFieldBackgroundImage:forState:
时,您的图像高度实际上决定了搜索字段的高度。标准搜索字段(至少从 iOS 8 开始)是 28 磅高,因此该高度的图像应该会产生您想要的效果。
(有点令人困惑,这也意味着九部分可拉伸图像通常看起来不正确 - 所以如果您想要的外观不仅仅是白底白字,您需要使用三部分可拉伸图像仅水平拉伸的图像。)
【讨论】:
就是这样,使用setSearchFieldBackgroundImage:forState:
方法并在您的imageWithColor
方法中创建一个宽度和高度为28px 的CGRect【参考方案6】:
下面的代码将实现结果。
_sbAddress.barTintColor = [UIColor whiteColor];
for (UIView *subView in _sbAddress.subviews)
for(id field in subView.subviews)
if ([field isKindOfClass:[UITextField class]])
UITextField *textField = (UITextField *)field;
[textField setPlaceholder:@"Search"];
或
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setPlaceholder:@"Search"];
【讨论】:
【参考方案7】:@joneswah 的回答在 iOS 9 中已被弃用。
对于 iOS 9,请将其放在您的 AppDelegate.m 中。我还添加了第一次启动键盘时键盘打开延迟的解决方法。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// Override point for customization after application launch.
// Remove lag on oppening the keyboard for the first time when clicked on any UITextField
UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];
//searchBar background color change
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setBackgroundColor:[UIColor greenColor]];//background color
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blackColor];//text color
return YES;
【讨论】:
【参考方案8】:iO9 完美的作品。
- (void)viewDidLoad
[super viewDidLoad];
[[self searchSubviewsForTextFieldIn:self.searchBar] setBackgroundColor: [UIColor redColor]];
- (UITextField*)searchSubviewsForTextFieldIn:(UIView*)view
if ([view isKindOfClass:[UITextField class]])
return (UITextField*)view;
UITextField *searchedTextField;
for (UIView *subview in view.subviews)
searchedTextField = [self searchSubviewsForTextFieldIn:subview];
if (searchedTextField)
break;
return searchedTextField;
【讨论】:
正是我想要的。谢谢。【参考方案9】:正如其他人所建议的,您需要遍历搜索栏的子视图并找到 UITextField 实例。但是,您需要设置它的 layer.backgroundColor,因为设置 backgroundColor 属性没有任何效果。我举个例子:
for view in searchBar.subviews
for subview in view.subviews
if let searchField = subview as? UITextField
searchField.layer.backgroundColor = UIColor.whiteColor().CGColor
这会给你你所需要的。
【讨论】:
【参考方案10】:My answer 可以在 ios 5 及更高版本上稳定运行,包括这 10 个。没有 hacks 和 KVO,Apple Way
【讨论】:
以上是关于更改 UISearchBar 搜索字段背景的主要内容,如果未能解决你的问题,请参考以下文章