转换后检查重叠视图

时间:2012-05-16 07:51:33

标签: objective-c ios frame cgrect

我在UIImageView's中有多个UIView。这些UIImageViews已经转变。

当手势应用于UIImageView's中的任何一个时,重叠的图像视图应该以移动到UIImageView's帧之外的方式移位,我们可以获得图像的完整视图(全部这将以动画方式完成。)

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

现在我正在使用CGRectIntersectsRect,但它没有给我预期效果。

2 个答案:

答案 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的视图,你需要减去偏移量。