Ответ 1
В самом деле, возможно, что объект CGContextRef можно повторно использовать после того, как он был установлен в методе drawRect.
Дело в том, что перед тем, как использовать его из любого места, вам нужно нажать контекст в стек. В противном случае текущий контекст будет 0x0
1. Добавьте
@interface RenderView : UIView {
CGContextRef visualContext;
BOOL renderFirst;
}
2. В вашей @implementation сначала установите renderFirst на TRUE, прежде чем вид появится на экране, затем:
-(void) drawRect:(CGRect) rect {
if (renderFirst) {
visualContext = UIGraphicsGetCurrentContext();
renderFirst = FALSE;
}
}
3. Оказание чего-то в контексте после контекста.
-(void) renderSomethingToRect:(CGRect) rect {
UIGraphicsPushContext(visualContext);
// For instance
UIGraphicsPushContext(visualContext);
CGContextSetRGBFillColor(visualContext, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(visualContext, rect);
}
Вот пример, точно соответствующий случаю потока:
- (void) drawImage: (CGImageRef) img inRect: (CGRect) aRect {
UIGraphicsBeginImageContextWithOptions(aRect.size, NO, 0.0);
visualContext = UIGraphicsGetCurrentContext();
CGContextConcatCTM(visualContext, CGAffineTransformMakeTranslation(-aRect.origin.x, -aRect.origin.y));
CGContextClipToRect(visualContext, aRect);
CGContextDrawImage(visualContext, aRect, img);
// this can be used for drawing image on CALayer
self.layer.contents = (__bridge id) img;
[CATransaction flush];
UIGraphicsEndImageContext();
}
И Рисование изображения из контекста, который был сделан ранее в этом сообщении:
-(void) drawImageOnContext: (CGImageRef) someIm onPosition: (CGPoint) aPos {
UIGraphicsPushContext(visualContext);
CGContextDrawImage(visualContext, CGRectMake(aPos.x,
aPos.y, someIm.size.width,
someIm.size.height), someIm.CGImage);
}
Не вызывайте функцию UIGraphicsPopContext(), пока вам не понадобится контекст для рендеринга ваших объектов.
Кажется, что CGContextRef автоматически удаляется из верхней части графического стека, когда заканчивается метод вызова.
Во всяком случае, этот пример кажется своего рода хаком - не запланированным и предложенным Apple. Решение очень неустойчиво и работает только с прямыми вызовами сообщений метода внутри только одного UIView, который находится в верхней части экрана. В случае вызовов "performselection" Context не дает никаких результатов на экране. Поэтому я предлагаю использовать CALayer как рендеринг для целевой страницы экрана вместо прямого использования графического контекста.
Надеюсь, что это поможет.