Seem to be having a bit of an issue trying to draw my view into a context.
My basic setup is, I have a view controller that owns a UIPageViewController
in which I load controllers with views that can be drawn on by the users finger. Basically I have a book that can be drawn in.
When the page is turned in the book I save the image by calling
- (UIImage *)wholeImage {
// Render the layer into an image and return
UIGraphicsBeginImageContext(self.bounds.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *wholePageImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return wholePageImage;
}
The return value of this then gets saved to a file. However when I call this save method then line
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
gets hit, which seems to make a call to my drawRect:
method, which is overridden as follows,
- (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];
}
which makes sense, but it seems to get called recursively until eventually I get an EXC_BAD_ACCESS on this line
[self.currentImage drawAtPoint:CGPointMake(0.0f, 0.0f)];
Am at a complete loss as to what is causing this and has been driving me nuts.
If it helps, my call stack starts like this
and then goes on recursively until it finally ends with
Would really appreciate and help and insight that anyone can give!!
EDIT: (Touches moved added)
-(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];
}