Кажется, у меня возникли проблемы с попыткой поместить мою точку зрения в контекст.
Моя базовая настройка такова: у меня есть контроллер представления, которому принадлежит UIPageViewController
, в который я загружаю контроллеры с представлениями, которые могут быть нарисованы пальцем пользователя. В общем, у меня есть книга, в которой можно рисовать.
Когда страница переворачивается в книге, я сохраняю изображение, вызывая
- (UIImage *)wholeImage {
// Render the layer into an image and return
UIGraphicsBeginImageContext(self.bounds.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *wholePageImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return wholePageImage;
}
Возвращаемое значение этого затем сохраняется в файл. Однако, когда я вызываю этот метод сохранения, тогда строка
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
получает удар, который, кажется, вызывает мой метод drawRect:
, который переопределяется следующим образом:
- (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];
}
что имеет смысл, но, похоже, он вызывается рекурсивно, пока в конце концов я не получу EXC_BAD_ACCESS в этой строке
[self.currentImage drawAtPoint:CGPointMake(0.0f, 0.0f)];
Я в полной растерянности относительно того, что вызывает это и сводило меня с ума.
Если это поможет, мой стек вызовов начинается так
а затем продолжается рекурсивно, пока, наконец, не закончится
Был бы очень признателен за помощь и понимание, которое может дать каждый!
РЕДАКТИРОВАТЬ: (добавлено добавление касаний)
-(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];
}