Цвет текста UISearchBar

Просмотрел документацию, и я не смог найти ничего, чтобы изменить цвет UISearchBar. Кто-нибудь знает, как его изменить? Нет свойства textColor:/

спасибо

Ответ 1

Вы можете сделать следующее: просто получите свойство searchField из SearchBar, а затем измените его свойство textColor.

UITextField *searchField = [searchbar valueForKey:@"_searchField"];
searchField.textColor = [UIColor redColor]; //You can put any color here.

Что это! Теперь вы можете манипулировать текстовым полем любым способом.

Ответ 2

iOS 8: см. fooobar.com/questions/462449/...

iOS 6/7:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor redColor]];

Ответ 3

Работает на iOS 7 и более поздних версиях:

    [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
                                 NSForegroundColorAttributeName : [UIColor whiteColor],
                                 NSFontAttributeName : [UIFont systemFontOfSize:15]
                                 }];

Вы также можете удалить неиспользуемый атрибут.

UPDATE. Из-за appearanceWhenContainedIn устарел в iOS 9, см. Ответ Dishant ниже: fooobar.com/questions/462449/...

Ответ 4

Я подозреваю, что вы можете использовать методы, описанные в этом сообщении

Изменив представленный здесь код немного, вы подклассом 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

Ответ 5

Здесь категория, которая добавляет эту функциональность:

@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

Ответ 6

Внешний видWhenContainedIn устарел в iOS 9, поэтому мы должны использовать ниже метод для iOS 9 и выше.

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

Ответ 7

Для iOS11 я нашел, что это сработало:

После установки searchController в navigationItem текст поиска был черным на черном. Чтобы сделать его белым, я должен был сделать:

searchController.searchBar.barStyle = .blackTranslucent

Это единственное, что сработало для меня. У моего приложения есть прозрачная панель навигации, чтобы пропускать фоновый градиент, и я предполагаю, что SearchBar принимает этот внешний вид, поскольку мои настройки внешнего вида для UISearchBar в основном игнорировались с одним исключением:

UISearchBar.appearance().tintColor = UIColor.red

Это сделало кнопку Отмена и курсор ввода текста красным. Текст заполнитель был светло-серым.

Обратите внимание, что: UISearchBar.appearance().barStyle = .blackTranslucent не работал - его нужно было установить в экземпляре. Это также не оказывало заметного влияния на панель поиска (она все еще была прозрачной, как панель навигации); он просто сделал текст поиска белым.

Ответ 8

С iOS 11 панель поиска, как ожидается, станет частью панели навигации, которая, как вы могли бы ожидать, добавляет все виды новых "функций".

Я думаю, что это ошибка, но я обнаружил, что мне нужно сделать следующее, чтобы изменить цвет текста (и отменить):

self.searchController.searchBar.barStyle = UISearchBarStyleMinimal;
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
     setTintColor:[UIColor whiteColor]];

Я обнаружил, что стиль в баре, когда он оставлен на "default", сделает текст черным независимо от цвета оттенка и т.д. Когда установлено значение "Минимальное" или "Выдающееся", текст будет видимым.

Ответ 9

Здесь более чистый подход:

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];
}

Ответ 10

Изменена категория, предложенная Дэвидом Фостером (@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

Ответ 11

После установки 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