gpt4 book ai didi

ios - 确定 crop rect 是否完全包含在旋转的 UIView 中

转载 作者:可可西里 更新时间:2023-11-01 05:44:07 26 4
gpt4 key购买 nike

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

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

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

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

OK 的视觉示例:

enter image description here

但不是 OK,我需要检测和处理的是:

enter image description here

更新:无效方法

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

最佳答案

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

(旋转的) ImageView 是一个四边形。因此检查就足够了裁剪矩形的所有 4 个角点都在旋转的 ImageView 内。

  • 使用[cropView convertPoint:point toView:imageView]将裁剪矩形的角点转换为坐标系(旋转) ImageView 。
  • 使用 CGRectContainsPoint() 检查 4 个转换角点是否在 ImageView 的 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]));
}

关于ios - 确定 crop rect 是否完全包含在旋转的 UIView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26821725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com