drawRect: / renderInContext: problemy
Wydaje się, że mam trochę problemów, próbując narysować mój pogląd na kontekst.
Moja podstawowa konfiguracja to kontroler widoku, który jest właścicielemUIPageViewController
w którym ładuję kontrolery z widokami, które mogą być narysowane przez palec użytkownika. Zasadniczo mam książkę, którą można narysować.
Gdy strona zostanie odwrócona w książce, zapisuję obraz dzwoniąc
<code>- (UIImage *)wholeImage { // Render the layer into an image and return UIGraphicsBeginImageContext(self.bounds.size); [self.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *wholePageImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return wholePageImage; } </code>
Zwracana wartość tego zostaje następnie zapisana w pliku. Jednak gdy wywołam tę metodę składowania, to linia
<code>[self.layer renderInContext:UIGraphicsGetCurrentContext()]; </code>
zostaje trafiony, co wydaje się dzwonić do mojegodrawRect:
metoda, która jest nadpisywana w następujący sposób
<code>- (void)drawRect:(CGRect)rect { // Draw the current state of the image [self.currentImage drawAtPoint:CGPointMake(0.0f, 0.0f)]; CGPoint midPoint1 = [self midPointOfPoint1:previousPoint1 point2:previousPoint2]; CGPoint midPoint2 = [self midPointOfPoint1:currentPoint point2:previousPoint1]; // Get the context CGContextRef context = UIGraphicsGetCurrentContext(); // Add the new bit of line to the image [self.layer renderInContext:context]; CGContextMoveToPoint(context, midPoint1.x, midPoint1.y); CGContextAddQuadCurveToPoint(context, previousPoint1.x, previousPoint1.y, midPoint2.x, midPoint2.y); CGContextSetLineCap(context, kCGLineCapRound); CGContextSetLineWidth(context, self.lineWidth); if (self.drawMode == LNDrawViewDrawModeTipex) CGContextSetBlendMode(context, kCGBlendModeClear); else CGContextSetBlendMode(context, kCGBlendModeCopy); CGContextSetStrokeColorWithColor(context, self.lineColour.CGColor); CGContextStrokePath(context); // Call super [super drawRect:rect]; } </code>
co ma sens, ale wydaje się, że jest wywoływane rekurencyjnie, aż w końcu otrzymam EXC_BAD_ACCESS w tej linii
<code>[self.currentImage drawAtPoint:CGPointMake(0.0f, 0.0f)]; </code>
Jestem w całkowitej stracie co do tego, co to powoduje i doprowadza mnie do szału.
Jeśli to pomoże, mój stos wywołań zaczyna się tak
a następnie przechodzi rekurencyjnie, aż w końcu się skończy
Naprawdę doceniłbym i pomoc i wgląd, że każdy może dać !!
EDYCJA: (Dodano dotknięte przeniesione)
<code>-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { // Get the touch UITouch *touch = [touches anyObject]; // Get the points previousPoint2 = previousPoint1; previousPoint1 = [touch previousLocationInView:self]; currentPoint = [touch locationInView:self]; // Calculate mid point CGPoint mid1 = [self midPointOfPoint1:previousPoint1 point2:previousPoint2]; CGPoint mid2 = [self midPointOfPoint1:currentPoint point2:previousPoint1]; // Create a path for the last few points CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path, NULL, mid1.x, mid1.y); CGPathAddQuadCurveToPoint(path, NULL, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y); CGRect pathBounds = CGPathGetBoundingBox(path); CGPathRelease(path); // Take account of line width pathBounds.origin.x -= self.lineWidth * 2.0f; pathBounds.origin.y -= self.lineWidth * 2.0f; pathBounds.size.width += self.lineWidth * 4.0f; pathBounds.size.height += self.lineWidth * 4.0f; UIGraphicsBeginImageContext(pathBounds.size); [self.layer renderInContext:UIGraphicsGetCurrentContext()]; self.currentImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); [self setNeedsDisplayInRect:pathBounds]; </code>
}