Настройте кнопку отмены UISearchBar в сборке IOS 7 из Xcode 5.x

Я использую приведенный ниже код. Он отлично работает в IOS 6.x. сборка из Xcode 4.6.x. Но этот код больше не работает в сборке IOS 7.x из xcode 5.x.

Моя цель - отобразить пользовательское изображение вместо кнопки отмены UISearchBar, когда пользователь начнет редактирование в UISearchBar.

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    [searchBar setShowsCancelButton:YES animated:YES];
    UIButton *cancelButton = nil;
    for(UIView *subView in searchBar.subviews){
        if([subView isKindOfClass:UIButton.class]){
            cancelButton = (UIButton*)subView;
        }
    }
    [cancelButton setTintColor:[UIColor colorWithRed:167.0/255.0 green:0.0/255.0 blue:0.0/255.0 alpha:1.0f]];
    [cancelButton setBackgroundImage:[UIImage imageNamed:@"customKeyboardIcon.png"] forState:UIControlStateNormal];
    [cancelButton setTitle:nil forState:UIControlStateNormal];
}

person NSCry    schedule 21.10.2013    source источник
comment
Проверьте этот пост. это может помочь вам stackoverflow.com/questions/19206757/   -  person Khaled Annajar    schedule 28.01.2014


Ответы (2)


Кнопка отмены в UISearchBar имеет тип UIBarButton. Я сделал это следующим образом (работает на iOS 5,6,7):

 [[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setBackgroundImage:cancelButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

Если вы не хотите, чтобы индивидуальная кнопка отмены была у всех вас UISearchBar, просто создайте пользовательский UISearchBar класс и замените appearanceWhenContainedIn:[UISearchBar class] своим новым настраиваемым классом.

Для удаления текста:

[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitle:@""];

Что касается изображения, либо вы настраиваете свой ресурс изображения, либо создаете UIImage с некоторыми вставками (повозитесь со вставкой, пока не получите ожидаемый результат):

     UIImage *cancelButtonImage = [UIImage imageNamed:SEARCH_BAR_CANCEL_BUTTON];
cancelButtonImage = [cancelButtonImage resizableImageWithCapInsets:CANCEL_BUTTON_IMAGE_INSETS];
person Durican Radu    schedule 21.10.2013
comment
Он устанавливает фоновое изображение, но оно выглядит растянутым, и появляется текст отмены текста, как удалить этот текст? - person NSCry; 21.10.2013
comment
Нет селектора UIBarButtonItem как setTitle. - person NSCry; 21.10.2013
comment
setTitle — селектор внешнего вида UIBarButton. - person Durican Radu; 22.10.2013

Проверьте этот код, который я использую:

-(void) colorCancelButton
{
    UIButton *cancelButton = [self getCancelButton];
        [cancelButton setTintColor:[Util colorFromHex:@"#D6D1CF"]];
        [cancelButton setTitleColor:[Util colorFromHex:@"333333"] forState:UIControlStateNormal];
}

-(UIButton*) getCancelButton
{
    UIButton *cancelButton = nil;
    for(UIView *subView in self.subviews){
        if([subView isKindOfClass:UIButton.class])
        {
            cancelButton = (UIButton*)subView;
        }
    }
    return cancelButton;
}
person Khaled Annajar    schedule 28.01.2014