确定裁剪矩形是否完全包含在旋转的UIView中

前提:我正在构建一个裁剪工具,可以处理双指任意旋转的图像以及任意裁剪。

有时,图像最终会以插入空白空间的方式旋转,以填充旋转图像和裁剪矩形之间的间隙(请参阅下面的示例)。

我需要确保图像视图在旋转时完全适合裁剪矩形。 如果没有,我需要重新转换图像(缩放),使其适合裁剪边界。

使用这个答案 ,我已经实现了检查旋转的UIImageView是否与裁剪CGRect相交的function,但不幸的是,这并没有告诉我裁剪矩是否完全包含在旋转的imageview中。 希望我能对这个答案做一些简单的修改?

确定的可视示例:

在此处输入图像描述

并且不行,我需要检测和处理的内容:

在此处输入图像描述

更新:不工作的方法

- (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; } 

这应该比检查交集更容易(如在引用的线程中)。

(旋转的)图像视图是四边形。 因此,只需检查裁剪矩形的所有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])); }