我在UIImageView's
中有多个UIView
。这些UIImageViews
已经转变。
当手势应用于UIImageView's
中的任何一个时,重叠的图像视图应该以移动到UIImageView's
帧之外的方式移位,我们可以获得图像的完整视图(全部这将以动画方式完成。)
另请注意,图像将被转换,因此我无法使用框架属性。
现在我正在使用CGRectIntersectsRect
,但它没有给我预期效果。
答案 0 :(得分:3)
经过艰苦的努力,最终我用这个算法达到了预期的效果。
我计算重叠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]; }
答案 1 :(得分:0)
我没试过这个,但我会这样做:
从CGRectIntersectsRect获取bool后,将此重叠的UIImageView x和y乘以其宽度和高度。
由于在更改变换后无法使用frame属性,因此需要将宽度和高度乘以1.5以获得最大旋转量。
警告:如果transform属性不是identity变换,那么 此属性的值未定义,因此应忽略。
这可能会移动一些视图父亲而不是其他视图,但您将确定所有视图都将移动到UIImageView的框架之外。
如果您尝试它并且它不起作用,请发布一些代码,我会帮助您。
编辑:对于他们的x,y小于你的UIImageView的x,y的视图,你需要减去偏移量。