为什么UIGraphics.GetCurrentContext会返回null?

时间:2011-02-28 00:07:24

标签: drawing xamarin.ios

我有一个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,但在启动时不返回?还有另一种方法可以达到同样的效果吗?我只是错过了一些东西吗?

2 个答案:

答案 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;