Изменение цвета текста UISearchBar в iOS 7
Как изменить цвет текста UISearchBar
в iOS 7
?
В iOS 6
я подклассифицировал UISearchBar
и layoutSubviews
, настроив свойства UITextField
subview UISearchBar
.
Но в iOS 7
, UISearchBar
не имеет UITextField
в качестве подзапроса. Как это исправить?
Ответы
Ответ 1
В iOS 7 для доступа к текстовому полю вам нужно еще раз подтвердить уровень. Измените свой код следующим образом
for (UIView *subView in self.searchBar.subviews)
{
for (UIView *secondLevelSubview in subView.subviews){
if ([secondLevelSubview isKindOfClass:[UITextField class]])
{
UITextField *searchBarTextField = (UITextField *)secondLevelSubview;
//set font color here
searchBarTextField.textColor = [UIColor blackColor];
break;
}
}
}
Примечание. Это не открытый API
ИЛИ
Вы можете использовать внешний вид Свойство UIControls, Like
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor redColor]}];
Примечание. Прокси-сервер внешнего вида можно использовать для iOS 9.0+
Аудиовыхода
![enter image description here]()
Вы можете установить tintcolor
для применения к ключевым элементам в search bar
.
Используйте tintcolor
для выравнивания элементов переднего плана.
Используйте barTintColor
, чтобы оттенять фоновый фон.
В iOS v7.0 все подклассы UIView получают свое поведение для tintColor из базового класса. См. Обсуждение tintColor на уровне UIView для получения дополнительной информации.
Apple Doc
Ответ 2
Вы можете установить цвет текста с помощью
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor blueColor]];
Ответ 3
Для XCode 6 (iOS8 SDK) следующее НЕ РАБОТАЕТ
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor redColor]];
Но работают следующие работы (для развертывания в iOS7 и iOS8)
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor redColor]}];
Ответ 4
Хотя верно, что протокол UIAppearance является "общедоступным API", это не так, что поддерживает UITextField.
Если вы посмотрите на UITextField.h и найдите строку "UI_APPEARANCE_SELECTOR", вы увидите, что у нее нет экземпляров этой строки. Если вы посмотрите на UIButton, вы найдете немало - это все свойства, которые официально поддерживаются API UIAppearance. Это несколько хорошо известно, что UITextField не поддерживается API UIAppearance, поэтому код в ответе Sandeep не всегда работает, и на самом деле это не самый лучший подход.
Это полезный пост с полезными ссылками: http://forums.xamarin.com/discussion/175/uitextfield-appearance
Правильный подход, к сожалению, беспорядочен - итерация через subviews (или subviews основного subview для iOS7) и установка его вручную. В противном случае у вас будут недостоверные результаты. Но вы можете просто создать категорию для UISearchBar и добавить цветовой метод setTextColor: (UIColor *). Пример:
- (void)setTextColor:(UIColor*)color
{
for (UIView *v in self.subviews)
{
if([Environment isVersion7OrHigher]) //checks UIDevice#systemVersion
{
for(id subview in v.subviews)
{
if ([subview isKindOfClass:[UITextField class]])
{
((UITextField *)subview).textColor = color;
}
}
}
else
{
if ([v isKindOfClass:[UITextField class]])
{
((UITextField *)v).textColor = color;
}
}
}
}
Ответ 5
Внимание: это должно привести к отказу приложения!
KVC FTW. Это сделало это для меня.
UITextField *searchField = [self.searchBar valueForKey:@"_searchField"];
searchField.textColor = [UIColor redColor];
Ответ 6
Вы можете установить текстовые атрибуты так:
[[UITextField appearanceWhenContainedIn:[<YOUR_CONTROLLER_NAME> class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName:[UIFont systemFontOfSize:14.0]}];
Ответ 7
Вот пример работы, выполненный на С# с использованием Xamarin:
SearchBar = new UISearchBar ();
foreach (var subView in SearchBar.Subviews) {
foreach (var field in subView.Subviews) {
if (field is UITextField) {
UITextField textField = (UITextField)field;
textField.TextColor = UIColor.White;
}
}
}
Надеюсь, это поможет кому-то.
Ответ 8
Кажется, это правильный ответ fooobar.com/questions/108661/...
Версия Swift:
UITextField.appearanceWhenContainedInInstancesOfClasses([UISearchBar.self]).textColor = UIColor.blueColor()
Это будет работать только для iOS 9.0, чтобы заставить его работать для более низких версий, вам нужно будет следовать этому вопросу. fooobar.com/questions/51684/...
Ответ 9
Быстрое расширение
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
}
}
Ответ 10
В моем случае у меня есть несколько объектов UISearchBar
, и им нужно изменить цвет шрифта textField
. appearanceWhenContainedIn
обновляет поведение UISearchBar
, но другое не работает.
Я подклассифицирую UISearchBar
и реализую пользовательский -(id)initWithFrame:
как следующий, и он работает.
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.searchBarStyle = UISearchBarStyleMinimal;
self.tintColor = [UIColor whiteColor];
self.barTintColor = [UIColor whiteColor];
[[UITextField appearanceForTraitCollection:self.traitCollection whenContainedIn:[self class], nil] setDefaultTextAttributes:
@{
NSForegroundColorAttributeName : [UIColor whiteColor]
}];
}
return self;
}
Ссылка на протокол UIAppearance сообщила, что
Иными словами, оператор сдерживания в появлениеWhenContainedIn: рассматривается как частичный порядок. Учитывая конкретное упорядочение (фактическая иерархия подчинения), UIKit выбирает частичное упорядочение, которое является первым уникальным совпадением при чтении фактическая иерархия из окна вниз.
Итак, appearanceWhenContainedIn:
не будет обрабатывать все UISearchBar
в иерархии UIWindow
. И это предполагает, что.
Используйте внешний видForTraitCollection: и Внешний видForTraitCollection: whenContainedIn: методы для извлечения прокси для класса с указанной коллекцией признаков.
Ответ 11
Самый простой способ сделать это - поместить этот код в viewDidAppear или viewWillAppear:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
Это работает в iOS 8 и Xcode 6, в отличие от другого кода. Это может испортить шрифт и размер текста и т.д., Но вы можете изменить это в текстовых атрибутах.
Это изменяет цвет текста для всех строк поиска в вашем приложении. Если вы хотите изменить его, используйте приведенный выше код, а затем в любых других представлениях с помощью строки поиска используйте один и тот же код, но установите цвет по своему желанию.
Ответ 12
вы можете использовать панель поиска внутри текстового поля
UISearchBar * searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 50, 320, 44) ];
searchBar.autocorrectionType = UITextAutocapitalizationTypeWords;
searchBar.delegate = self;
searchBar.searchBarStyle = UISearchBarStyleMinimal;
searchBar.barTintColor = [UIColor redColor];
[[UITextField appearanceWhenContainedIn:[searchBar class], nil]setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
[self.view addSubview:searchBar];
Ответ 13
Обновление в Swift 3
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.black
Ответ 14
Хотя я бы предпочел использовать API внешнего вида, он не работал с iOS8. Здесь наименее хакерское решение, с которым я столкнулся:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if (self.shouldEnableSearchBar)
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
UITextField *searchBarTextField = [[AFPBaseViewController findSubviewsOfView:self.searchBar ofClass:[UITextField class]] firstObject];
searchBarTextField.textColor = AFPConstantsColorGold;
});
}
}
Возможно, вы даже можете создать категорию UIView. Причина, по которой это должно быть вызвана в viewDidAppear, заключается в том, что UISearchBar фактически содержится в ViewController и не загружает все его дочерние объекты до тех пор, пока он не появится на экране. Он также может быть добавлен в viewWillAppear, но я его не тестировал.
+ (NSArray *)findSubviewsOfView:(UIView *)view ofClass:(Class)class
{
NSMutableArray *targetSubviews = [NSMutableArray new];
for (id subview in view.subviews)
{
if ([subview isKindOfClass:class])
{
[targetSubviews addObject:subview];
}
if ([subview subviews].count)
{
[targetSubviews addObjectsFromArray:[self findSubviewsOfView:subview ofClass:class]];
}
}
return targetSubviews.copy;
}
Ответ 15
Это правильное решение для iOS8:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:14], NSForegroundColorAttributeName:[UIColor lightGrayColor]}];
Вы также должны установить шрифт, иначе размер шрифта будет неправильным.
Ответ 16
Этот класс даст вам полный контроль над каждым элементом в UISearchBar
import UIKit
class SMTSearchBar: UISearchBar {
override init(frame: CGRect) {
super.init(frame: frame)
initialize()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
initialize()
}
convenience init() {
self.init(frame: CGRectZero)
initialize()
}
// Style the view
func initialize() {
// Search Area
let searchField = valueForKey("searchField") as! UITextField
searchField.textColor = Colors.White
searchField.font = UIFont(name: Fonts.MuseoSans500, size: 16)
searchField.backgroundColor = Colors.Black.colorWithAlphaComponent(0.1)
// Icons
let searchIcon = UIImage(named: Icons.Search)?.imageWithTint(Colors.White)
let smallClearIconNormal = UIImage(named: Icons.SmallClear)?.imageWithTint(Colors.White)
let smallClearIconHighLight = UIImage(named: Icons.SmallClear)?.imageWithTint(Colors.White.colorWithAlphaComponent(0.5))
setImage(searchIcon, forSearchBarIcon: .Search, state: .Normal)
setImage(smallClearIconHighLight, forSearchBarIcon: .Clear, state: .Highlighted)
setImage(smallClearIconNormal, forSearchBarIcon: .Clear, state: .Normal)
}
func setPlaceHolder(placeholder: String) {
for subView in subviews{
for subsubView in subView.subviews {
if let textField = subsubView as? UITextField {
textField.attributedPlaceholder = NSAttributedString(string: placeholder, attributes: [NSForegroundColorAttributeName: Colors.White.colorWithAlphaComponent(0.5)])
}
}
}
}
}
Использование (в панели навигации)
let searchBar:SMTSearchBar = SMTSearchBar()
searchBar.sizeToFit()
searchBar.setPlaceHolder("Search for cool things")
navigationItem.titleView = searchBar
searchBar.becomeFirstResponder()