2013-10-03 6 views
1

У меня есть следующий код, который изменяет фон кнопки «Отмена» в UISearchBar.Изменить Отменить кнопку BackgroundColor и текст UISearchBar в iOS7

for(UIView *subview in self.searchBar.subviews){ 
    if ([subview isKindOfClass:[UIButton class]]) { 
     [(UIButton *)subview setEnabled:YES]; 
     [(UIButton *)subview setTitle:@"New Button Text" forState:UIControlStateNormal]; 
     ((UIButton *)subview).tintColor = [UIColor colorWithRed:4/255.0 green:119/255.0 blue:152/255.0 alpha:1.0]; 
    } 
} 

Проблема в том, что этот код не работает в iOS7! Что изменилось в структуре представлений в UISearchBar?

Edit: Испытано здесь, и это новая Иерархия UISearchBar:

UISearchBar: 
---UIView: 
------UISearchBarBackground 
------UISearchBarTextField 
------UINavigationButton 

Проблема заключается в том, что я не могу проверить if ([sub isKindOfClass:[UINavigationButton class]]). Эта строка вызывает ошибку компиляции: Use of undeclared identifier: UINavigationButton

ответ

1

Решение: Я создал свою собственную кнопку. Таким образом, я могу управлять всеми свойствами без необходимости выяснять, что Apple сделала с элементами.

Мне нужно создать только UIView aux, чтобы содержать SearchBar и новую кнопку.

self.searchBar.showsCancelButton = NO; //don`t show the original cancelButton 

self.cancelSearchButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
self.cancelSearchButton.frame = CGRectMake(250, 6, 60, 31); 
[self.cancelSearchButton setTitle:@"Cancelar" forState:UIControlStateNormal]; 
[self.cancelSearchButton addTarget:self action:@selector(searchBarCancelButtonClicked) forControlEvents:UIControlEventTouchUpInside]; 
NSString *fontName = [[self.cancelSearchButton titleLabel] font].fontName; 
[[self.cancelSearchButton titleLabel] setFont:[UIFont fontWithName:fontName size:11.0]]; 
UIView *aux = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
aux.backgroundColor = [UIColor colorWithRed:230/255.0 green:230/255.0 blue:230/255.0 alpha:1.0]; 
aux.layer.borderWidth = 1.0f; 
aux.layer.borderColor = [UIColor lightGrayColor].CGColor; 
aux.layer.cornerRadius = 0.0f; 
[aux addSubview:self.searchBar]; 
[aux addSubview:self.cancelSearchButton]; 

- (void)searchBarCancelButtonClicked{ 
    //do whatever I want to do here 
} 
+0

Проблема с этим методом заключается в том, что по умолчанию вы не получите симпатичную по умолчанию анимацию по умолчанию ... или, если хотите, мне хотелось бы знать, как это сделать. – x89a10

6

[Edited]

Попробуйте эти коды.

Добавить в AppDelegate, если вы хотите изменить все кнопки отмены.

[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: 
                             [UIColor redColor], 
                             UITextAttributeTextColor, 
                             [UIColor whiteColor], 
                             UITextAttributeTextShadowColor, 
                             [NSValue valueWithUIOffset:UIOffsetMake(0, 0)], 
                             UITextAttributeTextShadowOffset, 
                             nil] 
                          forState:UIControlStateNormal]; 

В iOS7, нам нужно добавить objectAtIndex:0 and subviews.

Иерархия просмотров суб SearchBar была изменена в iOS7, попробуйте ниже:

in iOS7: 

NSArray *searchBarSubViews = [[self.searchBar.subviews objectAtIndex:0] subviews]; 


iOS6 and before: 

NSArray *searchBarSubViews = self.searchBar.subviews; 
+1

Извините, но это не работало. –

+0

Я отредактировал свой ответ, пожалуйста, перепроверьте его. Он отлично работает в моем проекте. –

+0

Это тоже не сработало для меня. @Yahiko, это все еще работает с iOS 7.0.3? При повторном просмотре я вижу только 2 элемента; нет UIBarButtonItems или UIButtons. Смущенный. – Daniel

0

Вы можете воспользоваться IOS времени выполнения собственности _cancelButton для достижения этой цели.

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

Для изменения текста

[self.searchBar setValue:@"customString" forKey:@"_cancelButtonText"]; 
Смежные вопросы