4

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

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

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

使用这个答案,我实现了检查旋转的 UIImageView 是否与裁剪 CGRect 相交的能力,但不幸的是,这并不能告诉我裁剪矩形是否完全包含在旋转的 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;
}
4

1 回答 1

4

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

(旋转的)图像视图是一个四边形。因此,检查裁剪矩形的所有 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]));
}
于 2014-11-08T20:58:53.687 回答