Прямоугольный UISearchBar на iOS 7

Я пытаюсь сделать UISearchBar прямоугольным, а не закругленным, но все решения, которые я нашел до сих пор (в основном итерации через подвиды), кажутся неработающими в iOS 7.

Я сам провел некоторое исследование, и, как оказалось, у него есть только подвид UIView, у которого есть дополнительные подпредставления, UISearchBarBackground и UISearchBarTextField (оба являются частными классами). Я старался

if ([view isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
    [view removeFromSuperview];
}

а также

if ([view conformsToProtocol:@protocol(UITextInputTraits)]) {
    @try {

        [(UITextField *)view setBorderStyle:UITextBorderStyleRoundedRect];
    }
    @catch (NSException * e) {
        // ignore exception
    }
}

где view - это подвид этого одного подвида UIView, но ни один из них, похоже, не работает.


person Rickye    schedule 11.02.2014    source источник
comment
Как оказалось, частично проблема заключалась в том, что я установил стиль поиска UISearchBar (в IB) на минимальный. Если вы установите его на Выдающийся, первый фрагмент кода будет работать. (На самом деле, он все еще округлен, так что это не идеальное решение. Если у кого-то есть идея получше, поделитесь ею.)   -  person Rickye    schedule 11.02.2014
comment
Возможно, вы захотите опубликовать это как ответ.   -  person Marco    schedule 11.02.2014
comment
@Marco Посмотрите мое редактирование этого комментария, это не лучшее решение, но если какое-то время никто не придумает лучшего, я опубликую его.   -  person Rickye    schedule 11.02.2014
comment
Пробовали ли вы методы внешнего вида UISearchBar, такие как setSearchFieldBackgroundImage:forState:   -  person vokilam    schedule 11.02.2014
comment
@ Рики, я неправильно понял, думал, ты решил свою проблему.   -  person Marco    schedule 11.02.2014


Ответы (2)


Попробуйте это... (я знаю, что он также использует subview, но работает в ios7)

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 20, 320, 49)];
[self.view addSubview:searchBar];
[self checkSubViewsOfView:searchBar WithTabIndex:@""];

и добавьте этот метод

-(void)checkSubViewsOfView:(UIView *)view WithTabIndex:(NSString *)strTab
{
    if ([view isKindOfClass:NSClassFromString(@"UISearchBarTextField")])
    {
        view.layer.borderWidth = 1;
        view.layer.borderColor = [[UIColor whiteColor] CGColor];
        return;
    }

    for (UIView *vvv in view.subviews)
    {
        NSLog(@"%@%@",strTab,[vvv description]);

        if (vvv.subviews > 0)
        {
            NSString *str = [NSString stringWithFormat:@"____%@",strTab];
            [self checkSubViewsOfView:vvv WithTabIndex:str];
        }
    }
}
person Rajesh Choudhary    schedule 11.02.2014
comment
Хороший, спасибо! Близко к тому, что у меня получилось. Проблема в том, что это убивает изменение размера UISearchBar, и поэтому кнопка «Отмена» никогда не появляется рядом с ним. - person Rickye; 11.02.2014
comment
@Rickye, если вы используете этот подход. это плохо. потому что это не из общедоступного документа. так что используйте подход, который сказал Торстен, лучше всего - person codercat; 11.02.2014

вы можете установить фоновое поле поиска следующим образом:

[self.searchBar setSearchFieldBackgroundImage:[[UIImage imageNamed:@"searchbar_stretch-0-10-0-10"]resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)] forState:UIControlStateNormal];

и фон панели поиска:

[self.searchBar setBackgroundImage:[UIImage imageNamed:@"categories_navbar"]];
person Thorsten    schedule 11.02.2014