2013-07-31 12 views
10

मेरे पास एक UIView है जिसमें UIButton है। UIButton में UIControlStateNormal ("Follow") और UIControlStateSelected ("फ़ॉलो") राज्यों के लिए 2 शीर्षक सेट हैं। मैं UIButton पर ऑटो लेआउट का उपयोग कर रहा हूं और पर्यवेक्षण के बाईं ओर से एक निश्चित दूरी होने के लिए बाध्यता है और दूसरा पर्यवेक्षण के बाईं ओर से एक निश्चित दूरी है। मैंने "सामग्री फिट करने के लिए आकार" का भी उपयोग किया है।UIButton स्थिति बदलते समय आंतरिक आकार अपडेट नहीं हो रहा है

जब मैं बटन से चुने गए राज्य में बटन सेट करता हूं, तो शीर्षक सही ढंग से बदलता है लेकिन UIButton की आंतरिक चौड़ाई बदलती नहीं है ताकि जब "अनुसरण करें" से "अनुसरण करें" में बदलते समय पाठ को लंबित हो जाए।

self.selected = self.following; 

enter image description hereenter image description here

जब मैं समस्या को अलग तरह के दृष्टिकोण और जब कोई बटन दबाता बस UIControlStateNormal के लिए पाठ बदलने के लिए, बटन परिवर्तन सही ढंग से आकार।

NSString *title = (self.following) ? @"Following" : @"Follow" 
[self setTitle:title forState:UIControlStateNormal]; 

enter image description hereenter image description here

इस UIKit में एक बग है? मैं उम्मीद करता हूं कि बटन अपने आंतरिक आकार को बदलने के लिए टेक्स्ट के नए आकार को सही ढंग से प्रतिबिंबित करने की अपेक्षा करेगा जब विशेष रूप से राज्य बदलता है क्योंकि अन्य चीजें हैं जिन्हें मैं 2 बटन राज्यों के टेक्स्ट के अलावा बदलना चाहता हूं।

उत्तर

21

की तरह डेविड Caunt एक टिप्पणी में कहा, invalidateIntrinsicContentSize बुला बटन आकार बदलने के लिए फिट करने के लिए autolayout कारण होगा नई सामग्री है ।

self.selected = self.following; 
[self invalidateIntrinsicContentSize]; 

पीएस। डेविड, अगर आप अपने कमेंट को उत्तर के रूप में पोस्ट करना चाहते हैं तो मैं अपना हटा दूंगा।

+1

क्या किसी ने देर से यह कोशिश की है (आईओएस 8.2+)? मेरे लिए काम करने वाला एकमात्र सीधा समाधान @ अब्दुल्ला का सेटटाइट: फोर्स्टेट है। मैंने लेआउट के साथ उस पंक्ति का पालन करने का भी प्रयास किया है IFNeeded। –

+0

किसी भी लेआउट सिस्टम के साथ पूर्ण और संगत होने के लिए मुझे इसे सेटनेड्स लेटआउट को कॉल करने के साथ पालन करना होगा और पर्यवेक्षण के प्रत्येक पर्यवेक्षण पर इसे तब तक कॉल करना होगा जब तक कि कोई और नहीं हो ... ऐसा लगता है कि परिवर्तन आकार के सब कुछ पर लागू होगा प्रभाव। (यदि सबव्यू इत्यादि में डाल दिया गया है) – Ben

1

अपनी स्टोरीबोर्ड में अपने UIButton का चयन करें और शीर्ष पर चयन करें-> सामग्री आकार फिट करने के लिए आकार का चयन करें।

संपादित करें: इस प्रयास करें:

[self.myButton setTitle:@"Following" forState:UIControlStateSelected]; 
[self.myButton sizeToFit]; 
+0

मैंने कोशिश की, इस सवाल में इसका उल्लेख है। – jvergeldedios

+0

@jvedi सुनिश्चित करें कि जब आप ऐसा करते हैं तो आपका UIButton चयनित होता है। –

+0

यह अभी भी कोई बदलाव नहीं था। – jvergeldedios

0

चाहे यह एक बग, या बस जिस तरह से यह है, मैं नहीं जानता कि, लेकिन ऐसा लगता है कि आप इसे हल करने के लिए होगा - - मुझे नहीं लगता कि आप कुछ भी गलत कर रहे हैं। आप के बीच चयन किया है और नहीं हर स्पर्श के बाद, आप कुछ इस तरह कर सकता है चालू करने के लिए करना चाहते हैं:

- (IBAction)buttonClick:(UIButton *)sender { 
    sender.selected = !sender.selected; 
    if (sender.selected) { 
     [self.button setTitle:@"Following" forState:UIControlStateNormal]; 
     //Do whatever else you want to do here for the selected state 
    }else{ 
     [self.button setTitle:@"Follow" forState:UIControlStateNormal]; 
    } 
} 
+0

मैं इस तरह कुछ के साथ जा रहा था, लेकिन यह अभी भी मेरे लिए अजीब लगता है कि राज्य स्विचिंग सिर्फ इस तरह काम नहीं करेगा। ओह अच्छा। – jvergeldedios

+0

@jvedi, मैं सहमत हूं। यह अजीब लगता है कि आंतरिक आकार UIControlStateSelected के लिए काम नहीं करता है। ऐसा लगता है कि ऐप्पल कुछ लागू करने के लिए भूल गया था। – rdelmar

+6

आपको केवल 'अवैधateIntrinsicContentSize' कॉल करने की आवश्यकता है और इसे काम करना चाहिए। 'setTitle: forState' शायद इस विधि को आंतरिक रूप से कॉल करता है। –

1

मेरे लिए सामग्री सेट करने के लिए EgegeInsets ने मुझे एकमात्र विश्वसनीय समाधान दिया।

मैं पृष्ठभूमि छवियों के साथ कस्टम बटन का उपयोग कर रहा हूं। तो, स्लाइस तस्वीर में आते हैं। यह पता चला है कि आप छवियों को टुकड़ा कैसे आंतरिक सामग्री आकार को प्रभावित कर सकते हैं! झसे आज़माओ! इसलिए, मुझे यह सुनिश्चित करना था कि मैं विभिन्न राज्यों के लिए छवियों के बीच समान रूप से टुकड़ा कर रहा था। मैं भी जिम्मेदार तारों का उपयोग कर रहा हूँ। यहां पोस्ट किए गए समाधान मेरे मामले के लिए काम नहीं करते थे।

प्रयोग के एक दिन (!) के बाद मुझे जो मिला वह यह है कि पर्याप्त सामग्री सेट करना बटन पर एज इन्सनेट मानों को ऑटोलायआउट का उपयोग करके शीर्षक बदलते समय सही तरीके से व्यवहार करता है। आंतरिक सामग्री आकार को अमान्य करने की आवश्यकता नहीं है या यदि आप ऐसा करते हैं तो कोई लेआउट कोड कॉल करें।

आप कोड या आईबी में सामग्री एंजइजनेट सेट कर सकते हैं।

self.button.contentEdgeInsets = UIEdgeInsetsMake(10.0, 16.0, 10.0, 16.0); 

मुझे लगता है कि स्विफ्ट कोड var विशेषता के अलावा समान है।

ऐप्पल दस्तावेज़ों में यह कहता है: "बटन आंतरिक संपत्ति का आकार निर्धारित करने के लिए इस संपत्ति का उपयोग करता है सामग्री और आकारटैटफिट्स:"।

enter image description here

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