Я хочу изменить цвет текста и значка на панели поиска iOS 11, когда он встроен в панель навигации. Так что заполнитель текста, поиск текста и значок поиска.
if #available(iOS 11.0, *) {
navigationController?.navigationBar.prefersLargeTitles = false
let searchController = UISearchController(searchResultsController: nil)
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = false
searchController.searchBar.placeholder = "Suchen"
searchController.searchBar.tintColor = .white
}
Как вы можете видеть на изображении, текст серого цвета на темно-синем фоне, который выглядит некрасиво. Я хочу, чтобы текст и значок были хотя бы белыми. (изменение синего цвета фона также не очень хорошо работает, см. мой другой вопрос)
Единственное, что работает, - это изменение цвета мигающего курсора и кнопки «отмена», что делается с помощью свойства .tintColor.
Решения, которые работают в iOS 10 и ниже, похоже, больше не работают в iOS 11, поэтому, пожалуйста, публикуйте только те решения, которые вы знаете, работающие в iOS 11. Спасибо.
Может быть, я упускаю из виду этот «автоматический стиль» в iOS 11. Любая помощь приветствуется.
7 ответов
Я только что узнал, как настроить и остальные из них: (с некоторой помощью Брэндона, спасибо!)
Текст «Отмена»:
searchController.searchBar.tintColor = .white
Значок поиска:
searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.search, state: .normal)
Значок очистки:
searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.clear, state: .normal)
Текст для поиска:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]
Спасибо за помощь @Brandon!
Заполнитель:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).attributedPlaceholder = NSAttributedString(string: "placeholder", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])
Белый фон:
let searchController = UISearchController(searchResultsController: nil)
searchController.delegate = self
let searchBar = searchController.searchBar
searchBar.tintColor = UIColor.white
searchBar.barTintColor = UIColor.white
if let textfield = searchBar.value(forKey: "searchField") as? UITextField {
textfield.textColor = UIColor.blue
if let backgroundview = textfield.subviews.first {
// Background color
backgroundview.backgroundColor = UIColor.white
// Rounded corner
backgroundview.layer.cornerRadius = 10;
backgroundview.clipsToBounds = true;
}
}
if let navigationbar = self.navigationController?.navigationBar {
navigationbar.barTintColor = UIColor.blue
}
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = false
Взято из здесь.
Ставить
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
И
UISearchBar.appearance().tintColor = UIColor.white
в AppDelegate
.
Или же поместите их обоих в [UIViewController viewDidLoad:]
Установить цвет текста поиска
(UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]) ).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
Задать цвет заполнителя поиска
(UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]) ).attributedPlaceholder = [NSForegroundColorAttributeName: UIColor.white]
В дополнение к ответу Дарко. В моем случае мне нужно получить чистый белый текстовый цвет для поиска. Также мне нужны пользовательские borderLine и cornerRadius. Так что, если я просто установлю цвет фона на белый, установлю радиус угла и линию границы, у меня получится что-то вроде этого.
Проблема в том, что у панели поиска есть некоторые подпредставления, и я только что удалил их. Вот мой код:
@interface YourViewController () <UISearchBarDelegate, UISearchControllerDelegate>
// your properties
@property (nonatomic,strong) UISearchController *searchController;
@property (nonatomic,strong) UISearchBar *searchBar;
@end
- (void)viewDidLoad {
[super viewDidLoad];
_searchController = [[UISearchController alloc] initWithSearchResultsController:self.resultsTableController];
_searchController.delegate = self;
_searchController.searchBar.delegate = self;
_searchBar = self.searchController.searchBar;
if (@available(iOS 11.0, *)) {
UITextField *searchTextField = [_searchBar valueForKey:@"searchField"];
if (searchTextField != nil) {
searchTextField.layer.cornerRadius = 4.f;
searchTextField.layer.borderWidth = 1.f;
searchTextField.clipsToBounds = YES;
for (UIView *subView in searchTextField.subviews) {
[subView removeFromSuperview];
}
}
// Color for "Cancel" button
_searchBar.tintColor = [UIColor blackColor];
// Add searchController to navgationBar
_navigationItem.searchController = _searchController;
// Hide searchBar when scroll
_navigationItem.hidesSearchBarWhenScrolling = YES;
}
}
Теперь у меня есть панель поиска с чистым белым фоном, пользовательский cornerRadius, пользовательская ширина границы. Также я отключил серую подсветку при нажатии.
Этот код меняет цвет фона текстового поля
Swift 4
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//background color of text field
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = .cyan
}
Отредактировано: образец UISearchBar в голубой
Мои два цента за Swift 4.x, слегка убранные.
Добавить в контроллер или приложение делегат:
appearance.backgroundColor = .green
let myFont = UIFont.italicSystemFont(ofSize: 12)
let attribs = [
NSAttributedString.Key(rawValue: NSAttributedString.Key.font.rawValue): myFont,
NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.red
]
appearance.defaultTextAttributes = attribs
В контроллере:
self.searchBar.barTintColor = .blue
Вы получите синий фон, зеленый фон панели поиска, красный шрифт:
Я попробовал решение Daroko, но у меня была проблема при изменении фона на чисто белый цвет (он был серым). Моим решением было использование setSearchFieldBackgroundImage . также я не хочу полагаться на яблочную структуру для получения UITextField
if #available(iOS 11.0, *) {
let whiteImage = UIImage(color: UIColor.white, size: CGSize(width: searchController.searchBar.layer.frame.width, height: searchController.searchBar.layer.frame.height))
searchController.searchBar.setSearchFieldBackgroundImage(whiteImage, for: .normal)
self.navigationItem.searchController = searchController
self.navigationItem.hidesSearchBarWhenScrolling = true
}
public extension UIImage {
public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
let rect = CGRect(origin: .zero, size: size)
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
color.setFill()
UIRectFill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
guard let cgImage = image?.cgImage else { return nil }
self.init(cgImage: cgImage)
} }
Я использовал расширение UIImage из: Создать сплошной цвет UIImage в Swift
Похожие вопросы
Связанные вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.