Обычно вы можете настроить внешний вид UISearchBar, включая цвет фона, с помощью API UIAppearance. Чтобы настроить цвет фона, вы можете использовать тему UISearchTextField, которая представляет собой подкласс UITextField, используемый в панелях поиска:
UISearchTextField.appearance().backgroundColor = .blue.withAlphaComponent(0.1)
Однако когда UISearchBar используется в UINavigationController, добавляется дополнительное фоновое представление с цветом заливки третичной системы; это затемнит вашу панель поиска:
Проверка иерархии представлений показывает, что это экземпляр _UISearchBarSearchFieldBackgroundView
. Я изучил все существующие вопросы о переполнении стека, связанные с изменением цвета фона панели поиска, и не смог найти решение, которое работало бы с UIAppearance и учитывало бы это. Есть ли способ скрыть или изменить цвет представления?
Мне удалось найти комбинацию стилей UIAppearance, которая может заставить эту работу работать, но для этого требуется расширение UIView, чтобы вы могли повторно применить угловой радиус.
Первый шаг — установить пустое изображение в качестве фонового изображения поля панели поиска. Этого достаточно, чтобы удалить лишний фоновый вид:
UISearchBar.appearance().setSearchFieldBackgroundImage(UIImage(), for: .normal)
Однако это приводит к тому, что угловой радиус не применяется:
Чтобы стилизовать радиус угла с помощью UIAppearance, добавьте следующее расширение к UIView (или UISearchTextField, чтобы сделать его более изолированным):
private extension UIView {
@objc dynamic var cornerRadius: CGFloat {
get { layer.cornerRadius }
set { layer.cornerRadius = newValue }
}
@objc dynamic var cornerCurve: CALayerCornerCurve {
get { layer.cornerCurve }
set { layer.cornerCurve = newValue }
}
}
Затем вы можете применить радиус по умолчанию 10 и непрерывную кривую, которая будет соответствовать системе:
Полное решение:
UISearchBar.appearance().setSearchFieldBackgroundImage(UIImage(), for: .normal)
UISearchTextField.appearance().backgroundColor = .blue.withAlphaComponent(0.1)
UISearchTextField.appearance().cornerRadius = 10
UISearchTextField.appearance().cornerCurve = .continuous
Да, конечно! Я должен был упомянуть, что это касается глобальной темы в приложении с UIKit и SwiftUI (где вы вообще не можете использовать собственный подкласс, если хотите использовать модификатор с возможностью поиска).
Будьте осторожны с использованием
.appearance()
. Это изменит внешний вид всего приложения, а не только той страницы, на которой вы сейчас находитесь. Если вы не хотите, чтобы этот стиль был везде, вам следует написать собственное представление или подкласс UISeachBar.