UISearchBar цвет текста - PullRequest
       28

UISearchBar цвет текста

11 голосов
/ 11 сентября 2009

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

Thx

Ответы [ 11 ]

10 голосов
/ 28 января 2015

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

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

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

UPDATE . Из-за appearanceWhenContainedIn устарела в iOS 9, см. Ответ Dishant ниже: https://stackoverflow.com/a/38893352/2799722

10 голосов
/ 15 марта 2014

iOS 8: см. https://stackoverflow.com/a/28183058/308315

iOS 6/7:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor redColor]];
10 голосов
/ 24 августа 2010

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

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

Вот и все! Теперь вы можете манипулировать textField любым возможным способом.

3 голосов
/ 29 сентября 2017

Для iOS11 я обнаружил, что это работает:

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

searchController.searchBar.barStyle = .blackTranslucent

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

UISearchBar.appearance().tintColor = UIColor.red

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

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

3 голосов
/ 25 февраля 2011

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

@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
3 голосов
/ 07 ноября 2009

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

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

2 голосов
/ 11 августа 2016

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

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
 setTintColor:[UIColor whiteColor]];
1 голос
/ 24 сентября 2017

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

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

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

Я обнаружил, что стиль полосы, если оставить значение по умолчанию, сделает текст черным независимо от цвета оттенка и т. Д. При установке на минимальный или выдающийся текст был видимым.

0 голосов
/ 03 ноября 2017

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

0 голосов
/ 16 марта 2015

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