我正在为iOS创建自定义地图图钉(注释),绘制其路径,然后使用method将UIView
转换为图像:
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()
从未被呼叫!
答案 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
方法。