31 votes

Étendue UIButton frontière n'est pas initialement

Je suis en train de créer un personnalisé UIButton qui s'étend de l' UIButtonType.RoundedRect.

Mon a ajouté la fonctionnalité est au travail, mais il y a un problème avec la première bordure arrondie état de mon bouton. La frontière de mon extension de bouton n'est pas établi qu'après qu'il a été exploité.

Before-After Screenshot

Mise à jour (24 janvier 2013): ajoute le résultat de l'arrière-plan rouge de test, comme demandé par Richard Marskell, qui conclut seulement l'étiquette du bouton est dessiné. BackgroundColor = UIColor.Red;

Red Background Test, Before-After Screenshot

Ci-dessous mon code source pour la création de mon bouton personnalisé.

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) { }
}
  • Je ne suis pas sûr de savoir comment la force de la frontière à tirer correctement sur le chargement de la vue.
  • Je n'ai pas besoin d'un bouton de type UIButtonType.Custom, comme je ne veux pas le style le bouton de moi-même.
  • Quand je debug j'ai le type de MyButton est correctement réglé UIButtonType.RoundedRect.
  • Le UIButton propriétés de base de MyButton (bouton2) correspondent aux propriétés de la UIButton instance (button1).

Debug

Comment puis-je résoudre ce problème?


Mise à jour (31 janvier 2013): Herman Schoenfeld a fourni une solution pour ce bug.

7voto

Herman Schoenfeld Points 1480

Cela fonctionne

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

Ce n'est qu'une solution de contournement, il semble être un bug. Le SizeToFit() résout le problème, le code des autres maintient le cadre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X