扩展UIButton边框最初未被绘制

31

我正在尝试创建一个自定义的UIButton,它继承自UIButtonType.RoundedRect

我的附加功能可以工作,但是我的按钮的初始圆角边框状态存在问题。我的扩展按钮的边框直到被点击后才会被绘制出来。

Before-After Screenshot

更新(2013年1月24日):根据Richard 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,因为我不想自己设置按钮样式。
  • 当我进行调试时,MyButton的类型已正确设置为UIButtonType.RoundedRect
  • MyButton(button2)的基本属性与UIButton实例(button1)的属性匹配。

Debug

我该如何解决这个问题?


更新(2013年1月31日):Herman Schoenfeld为此漏洞提供了适当的解决方案。


6
对于格式良好的问题,点赞(+1)。 - MarioDS
1
一个工厂类不能被继承。话虽如此,提供了一个公共构造函数作为这样一个工厂类是很奇怪的。从你的代码中没有任何东西会让人相信工厂方法的行为会与带有 UIButtonType 参数的构造函数不同。 - ardila
@aardila 感谢您对 Factory 类的澄清。是的,它似乎很奇怪。 - Scott
@StephenHewlett 我不完全确定你所说的“以相同的方式创建两个按钮”的意思。你能提供一下相关代码或者详细解释一下你的方法吗?这样我才好尝试一下,谢谢。 - Scott
尝试将 MyButton button2 = new MyButton(); 替换为 UIButton button2 = new UIButton(UIButtonType.RoundedRect); 或者反过来,看看按钮是否仍然正确显示。 - Stephen Hewlett
显示剩余6条评论
1个回答

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

这只是一个解决方法,看起来是个bug。SizeToFit()修复了问题,其他代码保持框架。


谢谢Herman,这是一个不错的解决方案。我已经重写了我的按钮的Frame属性,因此修复程序可以应用而无需调用单独的Fix()方法。 - Scott
根据您的建议进行了更新。 - Herman Schoenfeld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接