2013-02-22 6 views
4

У меня есть следующий код, чтобы изменить внешний вид UISearchBar в моем приложении, и это можно увидеть на изображении ниже также:Изменение кадра кнопка отмены в UISearchBar

for(int i = 0; i < [[searchBar subviews] count]; i++){ 
    UIView *subView = [[searchBar subviews] objectAtIndex:i]; 
    if([[NSString stringWithFormat:@"%@", [subView class]] isEqualToString:@"UINavigationButton"]){ 
     UIButton *cancelButton = (UIButton *)subView; 

     CGRect buttonFrame = cancelButton.frame; 
     buttonFrame.size.height = 52; 
     [cancelButton setFrame:buttonFrame]; 

     [cancelButton setTitle:@"Cancel" forState:UIControlStateNormal]; 
     [cancelButton setBackgroundImage:[UIImage imageNamed:@"cancel.png"] forState:UIControlStateNormal]; 
     [cancelButton setBackgroundImage:[UIImage imageNamed:@"cancel_pressed.png"] forState:UIControlStateHighlighted]; 
    } 
} 

Как вы можете видеть, что я пытаюсь изменить высоту кнопки, содержащейся в UISearchBar, без везения. Я получаю ссылку на кнопку, так как я могу изменить текст, а фоновое изображение изменяется не на высоту кадра. Я бы просто хотел, чтобы высота кнопки была такой же, как и окно поиска на 52 пикселя.

enter image description here

EDIT:

Я нашел действительно Hacky решение, но это не очень элегантное добавление UIButton как подвид на кнопку отмены. Он выполняет эту работу, но, как я уже сказал, это не очень приятно.

+0

- тип кнопки обычай? – Eric

+0

Нет, это стандартный UIButton в подзаголовках UISearchBar. Просто с фоном, установленным для каждого ControlState. – SamRowley

+0

Может быть, подкласс uisearchbar и переопределить -addSubView метод и установить кадр там? – blub

ответ

0

Так что я переопределять -layoutSubViews с этим, но Theres 2 номера у меня есть

Я ненавижу переборе взглядов, чтобы найти точку зрения соответствия, и это портит анимация немного

- (UIButton *)cancelButton { 
    for (UIView *v in self.subviews) { 
     if ([v isKindOfClass:[UIButton class]]) { 
      NSString *caption = [[((UIButton *)v) titleLabel] text]; 
      if ([caption isEqualToString:@"Cancel"]) 
       return (UIButton *)v; 
     } 
    } 
    return nil; 
} 

- (BOOL)cancelButtonIsShowing { 
    return ([self cancelButton] != nil); 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    if ([self cancelButtonIsShowing]) { 
     UIButton *cancelButton = [self cancelButton]; 

     UIImage *i = [UIImage imageNamed:@"Cancel_BTN"]; 
     CGRect f = CGRectMake(267, 5, i.size.width, i.size.height); 
     cancelButton.frame = f; 
    } 
} 
+0

Существует гораздо более сложный способ обойти сбой в анимации. Если вам это нужно, дайте мне знать –

3

На самом деле вы можете использовать метод, приведенный ниже, для доступа к кнопке отмены:

UIBarButtonItem *cancelButton = [UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil]; 
Смежные вопросы