Как изменить цвет текста кнопки отмены UISearchbar - PullRequest
7 голосов
/ 09 августа 2011

У меня есть UISearchBar, как показано ниже.Как изменить цвет текста для кнопки отмены?

enter image description here

Ответы [ 6 ]

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

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

У меня есть UISearchBar с кнопкой отмены, которая появляется только при нажатии на текстовое поле UISearchBar.Поэтому решение переопределения - (void) layoutSubviews в подклассе UISearchBar не было вариантом для меня.Во всяком случае я сделал подкласс UISearchBar (CustomSearchBar) с открытым методом для установки шрифта и textColor кнопки отмены.Когда я создаю UISearchBar, я проверяю, что для делегата текстового поля панели поиска установлено значение self, а класс, который создает панель поиска, реализует протокол UITextFieldDelegate.Когда пользователь нажимает на текстовое поле панели поиска, его делегат информируется и вызывает метод CustomSearchBar.Причина, по которой я делаю это здесь, заключается в том, что в этот момент появляется кнопка отмены, и поэтому я знаю, что она находится в иерархии представления, и я могу выполнить ее настройку.

Вот код:

Для создания UISearchBar в MyRootViewController

CustomSearchBar *searchBar = [[CustomSearchBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 40)];
[searchBar setBarStyle:UIBarStyleDefault];
[searchBar setTintColor:[UIColor whiteColor]];

for (UIView *view in [searchBar subviews]) 
{
    if ([view isKindOfClass:[UITextField class]]) 
    {
        UITextField *searchTextField = (UITextField *)view;
        [searchTextField setDelegate:self];
    }
}

self.searchBar = searchBar;   
[searchBar release];

UITextFieldDelegate в MyRootViewController (убедитесь, что он реализует протокол UITextFieldDelegate)

И это публичный метод в подклассе UISearchBar

- (void)setCloseButtonFont:(UIFont *)font textColor:(UIColor *)textColor
{
    UIButton *cancelButton = nil;

    for(UIView *subView in self.subviews)
    {
        if([subView isKindOfClass:[UIButton class]])
        {
            cancelButton = (UIButton*)subView;
        }
    }

    if (cancelButton)
    {
        /* For some strange reason, this code changes the font but not the text color. I assume some other internal customizations      make this not possible:

        UILabel *titleLabel = [cancelButton titleLabel];
        [titleLabel setFont:font];
        [titleLabel setTextColor:[UIColor redColor]];*/

        // Therefore I had to create view with a label on top:        
        UIView *overlay = [[UIView alloc] initWithFrame:CGRectMake(2, 2, kCancelButtonWidth, kCancelButtonLabelHeight)];
        [overlay setBackgroundColor:[UIColor whiteColor]];
        [overlay setUserInteractionEnabled:NO]; // This is important for the cancel button to work
        [cancelButton addSubview:overlay];

        UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 2, kCancelButtonWidth, kCancelButtonLabelHeight)];
        [newLabel setFont:font];
        [newLabel setTextColor:textColor];
        // Text "Cancel" should be localized for other languages
        [newLabel setText:@"Cancel"]; 
        [newLabel setTextAlignment:UITextAlignmentCenter];
        // This is important for the cancel button to work
        [newLabel setUserInteractionEnabled:NO]; 
        [overlay addSubview:newLabel];
        [newLabel release];
        [overlay release]; 
    }
}
7 голосов
/ 22 августа 2012

Вместо того, чтобы делать все эти причудливые вещи, просто реализуйте SearchBarTextDidBeginEditing , как это

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    // only show the status bar’s cancel button while in edit mode sbar (UISearchBar)
    searchBar.showsCancelButton = YES;
    searchBar.autocorrectionType = UITextAutocorrectionTypeNo;
    UIColor *desiredColor = [UIColor colorWithRed:212.0/255.0 green:237.0/255.0 blue:187.0/255.0 alpha:1.0];


    for (UIView *subView in searchBar.subviews){
        if([subView isKindOfClass:[UIButton class]]){
            NSLog(@"this is button type");

            [(UIButton *)subView setTintColor:desiredColor];
            [(UIButton *)subView setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        }
}
4 голосов
/ 23 января 2014

Ответ Гьянердры работает хорошо.Но для iOS7 мне нужно было сделать следующее изменение, чтобы оно работало в моем приложении.

NSArray *childViews;
if ( (APP).isIOS7 ) {
    childViews = [[searchBar.subviews objectAtIndex:0] subviews];
} else {
    childViews =searchBar.subviews;
}

for (UIView *subView in childViews ) {
    if([subView isKindOfClass:[UIButton class]]){
        [(UIButton *)subView setTintColor:desiredColor];
        [(UIButton *)subView setTitleColor:desiredColor forState:UIControlStateNormal];
    }
}

Кажется, что для iOS7 панель поиска заключена в родительское представление.Надеюсь, это кому-нибудь поможет.б

2 голосов
/ 09 августа 2011

Вы можете создать подкласс UISearchBar и написать свой собственный метод - (void)layoutSubviews.В этом методе просматривайте его подпредставления и получайте cancelButton.Остальное должно быть прямо вперед.

0 голосов
/ 22 апреля 2016

КВЦ

UIButton * button = [_searchBar valueForKey: @ "_ cancelButton"]; button.titleLabel.font = [UIFont systemFontOfSize: 13];

0 голосов
/ 26 ноября 2015

Для этого можно воспользоваться свойством среды выполнения iOS _cancelButton.

UIButton *cancelButton = [searchBar valueForKey:@"_cancelButton"];
[cancelButton setTitleColor:[UIColor yourColor] forState:UIControlStateNormal];

Невозможно изменить цвет заголовка кнопки отмены UISearchBar после изменения ее текста.

...