如何更改UISearchBar搜索文本颜色?

时间:2015-02-13 12:31:39

标签: ios swift uisearchbar

如何更改UISearchBar的文字颜色?

21 个答案:

答案 0 :(得分:80)

您必须访问UISearchBar中的UITextField。您可以使用valueForKey("searchField")

执行此操作
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField

textFieldInsideSearchBar?.textColor = yourcolor

Swift 3更新

let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField

textFieldInsideSearchBar?.textColor = yourcolor

答案 1 :(得分:46)

如果要在故事板(无代码)中为UISearchBar设置文本颜色,也很容易(在身份检查器中)。这是搜索栏的红色文字。

enter image description here

答案 2 :(得分:33)

在我的Swift 4中工作:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]

Swift 4.2,IOS 12:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]

答案 3 :(得分:33)

如果您只需要在深色背景上使其可读,您可以更改barStyle。以下内容使搜索栏中的文本和按钮变为白色:

searchController.searchBar.barStyle = .black

答案 4 :(得分:28)

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

答案 5 :(得分:9)

我认为最方便的方法是在textColor中设置UISearchBar属性。

  

Swift 3.0

    extension UISearchBar {

       var textColor:UIColor? {
           get {
               if let textField = self.value(forKey: "searchField") as? 
   UITextField  {
                   return textField.textColor
               } else {
                   return nil
               }
           }

           set (newValue) {
               if let textField = self.value(forKey: "searchField") as? 
   UITextField  {
                   textField.textColor = newValue
               }
           }
       }
   }

<强>用法

searchBar.textColor = UIColor.blue // Your color
  

Swift 2.3

extension UISearchBar {

 var textColor:UIColor? {
     get {
         if let textField = self.valueForKey("searchField") as? UITextField  {
             return textField.textColor
         } else {
             return nil
         }
     }

     set (newValue) {
         if let textField = self.valueForKey("searchField") as? UITextField  {
             textField.textColor = newValue
         }
     }
 }
} 

您可以将其用作:

searchBar.textColor = UIColor.blueColor() // Your color

答案 6 :(得分:9)

这适用于iOS 11,Xcode 9:

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

我在AppDelegate中写了它,但我想如果你把它放在其他地方也可以。

答案 7 :(得分:7)

从Xcode 11和iOS 13开始,可以直接访问文本字段:

searchBar.searchTextField

您可以编写一些代码以使其始终可以像这样访问。

extension UISearchBar {
    public var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return searchTextField
        } 

        guard let firstSubview = subviews.first else {
            assertionFailure("Could not find text field")
            return nil
        }

        for view in firstSubview.subviews {
            if let textView = view as? UITextField {
                return textView
            }
        }

        assertionFailure("Could not find text field")

        return nil
    }
}

您也可以将其设置为非必选选项,否则会出现致命错误,此代码已从iOS 7到iOS 13GM进行了测试。但是我只会选择可选版本。

extension UISearchBar {
    public var textField: UITextField {
        if #available(iOS 13.0, *) {
            return searchTextField
        }

        guard let firstSubview = subviews.first else {
            fatalError("Could not find text field")
        }

        for view in firstSubview.subviews {
            if let textView = view as? UITextField {
                return textView
            }
        }

       fatalError("Could not find text field")
    }
}

答案 8 :(得分:4)

尝试一下,

searchBar.searchTextField.textColor = .white

我将其与面向iOS 11以上的应用一起使用。

[更新] 我观察到,该应用在旧版本(

答案 9 :(得分:3)

您可以通过访问searchBar中的UITextField来执行此操作, 然后你可以改变它的背景颜色,文本颜色和所有其他UITextField属性

添加以下扩展名以访问textField

app.directive('buttonRaised', function() {
     return {
         restrict: 'E',
         template: '<button class="mdl-button" ng-class="{\'disabled\': disableButton}" ng-transclude></button>',
         scope: {
            disableButton: '='
          },
          transclude: true,
          link: function($scope, el, $attrs,formCtrl) {
               console.log(formCtrl)

           }
        };
      });

答案 10 :(得分:2)

我尝试了上面写的一些解决方案,但是它们没有用(我想是了)。

如果您只想处理iOS 13:

mySearchBar.searchTextField.textColor = .red

但是如果您也想处理较旧的iOS,这就是我的方法:

创建一个名为UISearchBar的自定义SearchBar : UISearchBar, UISearchBarDelegate类 此SearchBar将具有我要处理的UISearchBarDelegate方法并设置了delegate

然后我添加到班级:

    var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return self.searchTextField
        }
        return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
    }

简短说明:

现在使用iOS13,由于UITextField类型为UISearchBar.searchTextField(继承自UISearchTextField),您可以访问UITextField

由于我了解自己的层次结构,因此我知道我的textField不会是旧版本的nill,因此在两种情况下,我都可以轻松地自定义一个文本字段,从9开始处理每个版本到今天的13。

以下是使其正常工作所需的全部代码:


class SearchBar: UISearchBar, UISearchBarDelegate {

    var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return self.searchTextField
        }
        return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
    }


    override func awakeFromNib() {
        super.awakeFromNib()

        delegate = self

        if let textField = textField {
            textField.textColor = .red
            textField.clearButtonMode = .whileEditing
            textField.returnKeyType = .search
        }
    }

}

您还可以通过在SearchBar上添加一些自定义设置:

        let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self])
        searchBar.backgroundImage = UIImage()
        searchBar.isTranslucent = false
        searchBar.returnKeyType = .search

然后将其设置到XIB /情节提要中,就像处理简单的UISearchBar(如果您没有忘记代表们一样!),就可以对其进行处理。

答案 11 :(得分:2)

//尝试这个家伙

yourSearchbar.searchTextField.textColor = .white

答案 12 :(得分:2)

Swift 5.2和iOS 13.3.1:-

它工作正常。

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]

答案 13 :(得分:1)

(此解决方案仅在Xcode 10和iOS 12上进行了测试。)添加扩展名以访问搜索栏的文本字段:

extension UISearchBar {
    var textField: UITextField? {
        return subviews.first?.subviews.compactMap { $0 as? UITextField }.first
    }
}

然后使用该属性设置搜索栏中文本字段的文本颜色:

let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want

答案 14 :(得分:0)

这对我有用。

    if #available(iOS 13.0, *) {
     searchBar.searchTextField.textColor = .white
    }

答案 15 :(得分:0)

在Swift 5中,您可以执行以下操作:

yourSearchBar.searchTextField.textColor = .yourColor

答案 16 :(得分:0)

快捷键5:

{ "tripDescription": "Some trip description...", "justification": "Some justification...", "country": { "name": "BR" } }

答案 17 :(得分:0)

Obj-C

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

Swift 4.x

let textField = yourSearchbar.value(forKey: "searchField") as? UITextField
textField?.textColor = UIColor.red

答案 18 :(得分:0)

这里是“查找UITextField”方法的Xamarin.iOS C#版本。如果UITextField在将来的iOS视图层次结构中消失,它将不会崩溃。

var tf = searchBar.AllSubViews().FirstOrDefault(v => v is UITextField);
if (tf != null) 
    (tf as UITextField).TextColor = UIColor.White;

public static IEnumerable<UIView> AllSubViews(this UIView view)
{
    foreach (var v in view.Subviews)
    {
        yield return v;
        foreach (var sv in v.AllSubViews())
        {
            yield return sv;
        }
    }
}

答案 19 :(得分:0)

在我的情况下,解决方案是

id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];

答案 20 :(得分:-1)

Swift 5 Xcode 11.4 iOS 13.4

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)