2012-12-29 12 views
31

Próbuję utworzyć niestandardowy UIButton, który rozciąga się od UIButtonType.RoundedRect.Rozszerzona granica UIButton nie została początkowo narysowana

Moja dodana funkcjonalność działa, ale wystąpił problem z początkowym stanem zaokrąglonej krawędzi mojego przycisku. Obramowanie mojego przedłużonego przycisku nie zostanie narysowane, dopóki nie zostanie dotknięte.

Before-After Screenshot

Update (24 stycznia 2013): Dodano wynik testu czerwonym tle, wymagane przez Richarda Marskell, w którym stwierdzono jedynie etykietę przycisku jest rysowany. BackgroundColor = UIColor.Red;

Red Background Test, Before-After Screenshot

Poniżej jest mój kod źródłowy do tworzenia mój własny przycisk.

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) { } 
} 
  • ja po prostu nie jestem pewien, jakie należy wyciągnąć poprawnie na załadowanie widoku jak zmusić granicę.
  • Nie potrzebuję przycisku typu UIButtonType.Custom, ponieważ nie chcę sam stylować przycisku.
  • Po debugowaniu I typ MyButton jest ustawiony prawidłowo na UIButtonType.RoundedRect.
  • Podstawowe właściwości UIButton w MyButton (button2) są zgodne z właściwościami instancji UIButton (przycisk 1).

Debug

Jak mogę rozwiązać ten problem?


Aktualizacja (31 stycznia 2013 r.): Herman Schoenfeld dostarczył odpowiednie rozwiązanie dla tego błędu.

+6

+1 za dobrze sformatowane pytanie. – MarioDS

+0

Czy możesz wypróbować metodę UIButton.FromXXX, aby utworzyć przycisk zamiast konstruktora? Aby wypróbować teorię, –

+0

@ miguel.de.icaza Dzięki za rozpatrzenie tego. Próbowałem utworzyć UIButton przy użyciu metody 'UIButton.FromType' i jest ona poprawnie rysowana. Nie jestem pewien, w jaki sposób mam użyć tej metody tworzenia instancji MyButton przy użyciu tej metody. – Scott

Odpowiedz

7

To działa

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

to tylko obejście problemu, wydaje się być błąd. SizeToFit() naprawia problem, drugi kod utrzymuje ramkę.

+0

Dzięki Herman, dobre rozwiązanie tego błędu. Nadpisałem właściwość 'Frame' mojego przycisku, więc poprawka jest stosowana bez potrzeby wywoływania oddzielnej metody' Fix() '. – Scott

+0

Zaktualizowany z twoją sugestią. –