【问题标题】:UISearchBar text colorUISearchBar 文字颜色
【发布时间】:2010-11-27 07:52:36
【问题描述】:

浏览了文档,我找不到任何可以改变 UISearchBar 颜色的东西。有谁知道如何改变它?没有任何 textColor 属性:/

谢谢

【问题讨论】:

  • Frickin 疯了,它需要这么多的黑客来改变 SearchBar 的文本颜色,C'mon apple!

标签: iphone text sdk colors uisearchbar


【解决方案1】:

适用于 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

【讨论】:

  • 在 iOS 8 中完美运行。
【解决方案2】:

您可以执行以下操作:只需从 SearchBar 中获取 searchField 属性,然后更改其 textColor 属性。

UITextField *searchField = [searchbar valueForKey:@"_searchField"];
searchField.textColor = [UIColor redColor]; //You can put any color here.

就是这样!现在您可以以任何可能的方式操作 textField。

【讨论】:

  • 是的。这绝对不是一个好的解决方案。你不应该使用 Apple 的私有属性。
  • 不要使用这个!这是一个私有 API,你会在 AppStore 被拒绝。
【解决方案3】:

iOS 8:见https://stackoverflow.com/a/28183058/308315

iOS 6 / 7:

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

【讨论】:

  • 轻松最佳答案
【解决方案4】:

我怀疑你可以使用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

【讨论】:

    【解决方案5】:

    这是一个添加此功能的类别:

    @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
    

    【讨论】:

    • 它在 iOS7 中不起作用,因为 UITextField 在层次结构中移动得更深。这行得通: // HACK:这在未来的 iOS 版本中可能不起作用 for (UIView *subview in bar.subviews) { if ([subview isKindOfClass:[UITextField class]]) { return (UITextField *)subview; } else { for (UIView *subview2 in subview.subviews) { if ([subview2 isKindOfClass:[UITextField class]]) { return (UITextField *)subview2; } } } }
    • 新的 ios 开发者,当苹果提供设置外观属性的 api 时,这不是选择的答案。循环遍历子视图几乎从来都不是正确的解决方案。
    【解决方案6】:

    对于 iOS11,我发现这很有效:

    searchController 设置为navigationItem 后,搜索文本为黑底黑字。为了让它变白,我必须这样做:

    searchController.searchBar.barStyle = .blackTranslucent
    

    这是唯一对我有用的东西。我的应用程序有一个透明的导航栏,可以让背景渐变显示出来,我猜 SearchBar 会呈现这种外观,因为我对 UISearchBar 的外观设置在很大程度上被忽略了,但有一个例外:

    UISearchBar.appearance().tintColor = UIColor.red
    

    这使取消按钮和文本插入光标变为红色。占位符文本为浅灰色。

    请注意:UISearchBar.appearance().barStyle = .blackTranslucent 不起作用 - 它必须在实例上设置。这对搜索栏也没有明显的影响(它仍然像导航栏一样透明);它只是使搜索文本变白。

    【讨论】:

      【解决方案7】:

      appearanceWhenContainedIn 在 iOS 9 中已弃用,因此我们必须在 iOS 9 及更高版本中使用以下方法。

      [[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
       setTintColor:[UIColor whiteColor]];
      

      【讨论】:

        【解决方案8】:

        在 iOS 11 中,搜索栏有望成为导航栏的一部分,正如您所料,它会添加各种新的“功能”。

        我认为这是一个错误,但我发现我需要执行以下操作来更改文本(和取消按钮)颜色:

        self.searchController.searchBar.barStyle = UISearchBarStyleMinimal;
        [[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
             setTintColor:[UIColor whiteColor]];
        

        我发现,当保留为“默认”时,条形样式会使文本变黑,无论色调如何等。当设置为“最小”或“突出”时,文本是可见的。

        【讨论】:

          【解决方案9】:

          这是一种更简洁的方法:

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

          【讨论】:

            【解决方案10】:

            修改了 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
            

            【讨论】:

              【解决方案11】:

              在为 iOS 11 设置 navigationItem 中的 searchController 后,我发现尝试通过 UIAppearanceUISearchBar 内的任何 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;
              

              附:同样的技巧帮助我为UIDatePickerUIPickerView 看似无法访问的标签着色

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-04-01
                • 2011-02-16
                相关资源
                最近更新 更多