2012-10-19 13 views
10

UISearchbar için metin alanını özelleştirmeye çalışıyorum. Aşağıdaki resim yarım işimi gösteriyor. strong textUISearchbar'ın UITextfield'ı Özelleştir - iOS

UISearchbar'ın alt sınıfları var ve onu görünüm denetleyicimden aradım. Bu koyu gri çizgileri metin alanından kaldırmaya çalışıyorum. Aşağıda, UISearchbar'ın viewcontroller alt görünümüne eklenmesi uygulanmasıdır.

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 alt sınıf: textfield herhangi sınırları olmamalıdır:

- (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]; 

} 

Böyle bir şey başarmak için çalışıyorum. Simgeler UIImageView düzleştirilmiş.

enter image description here

cevap

49

Bu UISearchBar Subview hiyerarşisinden textfield'ı almak için kolay bir yoldur ve görünüm Proxy'nizin IOS-5 başlayarak

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

simgeler i gibi UIImageView parçası olan (yukarıda ödünç ve hızlı bir şekilde adapte) yapmak gerekir dedim. Onun için endişelendiğim metin alanı. Bu koyu gri çizgiler kaldırılacak. Cevap tho için teşekkürler. Simgeler zaten arama çubuğundan kaldırılmıştır. – DesperateLearner

+0

Çok teşekkürler Animesh ... sorunumu çözüyor. – Hari1251

+1

Teşekkür ederim, bir gün senin için bira ödeyeceğim. –

6

gibi gerektiği gibi özelliklerini ayarlayabilirsiniz, bkz: http://developer.apple.com/library/ios/#documentation/uikit/reference/UISearchBar_Class/Reference/Reference.html ("Görünümü Özelleştir" adlı iki bölüm vardır, her ikisini de işaretleyin). İşte

o app tüm UISearchBars değiştirir, bir çalışma örnek:

[[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

Kullanım Aşağıdaki Bir görüntüyü belgesiz özellikleri kullanmak veya kullanmak istemiyorsanız:

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

Teşekkür ederim! Diğer cevaplar benim için işe yaramadı. – user2734823

+0

müthiş bir cevap verdi. Sorunumu çözdüm – Logic

4

Uygulama Değişikliğine Karşı Dayanıklılık & Yüksek Performans

Bunu okuyan herkese ve nasıl Bir arama çubuğunun metin alanı Swift'de kolayca erişilebilir; Eğer altta yatan uygulama değişikliklerine dayanıklı ve yüksek performanslı olacak şekilde bulunmuş sonucu önbelleğe aşağıdaki kod parçasını kullanarak bir textField özelliğini eklemek için UISearchBar uzatabilir. Eğer özelliğin adını değiştirmek istiyorsanız

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) 
    } 
    } 

} 

, sen searchField olarak değiştirin olmadığından emin olun. Bu arama çubuğunu bozar. Ben iOS 10 için bulduk

+0

Sadece "self.valueForKey (" _ searchField ") değerini nasıl döndürdüğünüze ne dersiniz? UITextField'? – ton

+2

@ton Bu çalışır. Apple'ın anahtarı bir süre sonra değiştireceğinden şüphe duyuyorum; ancak, hacky çözümleri kullanırken, kişisel olarak, uygulama değişikliklerinin altında yatan esneklik için bir yol bulmayı tercih ediyorum. – isair

+0

@ abishek-bedi Yaptığınız değişiklikleri geri aldım. Kodum eskiydi, ancak uygulamanın çekirdeğini düzenlediniz ve tamamen başka bir şeye dönüştürdünüz. Uygulamamın kalbi, temel uygulama değişikliklerine dirençli olmak için _searchField'a güvenmemekte. – isair

2

Bu

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

Kısa ve Basit

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