2011-02-28 167 views
4

我有一個UIViewController,它包含2個使用UIGraphics.GetCurrentContext進行自定義繪製的子視圖(派生自UIView的類)。繪圖在應用程序啓動時工作正常。我的子視圖在視圖控制器的viewDidLoad()連接這樣的:爲什麼UIGraphics.GetCurrentContext返回null?

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,它在此特定工作流程中變爲空。下面是它是如何繪製一個樣本:

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?還有另一種方法可以達到同樣的效果嗎?我只是想念一些東西?

回答

5

你不應該這樣做,你需要做的是重寫:

 public virtual void Draw (System.Drawing.RectangleF rect) 

方法對你的UIView子類,而當該方法提高(響應SetNeedsDisplay())做你的繪畫。

+1

完美!有用。我所要做的就是告訴第一個子視圖有新的數據繪製,保存新的值,並調用SetNeedsDisplay()。正常的油漆機制從那裏接管。我已經忽略了Draw,但我試圖在Draw之外繪製,這不起作用。謝謝。 – Jim 2011-03-01 03:04:38

1

如果您繪製到UView,然後子類並使用繪製方法。

如果您需要上下文,則需要先啓動它。像(取自我的代碼,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;