De hecho, es posible tener el objeto CGContextRef reutilizable después de que se haya establecido en el método drawRect. El punto es que necesita empujar el Contexto a la pila antes de usarlo desde cualquier lugar. De lo contrario, el contexto actual será 0x0
1. Añadir
@interface RenderView : UIView {
CGContextRef visualContext;
BOOL renderFirst;
}
2. En su conjunto @implementation primera renderFirst en TRUE antes vista ha aparecido en la pantalla, entonces:
-(void) drawRect:(CGRect) rect {
if (renderFirst) {
visualContext = UIGraphicsGetCurrentContext();
renderFirst = FALSE;
}
}
3 Presentar algo al contexto después de establecer el contexto.
-(void) renderSomethingToRect:(CGRect) rect {
UIGraphicsPushContext(visualContext);
// For instance
UIGraphicsPushContext(visualContext);
CGContextSetRGBFillColor(visualContext, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(visualContext, rect);
}
Aquí hay un ejemplo que coinciden exactamente con el caso de rosca:
- (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();
}
y dibujo de imagen a partir del contexto que se ha hecho antes en este post:
-(void) drawImageOnContext: (CGImageRef) someIm onPosition: (CGPoint) aPos {
UIGraphicsPushContext(visualContext);
CGContextDrawImage(visualContext, CGRectMake(aPos.x,
aPos.y, someIm.size.width,
someIm.size.height), someIm.CGImage);
}
no hacer llama a la función UIGraphicsPopContext() hasta que necesites el contexto para renderizar tus objetos.
Parece que CGContextRef se elimina automáticamente de la parte superior de la pila de gráficos cuando finaliza el método de llamada.
De todos modos, este ejemplo parece ser un tipo de Hack, no planeado y propuesto por Apple. La solución es muy inestable y solo funciona con llamadas a mensajes de método directo dentro de una sola UIView que se encuentra en la parte superior de la pantalla. En el caso de llamadas "performselection", Context no genera ningún resultado en la pantalla. Por lo tanto, sugiero usar CALayer como una representación para el objetivo de la pantalla en lugar del uso directo del contexto gráfico.
Espero que ayude.
Sí, ¡esta pregunta ya ha sido respondida varias veces en Stack Overflow! – borrrden
Todavía no estoy seguro de lo que lo está causando, pero usé el PDF de otra persona para crear clases de imagen aquí y eso lo solucionó. También usa UIGraphicsGetCurrentContext sin que esté en drawRect, y funciona bien allí. –
@borrrden ¿Podrían darme algunos enlaces a las preguntas similares? – allenlinli