2012-10-19 18 views
10

Próbuję dostosować pole tekstowe do paska UISearchbar. Poniższy rysunek pokazuje moją połowiczną pracę. strong textDostosuj UITextfield z UISearchbar - iOS

Mam podklas UISearchbar i wywołałem go z mojego kontrolera widoku. Próbuję usunąć ciemnoszare linie z pola tekstowego. Poniżej znajduje się implementacja paska UISearchbar dodającego do podglądu kontrolera viewcontroller.

searchbar = [[SearchBar alloc] initWithFrame:CGRectMake(35,78, 250, 17)]; 
searchbar.backgroundColor = [UIColor clearColor]; 
searchbar.layer.borderColor = [[UIColor clearColor] CGColor]; 
searchbar.layer.borderWidth = 0; 

for(UIView *view in searchbar.subviews){ 
    if([view isKindOfClass:[UITextField class]]){ 
     UITextField *tf= (UITextField *)view; 
     tf.layer.borderColor = [[UIColor clearColor] CGColor]; 
     tf.delegate = self; 
     break; 
    } 
} 
[self.view addSubview:searchbar]; 
searchbar.delegate = self; 

UISearchBar podklasy:

- (id)initWithFrame:(CGRect)frame 
    { 
    self = [super initWithFrame:frame]; 
if (self) { 
     // Initialization code 
    } 
    return self; 
} 

-(void)layoutSubviews{ 
    UITextField *searchField; 
    [[[self subviews] objectAtIndex:0] removeFromSuperview]; 
    [self setTintColor:[UIColor clearColor]]; 
    self.clipsToBounds = YES; 
    NSUInteger numViews = [self.subviews count]; 
    for(int i = 0; i < numViews; i++) { 
     if([[self.subviews objectAtIndex:i] isKindOfClass:[UITextField class]]) { 
      searchField = [self.subviews objectAtIndex:i]; 
      searchField.leftViewMode = UITextFieldViewModeNever; 
      searchField.backgroundColor = [UIColor clearColor]; 

     } 


    } 
    if(!(searchField == nil)) {    
     searchField.backgroundColor = [UIColor clearColor]; 
     searchField.textColor = [UIColor blackColor]; 
     searchField.frame = CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height-10); 

     [searchField setBorderStyle:UITextBorderStyleRoundedRect]; 

    } 

    [super layoutSubviews]; 

} 

Próbuję achive coś takiego: pole tekstowe nie powinny mieć żadnych granic. Ikony są spłaszczone UIImageView.

enter image description here

Odpowiedz

49

Jest to prosty sposób, aby uzyskać pole tekstowe z hierarchią UISearchBar podrzędny i ustawić jego właściwości, ile potrzeba jak

UITextField *txfSearchField = [searchbar valueForKey:@"_searchField"]; 
[txfSearchField setBackgroundColor:[UIColor whiteColor]]; 
    [txfSearchField setLeftView:UITextFieldViewModeNever]; 
    [txfSearchField setBorderStyle:UITextBorderStyleRoundedRect]; 
    txfSearchField.layer.borderWidth = 8.0f; 
    txfSearchField.layer.cornerRadius = 10.0f; 
     txfSearchField.layer.borderColor = [UIColor clearColor].CGColor; 
+0

ikony są częścią UIImageView jak ja powiedziany. To obszar tekstowy, o który się martwię. Te ciemnoszare linie mają zostać usunięte. Dzięki za odpowiedź. Ikony są już usunięte z paska wyszukiwania. – DesperateLearner

+0

dziękuję bardzo Animesh ... rozwiązuje mój problem. – Hari1251

+1

Dziękuję, zapłacę za ciebie piwo pewnego dnia. –

6

Zaczynając od IOS-5 masz proxy wygląd, patrz: http://developer.apple.com/library/ios/#documentation/uikit/reference/UISearchBar_Class/Reference/Reference.html (istnieją dwie sekcje o nazwie "Dostosowywanie wyglądu", sprawdź oba).

Oto przykład pracy, modyfikuje wszystkie UISearchBars w aplikacji:

[[UISearchBar appearance] setSearchFieldBackgroundImage:[UIImage imageNamed:@"text_box"] forState:UIControlStateNormal]; 
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"search_icon"] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal]; 
mysearchBar.tintColor = [UIColor whiteColor]; 
12

Użyj następującego jeśli nie chcesz korzystać z nieudokumentowanych funkcji lub użyć obrazu:

CGSize size = CGSizeMake(30, 30); 
// create context with transparent background 
UIGraphicsBeginImageContextWithOptions(size, NO, 1); 

// Add a clip before drawing anything, in the shape of an rounded rect 
[[UIBezierPath bezierPathWithRoundedRect:CGRectMake(0,0,30,30) 
          cornerRadius:2.0] addClip]; 
[[UIColor whiteColor] setFill]; 

UIRectFill(CGRectMake(0, 0, size.width, size.height)); 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

[self.searchBar setSearchFieldBackgroundImage:image forState:UIControlStateNormal]; 
+0

Dziękuję! Pozostałe odpowiedzi nie sprawdziły się u mnie tak dobrze. – user2734823

+0

Niesamowita odpowiedź. Rozwiązał mój problem. – Logic

4

Wdrożenie Zmień Odporność & Wysoka wydajność

Dla każdego, kto to czyta i zastanawia się, w jaki sposób pole tekstowe paska wyszukiwania jest łatwo dostępne w Swift; można rozszerzyć UISearchBar, aby dodać właściwość textField o wartości za pomocą poniższego fragmentu kodu, który jest odporny na zmiany implementacji i przechowuje znaleziony wynik, co zapewnia wysoką wydajność.

import UIKit 

private var foundTextFieldAssociationKey = UInt8() 

extension UISearchBar { 

    var textField: UITextField { 
    get { 
     let value = objc_getAssociatedObject(self, &foundTextFieldAssociationKey) as? UITextField 

     if value == nil { 
     let findInView = (UIView) -> UITextField? = { view in 
      for subview in view.subviews { 
      if let textField = (subview as? UITextField) ?? findInView(subview) { 
       return textField 
      } 
      } 
      return nil 
     } 

     guard let foundTextField = findInView(self) else { 
      fatalError("UISearchBar doesn't seem to have a UITextField anywhere in the view hierarchy") 
     } 

     textField = foundTextField 
     return foundTextField 
     } 

     return value! 
    } 
    set { 
     objc_setAssociatedObject(self, &foundTextFieldAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_ASSIGN) 
    } 
    } 

} 

Jeśli chcesz zmienić nazwę właściwości, upewnij się, że nie zmieniają go searchField. To zepsuje twój pasek wyszukiwania.

+0

Co powiesz na to, że właśnie 'return self.valueForKey (" _ searchField ") ma wartość? UITextField'? – ton

+2

@ton To działa. Wątpię, że Apple wkrótce zmieni klucz, ale kiedy używam zręcznych rozwiązań, osobiście wolę znaleźć sposób, który jest odporny na zmiany w implementacji. – isair

+0

@ abishek-bedi Zmieniłem twoje zmiany. Mój kod był stary, ale redagowałeś rdzeń implementacji i zmieniłeś go na zupełnie inny. Sercem mojego wdrożenia jest nie poleganie na _searchField, aby być odpornym na podstawowe zmiany w implementacji. – isair

2

znalazłem dla iOS 10 I trzeba to zrobić (zapożyczone z góry i szybko dostosować)

extension UISearchBar { 
    var textField: UITextField? { 

    func findInView(_ view: UIView) -> UITextField? { 
     for subview in view.subviews { 
      print("checking \(subview)") 
      if let textField = subview as? UITextField { 
       return textField 
      } 
      else if let v = findInView(subview) { 
       return v 
      } 
     } 
     return nil 
     } 

     return findInView(self) 
    } 
} 
1

krótki i prosty

extension UISearchBar { 
    var textField:UITextField { 
     guard let txtField = self.value(forKey: "_searchField") as? UITextField else { 
      assertionFailure() 
      return UITextField() 
     } 
     return txtField 
    } 
}