неверная контекстная ошибка при рисовании UIImage - PullRequest
1 голос
/ 04 октября 2011

Я пытаюсь нарисовать UIImage в контексте моего UIView.Я использовал этот код с контекстом, закомментированным внутри и снаружи ...

- (void)drawRect:(CGRect)rect
{
    //UIGraphicsBeginImageContextWithOptions(rect.size,YES,[[UIScreen mainScreen] scale]);
    //UIGraphicsBeginImageContext(rect.size);

    UIImage *newImage = [UIImage imageNamed:@"character_1_0001.png"];
    //[newImage drawAtPoint:CGPointMake(200, 200)];
    [newImage drawInRect:rect];

    //UIGraphicsEndImageContext();
}

Насколько я понимаю, мне не нужно устанавливать контекст изображения, чтобы сделать это, и действительно, без него я вижуизображение, нарисованное в виде, но я также получаю эту ошибку в журнале ...

<Error>: CGContextSaveGState: invalid context 0x0

Если я раскомментирую строки UIGraphicsBeginImageContext, я ничего не получаю и не вижу ошибок.

Нужно ли использовать графический контекст по умолчанию и как-то объявить это?

Мне нужно нарисовать изображение, потому что я хочу добавить к нему контекст и не могу просто сгенерировать загрузку объектов UIImageView.

Ответы [ 2 ]

3 голосов
/ 04 октября 2011

Звучит так, как будто вы звоните drawRect: напрямую.Так что он вызывается один раз из вашего звонка, а один раз из подлинного цикла рисования.

  • При наличии создания контекста вы выполняете все рисование в новом контексте и затем отбрасываете его, поэтому вы ничего не видите
  • При отсутствии создания контекста вы получаете ошибку отВызывается вручную drawRect:, и фактический рисунок происходит в подлинном drawRect:, поэтому вы видите свое изображение.

Не звоните drawRect: напрямую.Звоните setNeedsDisplay и drawRect: позвонят вам в соответствующую точку.

0 голосов
/ 04 октября 2011

Я обнаружил, что происходит. Хост ViewController моего пользовательского UIView создавал экземпляр объекта CALayer. Это был какой-то старый код, который ранее использовался как слой рисования для растрового изображения из AVCaptureSession, который я использую для создания своего изображения.

Я сейчас не использую CALayer и вместо этого просто рисую фрагмент каждого кадра видео в графическом контексте по умолчанию в моем представлении.

По какой-то причине создание этого CALayer вызвало конфликт в контексте.

Теперь он не используется. Мне нужно использовать только следующий код для рисования изображения ...

- (void)drawRect:(CGRect)rect
{
    UIImage *newImage = [UIImage imageNamed:@"character_1_0001.png"];
    [newImage drawInRect:rect];
}

Теперь я просто делаю то же самое с изображением, которое передаю как CGImageRef, и корректирую прямоугольник ... надеюсь.

...