Имейте CALayer со многими подслоями.Когда setNeedsDisplay вызывается на подслое, я получаю неверную контекстную ошибку - PullRequest
3 голосов
/ 17 июля 2011

Я просто переписал свою игру, чтобы использовать базовую анимацию, чтобы сделать ее быстрее.У меня есть UIView со слоем, который содержит много подслоев (игра «плитки»).Подслои листов на самом деле являются подклассами CALayer, которые рисуют свой собственный контент, используя drawInContext:.Например, когда плитка выбрана, ее нужно перерисовать, поэтому я вызываю [tileLayer setNeedsDisplay] и получаю кучу недопустимых ошибок контекста.Если я звоню [mainView setNeedsDisplay] или [mainView.layer setNeedsDisplay], ни одна из плиток не перерисовывается.Как я могу заставить отдельную плитку (подкласс CALayer) перерисовывать?

EDIT: Из очень полезных комментариев я смог выяснить, что это происходит только тогда, когда подкласс CALayer рисуеткартинка.Вот ошибки:

<Error>: CGContextSaveGState: invalid context 0x0
<Error>: CGContextSetBlendMode: invalid context 0x0
<Error>: CGContextSetAlpha: invalid context 0x0
<Error>: CGContextTranslateCTM: invalid context 0x0
<Error>: CGContextScaleCTM: invalid context 0x0
<Error>: CGContextDrawImage: invalid context 0x0
<Error>: CGContextRestoreGState: invalid context 0x0

Вот строка кода, которая вызывает ошибки:

[[UIImage imageNamed:@"flag.png"] drawInRect:self.bounds];

Есть ли другой способ рисования изображения в подклассе CALayer?

1 Ответ

5 голосов
/ 15 августа 2011

Core Animation не знает о UIKit, т.е. drawInContext: не устанавливает контекст CALayer в качестве текущего контекста UIKit. Метод drawInRect: в UIImage рисует изображение в этом текущем контексте. Чтобы вручную передать контекст в UIKit, используйте UIGraphicsPushContext() и вытолкните его, используя UIGraphicsPopContext(), когда закончите.

Например:

UIGraphicsPushContext(context);
[[UIImage imageNamed:@"flag.png"] drawInRect:self.bounds];
UIGraphicsPopContext();
...