更改 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】:

您可以使用barTintColorUISearchBarbackgroundImage 属性直接完成您要执行的操作。

我重现了您的问题,似乎可以通过以下方式解决:

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 搜索字段背景的主要内容,如果未能解决你的问题,请参考以下文章

UISearchBar:更改输入字段的背景颜色

如何在iOS上更改UISearchBar组件的内部背景颜色

iOS:带有 UISearchdisplaycontroller 的 UISearchBar 通过单击搜索栏崩溃

UISearchBar的外观自定义,打造你的搜索框

UISearchBar的外观自定义,打造你的搜索框

UISearchBar 在解雇后正在调整大小