2012-12-29 13 views
31

नहीं बनाई गई है, मैं एक कस्टम UIButton बनाने की कोशिश कर रहा हूं जो UIButtonType.RoundedRect से फैली हुई है।विस्तारित UIButton सीमा प्रारंभ में

मेरी अतिरिक्त कार्यक्षमता काम कर रही है, लेकिन मेरे बटन की प्रारंभिक गोलाकार सीमा स्थिति के साथ कोई समस्या है। मेरे विस्तारित बटन की सीमा तब तक नहीं खींची जाती है जब तक इसे टैप नहीं किया जाता है।

Before-After Screenshot

अद्यतन (जनवरी 24 वें 2013): के रूप में रिचर्ड Marskell है, जो केवल बटन के लेबल का निष्कर्ष तैयार की है से अनुरोध किया, लाल रंग की पृष्ठभूमि परीक्षण के परिणाम को जोड़ा गया। BackgroundColor = UIColor.Red;

Red Background Test, Before-After Screenshot

नीचे अपने कस्टम बटन बनाने के लिए मेरे स्रोत कोड है।

public class TestView : UIView 
{ 
    public TestView(IntPtr p) : base(p) { } 

    public TestView(RectangleF bounds) 
    { 
     Frame = bounds; 
     BackgroundColor = UIColor.White; 

     UIButton button1 = new UIButton(UIButtonType.RoundedRect); 
     button1.Frame = new RectangleF(20,20,100,50); 
     button1.SetTitle("Button 1", UIControlState.Normal); 
     AddSubview(button1); // Drawn Correctly 

     MyButton button2 = new MyButton(); 
     button2.Frame = new RectangleF(20,90,100,50); 
     button2.SetTitle("Button 2", UIControlState.Normal); 
     AddSubview(button2); // Only drawn correctly after Tap 

     // EDIT: Added to test Miguel's theory 
     UIButton button3 = UIButton.FromType(UIButtonType.RoundedRect); 
     button3.Frame = new RectangleF(20,160,100,50); 
     button3.SetTitle("Button 3", UIControlState.Normal); 
     AddSubview(button3); // Drawn Correctly 
    } 
} 

public class MyButton : UIButton 
{ 
    public MyButton() : base(UIButtonType.RoundedRect) { } 
} 
  • मैं सिर्फ यकीन है कि कैसे सीमा को देखने के लोड हो रहा है पर सही ढंग से तैयार किया जा करने के लिए मजबूर करने के लिए नहीं कर रहा हूँ।
  • मुझे UIButtonType.Custom टाइप करने की आवश्यकता नहीं है, क्योंकि मैं स्वयं बटन को स्टाइल नहीं करना चाहता हूं।
  • जब मैं डीबग करता हूं तो माईबटन का प्रकार सही ढंग से UIButtonType.RoundedRect पर सेट होता है।
  • MyButton (बटन 2) के UIButton मूल गुण UIButton इंस्टेंस (बटन 1) के गुणों से मेल खाते हैं।

Debug

मैं इस मुद्दे का समाधान कैसे कर सकते हैं?


अद्यतन (31 जनवरी 2013): हरमन शॉन्फेल्ड ने इस बग के लिए एक उपयुक्त समाधान प्रदान किया।

+6

+1। – MarioDS

+0

क्या आप कन्स्ट्रक्टर के बजाए बटन बनाने के लिए UIButton.FromXXX विधि आज़मा सकते हैं? एक सिद्धांत को आजमाने के लिए –

+0

@ miguel.de.icaza इस में देखने के लिए धन्यवाद। मैंने 'UIButton.FromType' विधि का उपयोग करके UIButton बनाने का प्रयास किया है, और यह सही ढंग से खींचा गया है। मुझे यकीन नहीं है कि इस विधि का उपयोग करके माईबटन का उदाहरण बनाने के लिए मुझे इस विधि का उपयोग कैसे करना है। – Scott

उत्तर

7

यह काम करता है

public class MyButton : UIButton 
{ 
    public MyButton() : base(UIButtonType.RoundedRect) { } 


    public override RectangleF Frame { 
     get { 
      return base.Frame; 
     } 
     set { 
      var temp = TranslatesAutoresizingMaskIntoConstraints; 
      TranslatesAutoresizingMaskIntoConstraints = false; 
      var constraints = new [] { 
       NSLayoutConstraint.Create(this, NSLayoutAttribute.Width, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 1.0f, value.Width), 
       NSLayoutConstraint.Create(this, NSLayoutAttribute.Height, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 1.0f, value.Height) 
      }; 
      AddConstraints(constraints); 
      SizeToFit(); 
      RemoveConstraints(constraints); 
      base.Frame = value; 
      TranslatesAutoresizingMaskIntoConstraints = temp; 
     } 
    } 
} 

यह केवल एक समाधान है, यह एक बग प्रतीत होता है। SizeToFit() समस्या को हल करता है, दूसरा कोड फ्रेम को बनाए रखता है। एक अच्छी तरह से स्वरूपित प्रश्न के लिए

+0

धन्यवाद हरमन, इस बग का एक अच्छा समाधान है। मैंने अपने बटन की 'फ्रेम' प्रॉपर्टी को ओवरराइड कर दिया है, इसलिए फिक्स को अलग-अलग विधि 'फिक्स() 'कॉल करने की आवश्यकता के बिना लागू किया गया है। – Scott

+0

आपके सुझाव के साथ अपडेट किया गया। –