iOS:围绕绘制的路径裁剪?
iOS: Cropping around a drawn path?
我正在使用 ACEDrawingView 在视图中绘图。
我如何检测绘图的宽度和高度,以便我可以围绕它进行裁剪,如下所示:
更新: @Duncan 指出正确的方向后,我能够查看源代码并找到以下内容:
- (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];
}
}
但是当我测试边界时我得到了这个:
我会继续努力弄清楚,但如果有人能提供帮助那就太好了!
更新 3: 使用 CGContextGetPathBoundingBox 我终于实现了它。
我不熟悉 AceDrawingView class。不过,我可以告诉您如何使用 iOS 框架:
将您的路径创建为 UIBezierPath。
询问路径的边界 属性。
每得到一个touchesMoved
,记录下你现在画的点的位置。当你全部完成后,你就拥有了所有的分数。现在查看所有这些点中的最大 x 值和最小 x 值以及最大 y 值和最小 y 值。那是绘图的边界框。
另一种方法(您已经发现)是保存 CGPath,然后调用 CGContextGetPathBoundingBox。基本上这完全一样。
请注意,路径没有厚度,而笔划有。您需要负向插入边界框以允许这样做(我的截屏视频没有这样做)。
我正在使用 ACEDrawingView 在视图中绘图。
我如何检测绘图的宽度和高度,以便我可以围绕它进行裁剪,如下所示:
更新: @Duncan 指出正确的方向后,我能够查看源代码并找到以下内容:
- (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];
}
}
但是当我测试边界时我得到了这个:
我会继续努力弄清楚,但如果有人能提供帮助那就太好了!
更新 3: 使用 CGContextGetPathBoundingBox 我终于实现了它。
我不熟悉 AceDrawingView class。不过,我可以告诉您如何使用 iOS 框架:
将您的路径创建为 UIBezierPath。
询问路径的边界 属性。
每得到一个touchesMoved
,记录下你现在画的点的位置。当你全部完成后,你就拥有了所有的分数。现在查看所有这些点中的最大 x 值和最小 x 值以及最大 y 值和最小 y 值。那是绘图的边界框。
另一种方法(您已经发现)是保存 CGPath,然后调用 CGContextGetPathBoundingBox。基本上这完全一样。
请注意,路径没有厚度,而笔划有。您需要负向插入边界框以允许这样做(我的截屏视频没有这样做)。