Этот вопрос был задан некоторое время назад, поэтому я предполагаю, что человек, который спросил, уже нашел решение.Но на тот случай, если некоторые другие столкнутся с той же проблемой.Вот мое решение.
У меня есть 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];
}
}