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

Изменение поля поля поиска UISearchBar

У меня есть UISearchBar, содержащийся в UIView, а UIView назначен UITableView tableHeaderView.. Я пытаюсь создать стиль UISearchBar, чтобы выглядеть так:

What I want

Вне ворот это выглядит так:

How it looks now

Есть множество SO вопросов и ответов о том, как стиль UISearchBar, его поле поиска и т.д., некоторые с особым вниманием к фону. Многие из них связаны с перемещением UISearchBar subviews, нахождением объекта UISearchBarBackground (или _UISearchBarSearchFieldBackgroundView) и установкой его цвета фона непосредственно. Я пытаюсь найти поддерживаемый API для этого, однако...

Метод setSearchFieldBackgroundImage:forState:, кажется, имеет большой потенциал, но это то, что я получаю, когда я использую 1px белое (или прозрачное) изображение, используя UIControlStateNormal:

Using a transparent image for setSearchFieldBackgroundImage:forState:

Любые идеи о том, как заставить это работать? Я был бы признателен, если бы кто-то указал мне на сообщение SO, которое отвечает на это, но я действительно думаю, что прочитал их все. Спасибо тонну.

4b9b3361

Ответ 1

вы можете использовать внешний видWhenContainedIn для таргетинга элементов без прохождения иерархии представлений. Что-то вроде:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setBackgroundColor:[UIColor whiteColor]];
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor lightGrayColor]];

UPDATE:

Поскольку appearanceWhenContainedIn теперь устарел, используйте

[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar self]]] <your setter here>];

Ответ 2

Я думаю, проблема здесь в том, что при использовании setSearchFieldBackgroundImage:forState: высота вашего изображения фактически определяет высоту поля поиска. Стандартное поле поиска (по крайней мере, на iOS 8) составляет 28 точек, поэтому изображение, высота которого должна дать эффект, вы после.

(Несколько смешно, это также означает, что растягиваемое изображение с девятью частями, как правило, не будет выглядеть правильно, поэтому, если вы собираетесь выглядеть не просто белым на белом, вам нужно использовать трехсекционный растяжимый изображение, которое только растягивается горизонтально.)

Ответ 3

Пожалуйста, попробуйте следующий код

[[UISearchBar appearance]setBackgroundImage:[UIImage imageNamed:@"searchbar_bg.png"]];
for (UIView *searchbuttons in searchBar.subviews) {

    if ([searchbuttons isKindOfClass:[UIButton class]]) {

        UIButton *cancelbutton = (UIButton *)searchbuttons;
        [cancelbutton setBackgroundImage:[UIImage imageNamed:@"canelBtn.png"] forState:UIControlStateNormal];
    }
}


 UITextField *searchField = [searchBar valueForKey:@"_searchField"];
 searchField.background = [UIImage imageNamed:@"bg.png"];

Ответ 4

Над iOS 5.0

[[UISearchBar appearance] setSearchFieldBackgroundImage:[UIImage imageNamed:@"YourBackground.png"]forState:UIControlStateNormal];

Ответ 5

Вы можете использовать свойство barTintColor или backgroundImage для UISearchBar, чтобы выполнить то, что вы пытаетесь сделать.

Я воспроизвел вашу проблему, и, похоже, она решена:

self.searchDisplayController.searchBar.barTintColor = [UIColor whiteColor];

или

self.searchDisplayController.searchBar.backgroundImage = [self imageWithColor:[UIColor whiteColor]];

P.S. Если вы используете решение backgroundImage, вам нужно сделать метод imageWithColor следующим образом

- (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return image;
}

Скажите, если это сработает!

Ответ 6

iO9 Идеальные работы.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[self searchSubviewsForTextFieldIn:self.searchBar] setBackgroundColor:  [UIColor redColor]];
}

- (UITextField*)searchSubviewsForTextFieldIn:(UIView*)view
{
    if ([view isKindOfClass:[UITextField class]]) {
        return (UITextField*)view;
    }
    UITextField *searchedTextField;
    for (UIView *subview in view.subviews) {
        searchedTextField = [self searchSubviewsForTextFieldIn:subview];
        if (searchedTextField) {
            break;
        }
    }
    return searchedTextField;
}

Ответ 7

@joneswah ответ лишен в iOS 9.

Для iOS 9 поместите это в свой AppDelegate.m. Я также добавил обходной путь для задержки открытия клавиатуры, когда клавиатура запускается в первый раз.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

// Remove lag on oppening the keyboard for the first time when clicked on any UITextField
UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];

//searchBar background color change
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setBackgroundColor:[UIColor greenColor]];//background color
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blackColor];//text color

return YES;
}

Ответ 8

Как было предложено другим, вам нужно пройти через ваши подпрограммы поиска и найти экземпляр UITextField. НО, вам нужно установить layer.backgroundColor, поскольку установка свойства backgroundColor не имеет никакого эффекта. Я приведу пример:

for view in searchBar.subviews {
    for subview in view.subviews {
        if let searchField = subview as? UITextField {
            searchField.layer.backgroundColor = UIColor.whiteColor().CGColor
        }
    }
}

Это даст вам то, что вам нужно.

Ответ 9

Мой ответ стабильно работает на ios 5 и выше, включая это 10. Без хаков и KVO от Apple Way

Ответ 10

Следующий код достигнет результата.

_sbAddress.barTintColor = [UIColor whiteColor];

    for (UIView *subView in _sbAddress.subviews) {
        for(id field in subView.subviews){
            if ([field isKindOfClass:[UITextField class]]) {
                UITextField *textField = (UITextField *)field;
                [textField setPlaceholder:@"Search"];
            }
        }
    }

ИЛИ

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setPlaceholder:@"Search"];