我有一个子类化的父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
从未被调用过,因此它似乎没有得到一个框架。
答案 0 :(得分:3)
你是否意识到你正在实例化一个UIView而不是这个代码中的圆圈被剪断?
UIView circle = new UIView() { BackgroundColor = UIColor.Red };
另外你不应该在draw方法中添加subview,因为它会被多次调用,实际上你应该只在你自己进行自定义绘制的情况下覆盖Draw方法(就像Circle视图一样)但不是父视图的情况。)
来自苹果文件:
根据需要查看绘图。首次显示视图时 或者当全部或部分因布局变化而变得可见时, 系统要求视图绘制其内容。对于包含的视图 使用UIKit或Core Graphics的自定义内容,系统调用 view的drawRect:方法
那么你可以在实际添加父视图的地方发布代码狙击吗?而父视图的代码,您可能会覆盖一个方法而不是调用基类方法(如setNeedsDisplay或类似的东西)或者您没有添加视图。