【问题标题】:Changing UISearchBar search field background更改 UISearchBar 搜索字段背景
【发布时间】: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 帖子,但我真的认为我已经阅读了所有内容。非常感谢。

【问题讨论】:

    标签: ios objective-c uisearchbar


    【解决方案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,则此解决方案不起作用。解决方案:stackoverflow.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

          【讨论】:

            猜你喜欢
            • 2011-11-05
            • 2015-03-19
            • 2012-11-30
            • 2015-01-16
            • 1970-01-01
            • 1970-01-01
            • 2011-07-10
            • 2018-08-30
            相关资源
            最近更新 更多