Draw方法不会从自定义UIView中调用

时间:2019-12-23 10:25:41

标签: ios xamarin uiview

我正在为iOS创建自定义地图图钉(注释),绘制其路径,然后使用methodUIView转换为图像:

public static UIImage AsImage(this UIView view)
{
    try
    {
        UIGraphics.BeginImageContextWithOptions(view.Bounds.Size, true, 0);
        var ctx = UIGraphics.GetCurrentContext();
        view.Layer.RenderInContext(ctx);
        var img = UIGraphics.GetImageFromCurrentImageContext();
        UIGraphics.EndImageContext();
        return img;
    }
    catch (Exception)
    {
        return null;
    }
}

这是UIView派生的类,在其中绘制注释路径:

public class PinView : UIView
{
    public PinView()
    {
        ContentMode = UIViewContentMode.Redraw;
        SetNeedsDisplay();
    }
    private readonly CGPoint[] markerPathPoints = new[]
   {
        new CGPoint(25f, 5f),
        new CGPoint(125f, 5f),
        //other points    };

    public override void Draw(CGRect rect)
    {
        base.Draw(rect);
        //get graphics context
        CGContext context = UIGraphics.GetCurrentContext();
        //set up drawing attributes
        context.SetLineWidth(10);
        UIColor.White.SetFill();
        UIColor.Black.SetStroke();

        //create geometry
        var path = new CGPath();
        path.MoveToPoint(markerPathPoints[0].X, markerPathPoints[0].Y);
        for (var i = 1; i < markerPathPoints.Length; i++)
        {
            path.AddLineToPoint(markerPathPoints[i].X, markerPathPoints[i].Y);
        }

        path.CloseSubpath();
        //add geometry to graphics context and draw it
        context.AddPath(path);
        context.DrawPath(CGPathDrawingMode.FillStroke);
    }

我正在修改Xamarin.Forms sample of the MapCustomRenderer,而不是从文件中加载注释,而是从视图中加载它:

annotationView.Image = new PinView().AsImage();

但是PinView.Draw()从未被呼叫!

2 个答案:

答案 0 :(得分:1)

第一次加载控件时,将在方法Draw之后调用方法ViewDidLoad,系统会自动调用该方法。

在您的情况下,您没有设置PinView的Rect(Frame)。因此,将永远不会调用方法Draw,因为Rect的默认值为零。

因此您可以在构造函数中设置默认框架

public PinView()
{
  Frame = new CGRect (0,0,xx,xxx);
  ContentMode = UIViewContentMode.Redraw;
  SetNeedsDisplay();
}

答案 1 :(得分:-1)

需要将视图添加到视图层次结构(在我的情况下是添加到MKAnnotationView中), 因此,在CustomMKAnnotationView构造函数中:

public CustomMKAnnotationView(IMKAnnotation annotation, string id)
    : base(annotation, id)
{
    var pin = new PinView(new CGRect(0, 0, 110, 110));
    pin.BackgroundColor = UIColor.White.ColorWithAlpha(0);
    Add(pin);
}

UIView的构造函数中,Frame应该按照Lucas Zhang的说明进行初始化:

public PinView(CGRect rectangle)
{
    Frame = rectangle;
    ContentMode = UIViewContentMode.Redraw;
    SetNeedsDisplay();
}

通过这些更改,将调用Draw方法。