UISearchBar change placeholder color

前端 未结 17 2411
南旧
南旧 2020-12-04 15:16

Has anyone any idea or code sample on how can I change the text color of the placeholder text of a UISearchBar?

相关标签:
17条回答
  • 2020-12-04 15:49

    Swift 5 - ios 13:

    Those who are stuck let me tell you it is going to work only in viewDidLayoutSubviews not in viewDidLoad

    override func viewDidLayoutSubviews() {
    
        setupSearchBar(searchBar: YourSearchBar)
    
    }
    
        func setupSearchBar(searchBar : UISearchBar) {
    
        searchBar.setPlaceholderTextColorTo(color: UIColor.white)        
    
       }
    
    extension UISearchBar
    {
        func setPlaceholderTextColorTo(color: UIColor)
        {
            let textFieldInsideSearchBar = self.value(forKey: "searchField") as? UITextField
            textFieldInsideSearchBar?.textColor = color
            let textFieldInsideSearchBarLabel = textFieldInsideSearchBar!.value(forKey: "placeholderLabel") as? UILabel
            textFieldInsideSearchBarLabel?.textColor = color
        }
    }
    

    Happy coding :)

    0 讨论(0)
  • 2020-12-04 15:49

    iOS 13

    Previous solutions may not work on iOS 13 because new searchTextField has been added, and you can set attributed string on it.

    I wrapped that into category:

    @interface UISearchBar (AttributtedSetter)
    - (void)setThemedPlaceholder:(NSString*)localizationKey;
    @end
    
    @implementation UISearchBar (AttributtedSetter)
    
    - (void)setThemedPlaceholder:(NSString*)localizationKey {
        ThemeObject *currentTheme = [[ThemeManager standardThemeManager] currentTheme];
        self.searchTextField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:NSLocalizedString(localizationKey, @"") attributes:@{NSForegroundColorAttributeName : currentTheme.colorSearchBarText}];
    }
    
    @end
    
    0 讨论(0)
  • 2020-12-04 15:50

    Try this and see: (I tested below code with Swift 4.1 - Xcode 9.3-beta4)

    @IBOutlet weak var sbSearchBar: UISearchBar!
    
    if let textfield = sbSearchBar.value(forKey: "searchField") as? UITextField {
    
        textfield.backgroundColor = UIColor.yellow
        textfield.attributedPlaceholder = NSAttributedString(string: textfield.placeholder ?? "", attributes: [NSAttributedStringKey.foregroundColor : UIColor.red])
    
        textfield.textColor = UIColor.green
    
        if let leftView = textfield.leftView as? UIImageView {
            leftView.image = leftView.image?.withRenderingMode(.alwaysTemplate)
            leftView.tintColor = UIColor.red
        }
    }
    

    Here is result:

    0 讨论(0)
  • 2020-12-04 15:50

    It looks like Apple does not want us to play with the placeholder colors when it comes to UISearchBar class. So, let's create our own placeholder label!

    • No subclassing.
    • Works with iOS 13 SDK.
    • Just one innocent workaround.

    let searchBar = searchController.searchBar
    // ...
    // Configure `searchBar` if needed
    // ...
    
    let searchTextField: UITextField
    if #available(iOS 13, *) {
        searchTextField = searchBar.searchTextField
    } else {
        searchTextField = (searchBar.value(forKey: "searchField") as? UITextField) ?? UITextField()
    }
    
    // Since iOS 13 SDK, there is no accessor to get the placeholder label.
    // This is the only workaround that might cause issued during the review.
    if let systemPlaceholderLabel = searchTextField.value(forKey: "placeholderLabel") as? UILabel {
        // Empty or `nil` strings cause placeholder label to be hidden by the search bar
        searchBar.placeholder = " "
    
        // Create our own placeholder label
        let placeholderLabel = UILabel(frame: .zero)
    
        placeholderLabel.text = "Search"
        placeholderLabel.font = UIFont.systemFont(ofSize: 17.0, weight: .regular)
        placeholderLabel.textColor = UIColor.blue.withAlphaComponent(0.5)
    
        systemPlaceholderLabel.addSubview(placeholderLabel)
    
        // Layout label to be a "new" placeholder
        placeholderLabel.leadingAnchor.constraint(equalTo: systemPlaceholderLabel.leadingAnchor).isActive = true
        placeholderLabel.topAnchor.constraint(equalTo: systemPlaceholderLabel.topAnchor).isActive = true
        placeholderLabel.bottomAnchor.constraint(equalTo: systemPlaceholderLabel.bottomAnchor).isActive = true
        placeholderLabel.translatesAutoresizingMaskIntoConstraints = false
        placeholderLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
    } else {
        searchBar.placeholder = ""
    }
    
    0 讨论(0)
  • 2020-12-04 15:51

    Try this:

      UITextField *searchField = [searchbar valueForKey:@"_searchField"];
      field.textColor = [UIColor redColor]; //You can put any color here.
    
    0 讨论(0)
  • 2020-12-04 15:55

    Swift 3

    UILabel.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.white
    
    0 讨论(0)
提交回复
热议问题