Просмотрел документацию, и я не смог найти ничего, чтобы изменить цвет UISearchBar. Кто-нибудь знает, как его изменить? Нет свойства textColor:/
спасибо
Просмотрел документацию, и я не смог найти ничего, чтобы изменить цвет UISearchBar. Кто-нибудь знает, как его изменить? Нет свойства textColor:/
спасибо
Вы можете сделать следующее: просто получите свойство searchField из SearchBar, а затем измените его свойство textColor.
UITextField *searchField = [searchbar valueForKey:@"_searchField"];
searchField.textColor = [UIColor redColor]; //You can put any color here.
Что это! Теперь вы можете манипулировать текстовым полем любым способом.
iOS 8: см. fooobar.com/questions/462449/...
iOS 6/7:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor redColor]];
Работает на iOS 7 и более поздних версиях:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
NSForegroundColorAttributeName : [UIColor whiteColor],
NSFontAttributeName : [UIFont systemFontOfSize:15]
}];
Вы также можете удалить неиспользуемый атрибут.
UPDATE. Из-за appearanceWhenContainedIn
устарел в iOS 9, см. Ответ Dishant ниже: fooobar.com/questions/462449/...
Я подозреваю, что вы можете использовать методы, описанные в этом сообщении
Изменив представленный здесь код немного, вы подклассом UISearchBar:
@interface SearchBar : UISearchBar {
}
@end
Затем в вашей реализации:
- (void)layoutSubviews {
UITextField *searchField;
NSUInteger numViews = [self.subviews count];
for(int i = 0; i < numViews; i++) {
if([[self.subviews objectAtIndex:i] isKindOfClass:[UITextField class]]) {
searchField = [self.subviews objectAtIndex:i];
}
}
if(!(searchField == nil)) {
searchField.textColor = [UIColor redColor];
}
[super layoutSubviews];
}
Я не тестировал ни оригинальный почтовый код, ни этот код, но похоже, что он должен работать. -wkw
Здесь категория, которая добавляет эту функциональность:
@implementation UISearchBar (UISearchBar_TextColor)
- (UITextField *)field {
// HACK: This may not work in future iOS versions
for (UIView *subview in self.subviews) {
if ([subview isKindOfClass:[UITextField class]]) {
return (UITextField *)subview;
}
}
return nil;
}
- (UIColor *)textColor {
return self.field.textColor;
}
- (void)setTextColor:(UIColor *)color {
self.field.textColor = color;
}
@end
Внешний видWhenContainedIn устарел в iOS 9, поэтому мы должны использовать ниже метод для iOS 9 и выше.
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
setTintColor:[UIColor whiteColor]];
Для iOS11 я нашел, что это сработало:
После установки searchController
в navigationItem
текст поиска был черным на черном. Чтобы сделать его белым, я должен был сделать:
searchController.searchBar.barStyle = .blackTranslucent
Это единственное, что сработало для меня. У моего приложения есть прозрачная панель навигации, чтобы пропускать фоновый градиент, и я предполагаю, что SearchBar принимает этот внешний вид, поскольку мои настройки внешнего вида для UISearchBar
в основном игнорировались с одним исключением:
UISearchBar.appearance().tintColor = UIColor.red
Это сделало кнопку Отмена и курсор ввода текста красным. Текст заполнитель был светло-серым.
Обратите внимание, что: UISearchBar.appearance().barStyle = .blackTranslucent
не работал - его нужно было установить в экземпляре. Это также не оказывало заметного влияния на панель поиска (она все еще была прозрачной, как панель навигации); он просто сделал текст поиска белым.
С iOS 11 панель поиска, как ожидается, станет частью панели навигации, которая, как вы могли бы ожидать, добавляет все виды новых "функций".
Я думаю, что это ошибка, но я обнаружил, что мне нужно сделать следующее, чтобы изменить цвет текста (и отменить):
self.searchController.searchBar.barStyle = UISearchBarStyleMinimal;
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
setTintColor:[UIColor whiteColor]];
Я обнаружил, что стиль в баре, когда он оставлен на "default", сделает текст черным независимо от цвета оттенка и т.д. Когда установлено значение "Минимальное" или "Выдающееся", текст будет видимым.
Здесь более чистый подход:
UITextField *searchField = nil;
for (UIView *v in self.searchBar.subviews)
{
if ([v isKindOfClass:[UITextField class]])
{
searchField = (UITextField *)v;
break;
}
}
if (searchField)
{
searchField.textColor = [UIColor whiteColor];
}
Изменена категория, предложенная Дэвидом Фостером (@david-foster) для работы на iOS 8.
static UITextField *PBFindTextFieldInView(UIView *view) {
for(UIView *subview in view.subviews) {
if([subview isKindOfClass:UITextField.class]) {
return (UITextField *)subview;
} else {
UITextField* textField = PBFindTextFieldInView(subview);
if(textField) {
return textField;
}
}
}
return nil;
}
@implementation UISearchBar (Appearance)
- (UITextField *)field {
return PBFindTextFieldInView(self);
}
- (UIColor *)textColor {
return self.field.textColor;
}
- (void)setTextColor:(UIColor *)color {
self.field.textColor = color;
}
@end
После установки searchController
в navigationItem
для iOS 11, я обнаружил, что попытка установить textColor
через UIAppearance
для любого UITextField
в пределах UISearchBar
не повлияла, но пользовательский внешний вид свойство, которое просто называется регулярным textColor
, работало нормально.
// Implement a custom appearance property via a UITextField category
@interface UITextField (SearchBarTextColor)
@property (nonatomic, strong) UIColor * textColorWorkaround UI_APPEARANCE_SELECTOR;
@end
@implementation UITextField (SearchBarTextColor)
- (UIColor *)textColorWorkaround {
return self.textColor;
}
- (void)setTextColorWorkaround:(UIColor *)textColor {
self.textColor = textColor;
}
@end
И затем используйте следующее:
UITextField *textFieldProxy = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class]];
textFieldProxy.textColorWorkaround = UIColor.lightGrayColor;
P.S. Тот же трюк помог мне окрасить, казалось бы, недоступные метки UIDatePicker
и UIPickerView