前提:我正在构建一个裁剪工具,可以处理双指任意旋转的图像以及任意裁剪。
有时图像最终会以插入空白空间的方式旋转,以填充旋转图像和裁剪矩形之间的间隙(参见下面的示例)。
我需要确保图像视图在旋转时完全适合裁剪矩形。如果它没有,我就需要重新转换图像(缩放它),使其适合裁剪范围。
使用this answer,我已经实现了检查旋转的UIImageView是否与裁剪CGRect相交的功能,但不幸的是,它并没有告诉我裁剪矩是否完全< / strong>包含在旋转的imageview中。希望我能对这个答案做一些简单的修改吗?
OK的可视化示例:
并且不行,我需要检测和处理的内容:
更新:不工作方法
- (BOOL)rotatedView:(UIView*)rotatedView containsViewCompletely:(UIView*)containedView {
CGRect rotatedBounds = rotatedView.bounds;
CGPoint polyContainedView[4];
polyContainedView[0] = [containedView convertPoint:rotatedBounds.origin toView:rotatedView];
polyContainedView[1] = [containedView convertPoint:CGPointMake(rotatedBounds.origin.x + rotatedBounds.size.width, rotatedBounds.origin.y) toView:rotatedView];
polyContainedView[2] = [containedView convertPoint:CGPointMake(rotatedBounds.origin.x + rotatedBounds.size.width, rotatedBounds.origin.y + rotatedBounds.size.height) toView:rotatedView];
polyContainedView[3] = [containedView convertPoint:CGPointMake(rotatedBounds.origin.x, rotatedBounds.origin.y + rotatedBounds.size.height) toView:rotatedView];
if (CGRectContainsPoint(rotatedView.bounds, polyContainedView[0]) &&
CGRectContainsPoint(rotatedView.bounds, polyContainedView[1]) &&
CGRectContainsPoint(rotatedView.bounds, polyContainedView[2]) &&
CGRectContainsPoint(rotatedView.bounds, polyContainedView[3]))
return YES;
else
return NO;
}
答案 0 :(得分:3)
这比检查交集更容易(如在引用的线程中)。
(旋转)图像视图是凸四边形。因此,检查就足够了 裁剪矩形的所有4个角点都在旋转的图像视图中。
[cropView convertPoint:point toView:imageView]
将裁剪矩形的角点转换为坐标系
(旋转)图像视图。CGRectContainsPoint()
检查4个转换的角点是否在图像视图的bounds
矩形内。示例代码:
- (BOOL)rotatedView:(UIView *)rotatedView containsCompletely:(UIView *)cropView {
CGPoint cropRotated[4];
CGRect rotatedBounds = rotatedView.bounds;
CGRect cropBounds = cropView.bounds;
// Convert corner points of cropView to the coordinate system of rotatedView:
cropRotated[0] = [cropView convertPoint:cropBounds.origin toView:rotatedView];
cropRotated[1] = [cropView convertPoint:CGPointMake(cropBounds.origin.x + cropBounds.size.width, cropBounds.origin.y) toView:rotatedView];
cropRotated[2] = [cropView convertPoint:CGPointMake(cropBounds.origin.x + cropBounds.size.width, cropBounds.origin.y + cropBounds.size.height) toView:rotatedView];
cropRotated[3] = [cropView convertPoint:CGPointMake(cropBounds.origin.x, cropBounds.origin.y + cropBounds.size.height) toView:rotatedView];
// Check if all converted points are within the bounds of rotatedView:
return (CGRectContainsPoint(rotatedBounds, cropRotated[0]) &&
CGRectContainsPoint(rotatedBounds, cropRotated[1]) &&
CGRectContainsPoint(rotatedBounds, cropRotated[2]) &&
CGRectContainsPoint(rotatedBounds, cropRotated[3]));
}