Rzeczywiście istnieje możliwość ponownego użycia obiektu CGContextRef po jego ustawieniu w metodzie drawRect. Chodzi o to, że musisz przenieść kontekst do stosu, zanim użyjesz go z dowolnego miejsca. W przeciwnym razie, aktualny kontekst będzie 0x0
1. Dodaj
@interface RenderView : UIView {
CGContextRef visualContext;
BOOL renderFirst;
}
2. W swojej @implementation najpierw ustawić renderFirst TRUE przed pogląd pojawił się na ekranie, a następnie:
-(void) drawRect:(CGRect) rect {
if (renderFirst) {
visualContext = UIGraphicsGetCurrentContext();
renderFirst = FALSE;
}
}
3 Rendering Coś do kontekstu po ustawieniu kontekstu.
-(void) renderSomethingToRect:(CGRect) rect {
UIGraphicsPushContext(visualContext);
// For instance
UIGraphicsPushContext(visualContext);
CGContextSetRGBFillColor(visualContext, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(visualContext, rect);
}
Oto przykład dokładnie dopasowane sprawy Temat:
- (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();
}
i rysunek obraz z kontekstu, która została podjęta wcześniej w tym poście:
-(void) drawImageOnContext: (CGImageRef) someIm onPosition: (CGPoint) aPos {
UIGraphicsPushContext(visualContext);
CGContextDrawImage(visualContext, CGRectMake(aPos.x,
aPos.y, someIm.size.width,
someIm.size.height), someIm.CGImage);
}
Nie wywołuj funkcję UIGraphicsPopContext(), dopóki nie potrzebujesz kontekstu do renderowania twoich obiektów.
Wygląda na to, że CGContextRef jest automatycznie usuwany z góry stosu graficznego po zakończeniu wywołania metody.
W każdym razie, ten przykład wydaje się być rodzajem Hack - nie planowanym i proponowanym przez Apple. Rozwiązanie jest bardzo niestabilne i działa tylko z bezpośrednimi wywołaniami metod w obrębie tylko jednego interfejsu UIView znajdującego się na górze ekranu. W przypadku wywołań "performselection", Kontekst nie wyświetla żadnych wyników na ekranie. Sugeruję więc używanie CALayera jako renderowania do celu ekranowego zamiast bezpośredniego użycia kontekstu graficznego.
Mam nadzieję, że to pomaga.
Tak, to pytanie zostało już kilkakrotnie odebrane na Stack Overflow! – borrrden
Nadal nie jestem pewien, co jest przyczyną tego problemu, ale użyłem cudzego pliku PDF do tworzenia klas zdjęć tutaj i to naprawiło. Również używa UIGraphicsGetCurrentContext bez tego, że jest w drawRect, i działa tam dobrze. –
@borrrden Czy możesz podać mi linki do podobnych pytań? – allenlinli