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

Цвет кнопки отмены UISearchBar?

Когда я отбрасываю UISearchBar в свой вид внутри Interface Builder и меняю свой стиль на Black Opaque, кнопка отмены остается незакрепленной сине-серой и не становится черной.

Как сделать кнопку отмены черной?

EDIT: он работает следующим образом:

// Assume a UISearchBar searchBar.
NSArray *subviews = [searchBar subviews];

// The index depends on how you configure the searchBar.
UIButton *cancelButton = [subviews objectAtIndex:3];

// Set the style to "normal" style.
[cancelButton setStyle:0];

Но метод setStyle: относится к частной структуре, поэтому это может быть проблемой при отправке приложения в Apple.

4b9b3361

Ответ 1

Я использовал что-то вроде этого и работал со мной:

[[UIBarButtonItem appearanceWhenContainedIn: [UISearchBar class], nil] setTintColor:[UIColor blackColor]];

он изменил цвет кнопки отмены на черный.

Обновить для iOS 9.0, метод appearanceWhenContainedIn устарел, вместо этого используйте appearanceWhenContainedInInstancesOfClasses:

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

И в Swift 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf:[UISearchBar.self]).tintColor = UIColor.black

Ответ 2

Проблема с вашим решением заключается в том, что в коде предполагается, что objectAtIndex: 3 является кнопкой отмены. Это не только генерирует предупреждение компилятора, но и если вы программно показываете кнопку "Отмена" (например, используя [searchBar setShowsCancelButton:YES], вы рискуете скомпрометировать приложение.

Более простым решением является установка стиля всей панели поиска в ViewDidLoad(), используя:

searchBar.tintColor = [UIColor colorWithWhite:0.3 alpha:1.0];

это переопределяет стиль, заданный в построителе интерфейса, но также меняет цвет кнопки "Отмена" на тот же цвет, что и вся панель (хотя это не позволяет вам самостоятельно установить стиль кнопки "Отмена" .

Ответ 3

Я принял ответ Benjamin's и объединил его с безопасным поиском Array для создания короткой, но безопасной функциональной версии:

searchController.searchBar.tintColor = UIColor.whiteColor()
(searchController.searchBar.subviews[safe: 0]?.subviews as? [UIView])?
    .filter({$0.isKindOfClass(UITextField)})
    .map({$0.tintColor = .lightGrayColor()})

Это приводит к окрашиванию кнопки "Отмена" белым и курсору при печати серым цветом. В противном случае он был бы белым и, следовательно, не видел. searchController - объект типа UISearchController. Если кто-то хочет использовать его внутри контроллера результатов, замените его на self.

Реализация индекса safe: nkukushkin's ответ:

extension Array {
    subscript(safe index: Int) -> T? {
        return indices(self) ~= index ? self[index] : nil
    }
}

Ответ 4

Нажмите "Панель поиска" и установите цвет оттенок в представлении "Интерфейс".

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

Ответ 5

let view: UIView = self.searchBar.subviews[0] as UIView
let subViewsArray = view.subviews

for subView: UIView in subViewsArray {
    if let cancelButt = subView as? UIButton{
        cancelButt.setTitleColor(UIColor.white, for: .normal)         
    }
}

Это сработало для меня

Ответ 6

Это обновленная версия Hossam Ghareeb ответ выше для Swift 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self] ).tintColor = UIColor.red

Но это не будет отменять внешний вид, если он уже был установлен в другом месте для UIBarButtonItem.

Например, в моем контроллере навигации я должен был изменить это:

UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal)

Для этого для вышеприведенного решения:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self] ).setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal)

Ответ 7

Для тех, кто хочет воспроизвести одно и то же поведение в Swift:

override func viewWillAppear(animated: Bool) {
    self.searchBar.tintColor = UIColor.whiteColor()

    let view: UIView = self.searchBar.subviews[0] as! UIView
    let subViewsArray = view.subviews

    for (subView: UIView) in subViewsArray as! [UIView] {
        println(subView)
        if subView.isKindOfClass(UITextField){
            subView.tintColor = UIColor.blueColor()
        }
    }

}

Ответ 8

для iOS 10:

UISearchBar.appearance().tintColor = UIColor.red //cancel button color
UISearchBar.appearance().barTintColor = UIColor.blue //background button color