gpt4 book ai didi

ios - 自定义 UIView 不会调用 Draw 方法

转载 作者:行者123 更新时间:2023-11-29 05:13:21 26 4
gpt4 key购买 nike

我正在为 iOS 创建一个自定义 map 图钉(注释),绘制其路径,然后使用此 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 ,我不是从文件加载注释,而是从 View 加载它:

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

但是 PinView.Draw() 永远不会被调用!

最佳答案

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

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

所以你可以在构造函数中设置默认框架

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

关于ios - 自定义 UIView 不会调用 Draw 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59453663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com