2011-08-09 20 views

cevap

11

Bu soru bir süre önce sorulmuştur, bu yüzden sormuş olan kişinin zaten bir çözüm bulduğunu varsayalım. Ama sadece bazılarının aynı soruna çarpması durumunda. İşte benim çözümüm.

Yalnızca UISearchBar'ın metin alanına dokunulduğunda görünen bir iptal düğmesiyle bir UISearchBar'ım var. Bu nedenle, UISearchBar'ın bir alt sınıfında geçersiz (- geçersiz) layoutSubviews çözümü benim için bir seçenek değildi. Neyse, iptal düğmesinin yazı tipini ve textColorunu ayarlamak için genel bir yöntemle UISearchBar (CustomSearchBar) alt sınıfını yaptım. UISearchBar'ı oluşturduğumda, arama çubuğunun metin alanı temsilcisinin kendiliğinden ayarlandığından ve arama çubuğunu oluşturan sınıfın UITextFieldDelegate protokolünü uyguladığından emin olurum. Kullanıcı arama çubuğunun metin alanına dokunduğunda, delege bilgilendirilir ve CustomSearchBar yöntemini çağırır. Bunu burada yapmamın nedeni, iptal düğmesinin göründüğü an olduğu ve bu nedenle görüntü hiyerarşisinde olduğunu ve onun özelleştirmesini yapabileceğinin bilinmesi.

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    [self.searchBar setCloseButtonFont:[UIFont fontWithName:@"American Typewriter" size:14] textColor:[UIColor grayColor]]; 
} 

(o UITextFieldDelegate protokolünü uygulayan olduğundan emin olun)

MyRootViewController içinde MyRootViewController içinde

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 UISearchBar oluşturmak için Ve bu herkese açıktır: Burada

kod UISearchBar'ın alt sınıfı

yönteminde Bunun yerine tüm bu fantezi şeyler yapmanın
- (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]; 
    } 
} 
+0

Bu harika. Bunun için çok teşekkürler. Ben çok memnun olmayan alternatif bir yöntem kullandım. Ama bununla birlikte şimdi sorunu tekrar ziyaret edebilirim. Teşekkürler! – Zhen

+0

Size yardımcı olduğuna sevindim. – strave

2

Sen UISearchBar alt sınıfı ve kendi - (void)layoutSubviews yöntemi yazabilir. Bu yöntemde, alt görünümleri ile döngü ve cancelButton olsun. Gerisi düz ileri olmalı.

+0

teşekkürler. Ancak, layoutSubView yöntemini nasıl yeniden yazabileceğimi bilmiyorum.Bu konuda bana yardımcı olabilir misiniz? – Zhen

+0

Geçersiz kılma - (geçersiz) layoutSubviews yalnızca UISearchBar özelliğininCancelButton öğesi EVET olarak ayarlanmışsa çalışır. Varsayılan olarak bu, NO olarak ayarlanır ve bu nedenle, iptal düğmesi yalnızca UISearchBar'ın metin alanı vurulduğunda görünür. Bu durumda, layoutSubviews'ın geçersiz kılınmasının bir etkisi olmaz. – strave

7

sadece Gyanerdra cevabı iyi çalışıyor bu

- (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]; 
     } 
} 
+0

Bu bir çekicilik gibi çalıştı! – Giovanni

4

gibi SearchBarTextDidBeginEditing uygulamak. Ancak iOS7 için uygulamasında çalışması için aşağıdaki değişikliği yapmam gerekiyor.

Görünüşe göre iOS7 için arama çubuğu bir üst görünümde bulunmaktadır. Umut, bu birisine yardımcı olur. b

0

Bunu gerçekleştirmek için iOS Çalışma Zamanı Özelliği _cancelButton'dan yararlanabilirsiniz.

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

Unable to change UISearchBar cancel button title color after changing it's text.

+1

AlmaButton = nil, arama için etkinleştirilmemiş olana kadar searchBar.showsCancelButton = YES – kb920

0

KVC

UIButton * düğmesi = [_searchBar valueForKey: @ "_ CancelButton"]; button.titleLabel.font = [UIFont systemFontOfSize: 13]; Cevabı için

+1

Bu, yazı tipi boyutunu değil, rengi etkiler. – ouflak

+0

Yani, yazı tipini değiştirebilirsin, ayrıca titleColor'u da değiştirebilirsin. [button setTitleColor: [UIColor orangeColor] forState: UIControlStateNormal]; – fengbai

İlgili konular