KingPolygon
KingPolygon

Reputation: 4755

iOS: Cropping around a drawn path?

I'm using ACEDrawingView to draw within a view.

enter image description here

How would I detect the width and height of the drawing, so that I can crop around it, something like this:

enter image description here

Update: After @Duncan pointed me in the right direction, I was able to look through the source code and found the following:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    // save all the touches in the path
    UITouch *touch = [touches anyObject];

    previousPoint2 = previousPoint1;
    previousPoint1 = [touch previousLocationInView:self];
    currentPoint = [touch locationInView:self];

    if ([self.currentTool isKindOfClass:[ACEDrawingPenTool class]]) {
        CGRect bounds = [(ACEDrawingPenTool*)self.currentTool addPathPreviousPreviousPoint:previousPoint2 withPreviousPoint:previousPoint1 withCurrentPoint:currentPoint];

        CGRect drawBox = bounds;
        drawBox.origin.x -= self.lineWidth * 2.0;
        drawBox.origin.y -= self.lineWidth * 2.0;
        drawBox.size.width += self.lineWidth * 4.0;
        drawBox.size.height += self.lineWidth * 4.0;
        self.drawingBounds = bounds; // I added this property to allow me to extract the bounds and use it in my view controller

        [self setNeedsDisplayInRect:drawBox];
    }
    else if ([self.currentTool isKindOfClass:[ACEDrawingTextTool class]]) {
        [self resizeTextViewFrame: currentPoint];
    }
    else {
        [self.currentTool moveFromPoint:previousPoint1 toPoint:currentPoint];
        [self setNeedsDisplay];
    }

}

However I get this when I test the bounds:

enter image description here

I'm going to keep trying to figure it out, but if anyone could help that would be great!

Update 3: Using CGContextGetPathBoundingBox I was finally able to achieve it.

enter image description here

Upvotes: 0

Views: 111

Answers (2)

matt
matt

Reputation: 535247

Every time you get a touchesMoved, record the location of the point you are now drawing. When you are all done, you have all the points. Now look at the largest x value and the smallest x value and the largest y value and the smallest y value in all of those points. That's the bounding box of the drawing.

Another approach (which you've already discovered) is to save the CGPath and then call CGContextGetPathBoundingBox. Basically that does exactly the same thing.

enter image description here

Note that a path has no thickness, whereas your stroke does. You will need to inset the bounding box negatively to allow for this (my screencast doesn't do that).

Upvotes: 1

Duncan C
Duncan C

Reputation: 131426

I'm not familiar with the AceDrawingView class. I can tell you how to do it with iOS frameworks though:

Create your path as a UIBezierPath.

Interrogate the bounds property of the path.

Upvotes: 1

Related Questions