drawRect: / renderInContext: проблемы
Кажется, у меня возникли некоторые проблемы, пытаясь привлечь мое мнение в контекст.
Моя основная настройка, у меня есть контроллер представления, который владеетUIPageViewController
в котором я загружаю контроллеры с представлениями, которые могут быть нарисованы пальцем пользователя. По сути, у меня есть книга, которую можно нарисовать.
Когда страница переворачивается в книге, я сохраняю изображение, вызывая
<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>
Возвращаемое значение затем сохраняется в файл. Однако, когда я вызываю этот метод сохранения, то строка
<code>[self.layer renderInContext:UIGraphicsGetCurrentContext()]; </code>
получает удар, который, кажется, звонит моемуdrawRect:
метод, который переопределяется следующим образом,
<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>
это имеет смысл, но, кажется, вызывается рекурсивно, пока в конце концов я не получу EXC_BAD_ACCESS в этой строке
<code>[self.currentImage drawAtPoint:CGPointMake(0.0f, 0.0f)]; </code>
Я в полной растерянности относительно того, что вызывает это и сводит меня с ума.
Если это поможет, мой стек вызовов начинается следующим образом
и затем продолжается рекурсивно, пока, наконец, не заканчивается
Был бы очень признателен и помочь и понимание, что каждый может дать !!
РЕДАКТИРОВАТЬ: (штрихи добавлены)
<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>
}