子类UIView(另一个子类UIView的子)的绘制方法,不称为

时间:2015-05-19 15:58:02

标签: c# ios uiview xamarin xamarin.ios

我有一个子类化的父UIView对象,它应该添加另一个子类UIView。这是我要添加的UIView以及未调用Draw方法的地方:

public class Circle : UIView
{
    private UIColor color;

    public Circle ()
    {
        this.color = UIColor.Black;

        this.BackgroundColor = UIColor.Clear;
    }

    public Circle (UIColor color)
    {
        this.color = color;

        this.BackgroundColor = UIColor.Clear;
    }

    public override void Draw (CGRect rect)
    {
        base.Draw (rect);

        // Get the context
        CGContext context = UIGraphics.GetCurrentContext ();

        context.AddEllipseInRect (rect);
        context.SetFillColor (color.CGColor);
        context.FillPath ();
    }
}

这就是我添加的方式:

Circle circle = new Circle (UIColor.Red);
circle.TranslatesAutoresizingMaskIntoConstraints = false;
AddSubview (circle);

AddConstraint(NSLayoutConstraint.Create(circle, NSLayoutAttribute.Left, NSLayoutRelation.Equal, line, NSLayoutAttribute.Left, 1, 10));
AddConstraint(NSLayoutConstraint.Create(circle, NSLayoutAttribute.CenterY, NSLayoutRelation.Equal, line, NSLayoutAttribute.CenterY, 1, 0));
AddConstraint(NSLayoutConstraint.Create(circle, NSLayoutAttribute.Height, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 1, 6));
AddConstraint(NSLayoutConstraint.Create(circle, NSLayoutAttribute.Width, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 1, 6));

上面的代码再次出现在父代的Draw方法中。除圆圈外,父对象被绘制得很好,即使我使用下面的代码作为 circle ,它也会正确显示。所以约束是可以的。

UIView circle = new UIView() { BackgroundColor = UIColor.Red };

我做错了什么?我不能覆盖两个Draw方法(在子类的父级和子类中)?

PS:我必须提到圆圈应该重叠一条线。但Draw从未被调用过,因此它似乎没有得到一个框架。

1 个答案:

答案 0 :(得分:3)

你是否意识到你正在实例化一个UIView而不是这个代码中的圆圈被剪断?

UIView circle = new UIView() { BackgroundColor = UIColor.Red };

另外你不应该在draw方法中添加subview,因为它会被多次调用,实际上你应该只在你自己进行自定义绘制的情况下覆盖Draw方法(就像Circle视图一样)但不是父视图的情况。)

来自苹果文件:

  

根据需要查看绘图。首次显示视图时   或者当全部或部分因布局变化而变得可见时,   系统要求视图绘制其内容。对于包含的视图   使用UIKit或Core Graphics的自定义内容,系统调用   view的drawRect:方法

那么你可以在实际添加父视图的地方发布代码狙击吗?而父视图的代码,您可能会覆盖一个方法而不是调用基类方法(如setNeedsDisplay或类似的东西)或者您没有添加视图。