2012-08-03 13 views
9

में एक स्पष्ट बटन एक UITextField करने का अधिकार दृश्य जोड़ने, मैं लग रहा है कि यह दोनों सही दृश्य और स्पष्ट बटन (UITextFieldViewModeAlways करने के लिए दोनों rightViewMode और clearButtonMode सेट होने) प्रदर्शित करने के लिए मना कर दिया करने के बाद प्रदर्शित। मुझे सही दृश्य दिखाई देता है लेकिन स्पष्ट बटन अब प्रदर्शित नहीं होता है। मैंने यह सुनिश्चित किया है कि वे clearButtonRectForBounds और clearButtonRectForBounds को ओवरराइड करके ओवरलैप नहीं करते हैं, इसका कोई फायदा नहीं हुआ है। और यदि मैं दाएं दृश्य के बजाय बाएं दृश्य का उपयोग करता हूं, तो ऐसी कोई समस्या नहीं होती है और बाएं दृश्य और स्पष्ट बटन दोनों प्रदर्शित होते हैं।दोनों एक सही देख सकते हैं और UITextField

तो हालांकि यह प्रलेखन में नहीं कहा गया है, ऐसा लगता है कि स्पष्ट बटन केवल तभी प्रदर्शित होता है जब सही दृश्य प्रदर्शित नहीं होता है (और जब टेक्स्ट प्रॉपर्टी रिक्त स्ट्रिंग नहीं होती है)। क्या यह सही है और क्या किसी के पास भरोसेमंद कामकाज है? इस बीच मेरा मानना ​​है कि मैं एक UIView बनाने के साथ फंस गया हूं जो यूआईटीएक्स्टफिल्ड के शीर्ष पर मेरा सही दृश्य ओवरले करता है ताकि मैं यह प्राप्त कर सकूं कि मैं अकेले यूआईटीएक्स्टफिल्ड से क्या प्राप्त कर रहा हूं।

उत्तर

3

हाँ आप सही हैं। UITextfield में बाएं और दाएं दृश्य जैसे गुण हैं। यदि आप स्पष्ट बटन का उपयोग करते हैं तो यह राइटव्यू ओवरलैप करता है।

फार्म एप्पल डॉक http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UITextField_Class/Reference/UITextField.html

अपने ओवरले दृश्य किसी अन्य भाई विचारों ओवरलैप नहीं करता है, यह किसी भी अन्य दृश्य की तरह स्पर्श इवेंट प्राप्त करता है। यदि आप अपने विचार के लिए नियंत्रण निर्दिष्ट करते हैं, तो वह नियंत्रण ट्रैक करता है और सामान्य रूप से क्रियाएं भेजता है। यदि ओवरले दृश्य स्पष्ट बटन ओवरलैप करता है, हालांकि, स्पष्ट बटन हमेशा ईवेंट प्राप्त करने में प्राथमिकता लेता है। डिफ़ॉल्ट रूप से, दायां ओवरले दृश्य साफ़ बटन ओवरलैप करता है।

लेकिन जैसा कि नाम कहता है कि यह एक दृश्य है। तो आप अपना खुद का दृश्य बना सकते हैं जिसमें इसके 2 बटन हैं और टेक्स्टफील्ड का दायां दृश्य सेट करें। यदि आप चाहें, तो आप अपने बटन को प्रदर्शित करने और दृश्य से गायब होने के लिए टेक्स्टफील्ड के प्रतिनिधि तरीकों का उपयोग कर सकते हैं।

+0

प्रलेखन भ्रामक लगता है। यह नहीं कहता कि स्पष्ट बटन और दायां दृश्य पारस्परिक रूप से अनन्य हैं। यह केवल इतना कहता है कि वे ओवरलैप करते हैं। ऐसा लगता है जैसे मैंने पारदर्शी दृश्य का उपयोग किया, मुझे स्पष्ट बटन दिखाई देगा। हालांकि, यह मामला नहीं है। – Kento

13

तुम दोनों एक ही समय में प्रदर्शित नहीं कर सकता, लेकिन आप इसे इस

UITextField * textfield = [[UITextField alloc] initWithFrame:CGRectMake(10, 100, 300, 40)]; 

[textfield setBorderStyle:UITextBorderStyleRoundedRect]; 

UIImageView * imgvw = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"search.jpeg"]]; 

[imgvw setFrame:CGRectMake(0, 0, 30, 30)]; 

[textfield setRightView:imgvw]; 

[textfield setRightViewMode:UITextFieldViewModeUnlessEditing]; 

[textfield setClearButtonMode:UITextFieldViewModeWhileEditing]; 

[self.view addSubview:textfield]; 
+0

अद्भुत जवाब! –

3

की तरह कर सकते हैं मैं एक ही मुद्दा था, लेकिन आसानी से बजाय LeftView का उपयोग करते हुए 'बेवकूफ बनाना' UITextField द्वारा हल किया गया था सही दर्शय। इस तरह आप स्पष्ट बटन और आपके अनुमानित rightView दोनों का उपयोग कर सकते हैं। आपको बस इतना करना है कि उप-वर्ग UITextField है और leftViewRectForBounds में 'दायां कोने' वापस लौटाएं और इसी प्रकार editingRectForBounds और textRectForBounds अपडेट करें। अच्छी तरह से काम।

+0

मुझे इसे देखने के लिए केवल एक सबव्यूव जोड़ने और 'संपादनRectForBounds/textRectForBounds' को ओवरराइड करना आसान लगता है। 'LeftView' का उपयोग करने की आवश्यकता नहीं थी (क्योंकि मैं हमेशा अपना सबव्यू दिखाना चाहता हूं।) – zekel

+1

यदि आप कुछ उदाहरण कोड जोड़ना चाहते हैं, तो मैं आपको एक अपवॉट दूंगा :) – Tim

+0

अच्छी तरह से काम करता है लेकिन मुझे इसे ठीक से काम करने के लिए 'प्लेसहोल्डररक्टफोरबाउंड' को ओवरराइड करना पड़ा। – execv

2

मैं @strange के जवाब का बैक अप करेंगे कुछ कोड के साथ (सही करने के बजाय छोड़ दिया दृश्य का उपयोग कर):

-(CGRect)leftViewRectForBounds:(CGRect)bounds 
{ 
    return CGRectOffset([super leftViewRectForBounds:bounds], bounds.size.width - 30, 0); 
} 

-(CGRect)clearButtonRectForBounds:(CGRect)bounds 
{ 
    return CGRectOffset([super clearButtonRectForBounds:bounds], -30, 0); 
} 


-(CGRect)editingRectForBounds:(CGRect)bounds 
{ 
    CGRect rect = bounds; 
    rect.origin.x = 10; 
    rect.size.width -= 60; 
    return rect; 
} 


-(CGRect)textRectForBounds:(CGRect)bounds 
{ 
    CGRect rect = bounds; 
    rect.origin.x = 10; 
    rect.size.width -= 60; 
    return rect; 
} 

ध्यान दें कि मेरा अधिकार (बाएं) दृश्य चौड़ाई 30

तो है आप बाएं और दाएं दृश्य, और साफ़ बटन दोनों का उपयोग करते हैं, तो यह समाधान स्पष्ट रूप से काम नहीं करेगा। उस स्थिति में आपको उनमें से किसी एक का उपयोग करना छोड़ देना होगा, और अपने UITextField के बगल में एक अलग दृश्य का उपयोग करना होगा।

संबंधित मुद्दे