C# 最初未绘制扩展的UIButton边框

C# 最初未绘制扩展的UIButton边框,c#,mono,xamarin.ios,uibutton,uikit,C#,Mono,Xamarin.ios,Uibutton,Uikit,我正在尝试创建一个自定义UIButton,它扩展自UIButtonType.RoundedRect 我添加的功能正在运行,但按钮的初始圆角边框状态存在问题。我的扩展按钮的边框在点击后才会绘制 更新(2013年1月24日):根据Richard Marskell的要求,添加了红色背景测试的结果,其结论是仅绘制了按钮的标签背景色=UIColor.Red 下面是我创建自定义按钮的源代码 公共类TestView:UIView { 公共测试视图(intptrp):基(p){} 公共测试视图(矩形边界)

我正在尝试创建一个自定义UIButton,它扩展自
UIButtonType.RoundedRect

我添加的功能正在运行,但按钮的初始圆角边框状态存在问题。我的扩展按钮的边框在点击后才会绘制

更新(2013年1月24日):根据Richard Marskell的要求,添加了红色背景测试的结果,其结论是仅绘制了按钮的标签<代码>背景色=UIColor.Red

下面是我创建自定义按钮的源代码

公共类TestView:UIView
{
公共测试视图(intptrp):基(p){}
公共测试视图(矩形边界)
{
帧=边界;
BackgroundColor=UIColor.White;
UIButton button1=新的UIButton(UIButtonType.RoundedRect);
按钮1.框架=新矩形F(20,20100,50);
按钮1.设置标题(“按钮1”,uicontrol状态.正常);
AddSubview(按钮1);//正确绘制
MyButton button2=新的MyButton();
按钮2.框架=新矩形F(20,90100,50);
按钮2.设置标题(“按钮2”,uicontrol状态.正常);
AddSubview(按钮2);//仅在点击后正确绘制
//编辑:增加了对米格尔理论的检验
UIButton button3=UIButton.FromType(UIButtonType.RoundedRect);
按钮3.框架=新矩形F(20160100,50);
按钮3.设置标题(“按钮3”,uicontrol状态.正常);
AddSubview(按钮3);//正确绘制
}
}
公共类MyButton:UIButton
{
public MyButton():base(UIButtonType.RoundedRect){}
}
  • 我只是不知道如何在加载视图时强制正确绘制边界
  • 我不需要类型为
    UIButtonType.Custom
    的按钮,因为我不想自己设计按钮的样式
  • 调试I时,MyButton的类型正确设置为
    UIButtonType.RoundedRect
  • MyButton(button2)的UIButton基本属性与UIButton实例(button1)的属性匹配

我如何解决这个问题


更新(2013年1月31日):Herman Schoenfeld为这个bug提供了一个合适的解决方案。

这很有效

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()修复了该问题,其他代码维护了框架。

+1对于格式良好的问题。能否尝试UIButton.FromXXX方法来创建按钮而不是构造函数?只是想试试theory@miguel.de.icaza谢谢你调查这件事。我尝试过使用
UIButton.FromType
方法创建一个UIButton,并且绘制正确。我不知道该如何使用此方法创建MyButton实例。工厂类不能从中继承。这就是说,为这样的工厂类提供公共构造函数是很奇怪的。您的代码中没有任何东西会让人相信工厂方法的行为会与带有
UIButtonType
参数的构造函数的行为有所不同。@aardila感谢您对工厂类的澄清。是的,这看起来很奇怪。谢谢赫尔曼,这是一个很好的解决方案。我已覆盖按钮的
Frame
属性,因此应用修复程序时无需调用单独的方法
fix()
。根据您的建议进行更新。