我有一个UIViewController,它包含2个子视图(从UIView派生的类),使用UIGraphics.GetCurrentContext进行自定义绘图。绘图在应用程序启动时工作正常。我在视图控制器的ViewDidLoad()中连接子视图,如下所示:
DigitalNumberView dnv = new DigitalNumberView();
dnv.Frame = new System.Drawing.RectangleF(10, 10, 750, 190);
View.AddSubview(dnv);
CircleView tuner = new CircleView(dnv);
tuner.Frame = new System.Drawing.RectangleF(570, 220, 190, 190);
View.AddSubview(tuner);
我需要第一个子视图来绘制自定义内容,具体取决于第二个子视图的功能。当第二个子视图获得TouchesEnded时,我在第一个子视图中调用一个显示新数据的函数。第一个子视图中的绘图使用UIGraphics.GetCurrentContext,它在此特定工作流中变为null。以下是它如何绘制的示例:
SetNeedsDisplay();
CGContext context = UIGraphics.GetCurrentContext ();
if (null == context) {
Console.WriteLine("Retrieved null CGContext");
return;
}
RectangleF r = new RectangleF(25, 10, 180, 180);
ClearNumber(context, r);
DisplayNumber(context, f, r);
UIGraphics.EndImageContext();
为什么UIGraphics.GetCurrentContext仅在此工作流程中返回null,但在启动时不返回?还有另一种方法可以达到同样的效果吗?我只是错过了一些东西吗?
答案 0 :(得分:5)
你不应该这样做,你想要做的是覆盖:
public virtual void Draw (System.Drawing.RectangleF rect)
你的UIView子类的方法,以及引发方法时(响应SetNeedsDisplay())完成所有绘图。
答案 1 :(得分:1)
如果您绘制到UView,则将其子类化并使用Draw方法。
如果您需要上下文,则需要先启动它。喜欢(取自我的代码,drawingBoard是UIImage,drawingView是UIImage的UIImageView):
UIGraphics.BeginImageContext (drawingBoard.Size);
// erase lines
ctx = UIGraphics.GetCurrentContext ();
// Convert co-ordinate system to Cocoa's (origin in UL, not LL)
ctx.TranslateCTM (0, drawingBoard.Size.Height);
ctx.ConcatCTM (CGAffineTransform.MakeScale (1, -1));
ctx.DrawImage (new RectangleF (0, 0, drawingBoard.Size.Width, drawingBoard.Size.Height), drawingBoard.CGImage);
drawingBoard = UIGraphics.GetImageFromCurrentImageContext ();
UIGraphics.EndImageContext ();
drawingView.Image = drawingBoard;