2012-10-19 13 views
10

मैं UISearchbar के लिए टेक्स्टफील्ड को कस्टमाइज़ करने का प्रयास कर रहा हूं। नीचे दी गई तस्वीर मेरे आधा काम दिखाती है। strong textUISearchbar के UITextfield को अनुकूलित करें - आईओएस

मेरे पास UISearchbar उप-वर्ग है और इसे मेरे दृश्य नियंत्रक से बुलाया गया है। मैं टेक्स्टफील्ड से उन अंधेरे ग्रे लाइनों को हटाने की कोशिश कर रहा हूं। नीचे UISearchbar का कार्यान्वयन व्यू कंट्रोलर के सबव्यू में जोड़ रहा है।

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 उपवर्ग: पाठ फ़ील्ड किसी भी सीमाओं नहीं करना चाहिए था:

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

} 

मैं कुछ इस तरह हासिल करने की कोशिश कर रहा हूँ। आइकन UIImageView flattened हैं।

enter image description here

उत्तर

49

यह UISearchBar subview पदानुक्रम से पाठ फ़ील्ड प्राप्त करने के लिए एक आसान तरीका है और के रूप में

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

माउस मैं की तरह UIImageView का हिस्सा हैं क्या करने की जरूरत कहा हुआ। इसका टेक्स्टफील्ड जिसे मैं चिंतित करता हूं। उन अंधेरे ग्रे लाइनों को हटाया जाना है। उत्तर के लिए धन्यवाद। आइकन पहले ही खोज बार से हटा दिए गए हैं। – DesperateLearner

+0

आपको बहुत धन्यवाद Animesh ... यह मेरी समस्या हल करता है। – Hari1251

+1

धन्यवाद, मैं आपके लिए एक दिन बीयर का भुगतान करूंगा। –

6

आईओएस -5 से शुरू आप उपस्थिति प्रॉक्सी है की तरह की जरूरत है अपने गुण सेट, देखें: http://developer.apple.com/library/ios/#documentation/uikit/reference/UISearchBar_Class/Reference/Reference.html ("अनुकूलन उपस्थिति" नामक दो खंड हैं, दोनों की जांच करें)।

यहाँ एक काम कर उदाहरण है, यह ऐप की पूरी UISearchBars को संशोधित करता है:

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

उपयोग निम्नलिखित आप गैर-दस्तावेजी सुविधाओं का उपयोग या एक छवि का उपयोग नहीं करना चाहते हैं:

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

धन्यवाद होगा! अन्य उत्तरों ने मेरे लिए यह अच्छा काम नहीं किया। – user2734823

+0

भयानक उत्तर। इस समस्या को हल किया गया – Logic

4

कार्यान्वयन बदलें प्रतिरोधी & उच्च प्रदर्शन

किसी को पढ़ने और यह सोचने के लिए कि कैसे टी वह एक खोज बार के पाठ क्षेत्र को आसानी से स्विफ्ट में पहुंचा जा सकता है; UISearchBarटेक्स्टफ़िल्ल्ड संपत्ति को निम्नलिखित कोड का उपयोग करके संपत्ति को अंतर्निहित कार्यान्वयन में परिवर्तन के लिए प्रतिरोधी है और पाया गया परिणाम कैश करता है ताकि यह उच्च प्रदर्शन हो।

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

} 

आप संपत्ति का नाम बदलने के लिए चाहते हैं, तो सुनिश्चित करें कि आप searchField के लिए इसे बदल नहीं करते हैं। यह आपकी खोज बार को गड़बड़ कर देगा।

+0

केवल 'self.valueForKey ("_ searchField") को वापस करने के बारे में कैसे? UITextField'? – ton

+2

@ton यह काम करता है। मुझे संदेह है कि ऐप्पल जल्द ही कुछ समय बदल जाएगा लेकिन हैकी समाधानों का उपयोग करते समय मैं व्यक्तिगत रूप से ऐसा करने का तरीका ढूंढना पसंद करता हूं जो अंतर्निहित कार्यान्वयन में बदलाव के लिए थोड़ा लचीला है। – isair

+0

@ abishek-bedi मैंने आपके परिवर्तनों को वापस संपादित किया। मेरा कोड पुराना था लेकिन आपने कार्यान्वयन के मूल को संपादित किया और इसे पूरी तरह से किसी और चीज़ में बदल दिया। मेरे कार्यान्वयन का दिल कोर कार्यान्वयन परिवर्तनों के प्रतिरोधी होने के लिए _searchField पर निर्भर नहीं है। – isair

2

मैं आईओएस 10 के लिए मिल गया है मैं इस (ऊपर से उधार लिया और जल्दी से अनुकूलित)

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

लघु और सरल

extension UISearchBar { 
    var textField:UITextField { 
     guard let txtField = self.value(forKey: "_searchField") as? UITextField else { 
      assertionFailure() 
      return UITextField() 
     } 
     return txtField 
    } 
} 
संबंधित मुद्दे