我UIImageView's
在一个UIView
. 这些UIImageViews
都被改造了。
当手势应用于任何一个UIImageView's
重叠的 imageView 时,应该以这样的方式移动,即移出UIImageView's
框架,我们可以看到图像的完整视图(所有这些都将以动画方式完成)。
另请注意,图像将被转换,因此我将无法使用框架属性。
现在我正在使用CGRectIntersectsRect
,但它没有给我想要的效果。
我UIImageView's
在一个UIView
. 这些UIImageViews
都被改造了。
当手势应用于任何一个UIImageView's
重叠的 imageView 时,应该以这样的方式移动,即移出UIImageView's
框架,我们可以看到图像的完整视图(所有这些都将以动画方式完成)。
另请注意,图像将被转换,因此我将无法使用框架属性。
现在我正在使用CGRectIntersectsRect
,但它没有给我想要的效果。
经过一番苦苦挣扎,我终于用这个算法达到了预期的效果。
我计算重叠列表UIImageView's
并将其存储在一个数组中。我正在使用CGRectIntersectsRect
这个。
注意:这还将包括UIImageView
应用手势的对象(比如目标 ImageView)。
对于每个重叠的 UIImageView,我执行以下步骤:
1)计算重叠的ImageView与目标ImageView的夹角。这将为我提供移动重叠 ImageView 的方向。
2) 现在将重叠的 ImageView 移动一些恒定的距离(比如 len),使其保持相同的角度。方向应使其远离目标 ImageView。
3) 您可以使用 Sin/Cos 函数计算新的 x,y 坐标。
x = start_x + len * cos(角度);
y = start_y + len * sin(角度);
注意:对于中心小于目标 ImageView 中心的 ImageView,您需要减去该值。
4) 现在将重叠的 ImageView 移动到新的计算中心。
5) 继续移动它,直到视图不再相交。
我附上我的代码。我希望它有所帮助。
-(void)moveImage:(UIImageView *)viewToMove fromView:(UIImageView *)imageToSendBack
{CGFloat angle = angleBetweenLines(viewToMove.center, imageToSendBack.center); CGFloat extraSpace = 50; CGRect oldBounds = viewToMove.bounds; CGPoint oldCenter = viewToMove.center; CGPoint shiftedCenter; while(CGRectIntersectsRect(viewToMove.frame,imageToSendBack.frame)) { CGPoint startPoint = viewToMove.center; shiftedCenter.x = startPoint.x - (extraSpace * cos(angle)); if(imageToSendBack.center.y < viewToMove.center.y) shiftedCenter.y = startPoint.y + extraSpace * sin(angle); else shiftedCenter.y = startPoint.y - extraSpace * sin(angle); viewToMove.center = shiftedCenter; } viewToMove.bounds = oldBounds; viewToMove.center = oldCenter; [self moveImageAnimationBegin:viewToMove toNewCenter:shiftedCenter]; }
我没有尝试过,但我会这样做:
从 CGRectIntersectsRect 获取 bool 后,将重叠的 UIImageView x 和 y 乘以它的宽度和高度。
并且由于您在更改转换后无法使用 frame 属性,因此您需要将宽度和高度乘以 1.5 以获得最大旋转量。
警告:如果变换属性不是恒等变换,则此属性的值未定义,因此应被忽略。
这可能会移动一些视图父亲而不是其他视图,但您会确定所有视图都将移到 UIImageView 的框架之外。
如果您尝试它但它不起作用,请发布一些代码,我会帮助您。
编辑:对于 x,y 小于 UIImageView 的 x,y 的视图,您需要减去偏移量。