Почему UIGraphics.GetCurrentContext возвращает ноль? - PullRequest
4 голосов
/ 28 февраля 2011

У меня есть 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, который становится нулевым в этом конкретном рабочем процессе.Вот пример того, как он рисует:

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 возвращает ноль только в этом рабочем процессе, но не при запуске?Есть ли другой способ достичь этого же результата?Я что-то пропустил?

Ответы [ 2 ]

5 голосов
/ 28 февраля 2011

Вы не должны делать это, то, что вы хотите сделать, это переопределить:

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

метод на ваших подклассах UIView, и когда метод вызван (в ответ на SetNeedsDisplay ()), сделайте все ваше рисование.

1 голос
/ 28 февраля 2011

Если вы рисуете в UView, затем создаете его подкласс и используете метод Draw.

Если вам нужен контекст, вам сначала нужно его запустить.Как (взято из моего кода, DrawingBoard это UIImage, а DrawingView это UIImageView UIImage):

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;
...