2012-12-29 28 views
31

UIButtonType.RoundedRect'dan başlayan özel bir UIButton oluşturmaya çalışıyorum.Genişletilmiş UIButton kenarlığı başlangıçta çizilmiyor

Eklenen işlevsellik çalışıyor, ancak düğmemdeki ilk yuvarlak kenarlık durumuyla ilgili bir sorun var. Genişletilmiş düğmem sınırına dokunulduktan sonra çekilmez.

Before-After Screenshot

Güncelleme (24 Ocak 2013): çizilir düğmeye sadece etiketini sonucuna Richard Marskell, isteği üzerine kırmızı arka plan testinin sonucunu eklendi. BackgroundColor = UIColor.Red;

Red Background Test, Before-After Screenshot

Aşağıda benim özel düğme oluşturmak için benim kaynak kodudur.

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) { } 
} 
  • Sadece görünümün yükleme doğru çizilmesi sınırı zorlamak için nasıl emin değilim.
  • Düğmeyi kendim çizmek istemediğim için UIButtonType.Custom türünde bir düğüme ihtiyacım yok.
  • Hata ayıkladığımda, MyButton türünü doğru olarak UIButtonType.RoundedRect olarak ayarlayın.
  • MyButton'un (button2) UIButton temel özellikleri, UIButton örneğinin (düğme1) özellikleriyle eşleşir.

Debug

Bu sorunu nasıl çözebilirim?


Güncelleştirme (31 Ocak 2013): Herman Schoenfeld bu hata için uygun bir çözüm sağladı.

+6

+1. – MarioDS

+0

Oluşturucu yerine düğmeyi oluşturmak için UIButton.FromXXX yöntemini deneyebilir misiniz? Sadece bir teoriyi denemek için –

+0

@ miguel.de.icaza Bunu incelediğiniz için teşekkürler. UIButton.FromType yöntemini kullanarak bir UIButton oluşturmayı denedim ve doğru çizildi. Bu yöntemi kullanarak MyButton örneğini oluşturma yöntemini nasıl kullanacağımı bilmiyorum. – Scott

cevap

7

Bu işleri

Bu, bir hata olması sadece geçici çözüm görüntülenir
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() sorunu giderir, diğer kod çerçeveyi korur. İyi biçimlendirilmiş bir soru için

+0

Teşekkürler Herman, bu böcek için iyi bir çözüm. Fix() 'adlı ayrı yöntemi çağırmaya gerek kalmadan düzeltmenin uygulanabilmesi için düğmemdeki 'Kare' özelliğini geçersiz kıldım. – Scott

+0

Önerinizle güncellendi. –