Подтвердить что ты не робот

Изменение цвета текста UISearchBar в iOS 7

Как изменить цвет текста UISearchBar в iOS 7?

В iOS 6 я подклассифицировал UISearchBar и layoutSubviews, настроив свойства UITextField subview UISearchBar.

Но в iOS 7, UISearchBar не имеет UITextField в качестве подзапроса. Как это исправить?

4b9b3361

Ответ 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()