4

UIImageView's在一个UIView. 这些UIImageViews都被改造了。

当手势应用于任何一个UIImageView's重叠的 imageView 时,应该以这样的方式移动,即移出UIImageView's框架,我们可以看到图像的完整视图(所有这些都将以动画方式完成)。

另请注意,图像将被转换,因此我将无法使用框架属性。

现在我正在使用CGRectIntersectsRect,但它没有给我想要的效果。

4

2 回答 2

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];
        }
    
于 2012-05-17T10:33:30.320 回答
0

我没有尝试过,但我会这样做:

从 CGRectIntersectsRect 获取 bool 后,将重叠的 UIImageView x 和 y 乘以它的宽度和高度。

并且由于您在更改转换后无法使用 frame 属性,因此您需要将宽度和高度乘以 1.5 以获得最大旋转量。

警告:如果变换属性不是恒等变换,则此属性的值未定义,因此应被忽略。

这可能会移动一些视图父亲而不是其他视图,但您会确定所有视图都将移到 UIImageView 的框架之外。

如果您尝试它但它不起作用,请发布一些代码,我会帮助您。

编辑:对于 x,y 小于 UIImageView 的 x,y 的视图,您需要减去偏移量。

于 2012-05-16T14:13:22.453 回答