Подтвердить что ты не робот

Как изменить цвет текста поиска в UISearchBar?

Как изменить цвет текста UISearchBar?

4b9b3361

Ответ 1

Вам нужно получить доступ к UITextField внутри UISearchBar. Вы можете сделать это, используя 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

Ответ 2

Если вы хотите установить цвет текста для UISearchBar в раскадровке (без кода), это также легко сделать (в инспекторе идентификации). Вот краткий текст для строки поиска.

введите описание изображения здесь

Ответ 3

Работа в 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]

Ответ 4

Если вам нужно только сделать его читаемым на темном фоне, вы можете изменить barStyle. Следующее делает текст и кнопки в белой строке поиска:

searchController.searchBar.barStyle = .black

Ответ 5

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

Ответ 6

Самый удобный способ - установить свойство 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

Ответ 7

Это работает для меня на iOS 11, Xcode 9:

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

Я пишу его в AppDelegate, но я думаю, он работает, если вы поместите его в другое место.

Ответ 8

Вы можете сделать это, обратившись к UITextField внутри searchBar, то вы можете изменить цвет фона, цвет текста и все другие свойства UITextField.

добавьте следующее расширение для доступа к текстовому полю

extension UISearchBar {
    /// Return text field inside a search bar
    var textField: UITextField? {
        let subViews = subviews.flatMap { $0.subviews }
        guard let textField = (subViews.filter { $0 is UITextField }).first as? UITextField else { return nil
        }
        return textField
    }
}

Ответ 9

Начиная с 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")
    }
}

Ответ 10

(Это решение протестировано только для 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

Ответ 11

В моей ситуации решение

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

Ответ 12

Вот Xamarin.iOS С# версия подхода "найди UITextField". Не произойдет сбой, если 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;
        }
    }
}

Ответ 13

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