【问题标题】:Check for overlapping views after transform转换后检查重叠视图
【发布时间】:2012-05-16 07:51:32
【问题描述】:

我在一个UIView 中有多个UIImageView's。这些UIImageViews 已被转换。

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

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

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

【问题讨论】:

    标签: objective-c ios frame cgrect


    【解决方案1】:

    经过一番苦苦挣扎,终于用这个算法达到了预期的效果。

    • 我计算重叠UIImageView's 的列表并将其存储在一个数组中。 我为此使用CGRectIntersectsRect

      注意:这还将包括应用手势的UIImageView(比如目标 ImageView)。

    • 对于每个重叠的 UIImageView,我执行以下步骤:

      1) 计算重叠的ImageView和target的夹角 图像视图。这将为我提供移动 Overlapping 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];
          }
      

    【讨论】:

      【解决方案2】:

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

      从 CGRectIntersectsRect 得到 bool 后,将这个重叠的 UIImageView x 和 y 乘以它的宽度和高度。

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

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

      这可能会移动某些视图父级,但您可以确定所有视图都将移到 UIImageView 的框架之外。

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

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

      【讨论】:

      • 感谢@iBasel。我没有尝试过,但即使这样也应该有效,看起来如此。我通过使用另一种算法获得了结果。已将其与代码一起发布在下面。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多