通过在他们上面移动另一个UIView来获取所有UIViews

时间:2017-05-06 22:04:40

标签: ios objective-c iphone uiview

我有一个UIScrollView,其中包含许多不同尺寸的可拖动UIViews,大多数是正方形。这些UIViews与屏幕上的6列网格对齐。

UIView(让其说它的大小为132x132)捕捉到位置而另一个UIView's帧与第一个UIView帧相交时,第二个应该移动低于第一个UIView的高度(取决于UIViews相交的位置)。我使用CGRectIntersectsRect以及CGRectGetMaXYCGRectGetMinY来计算所需的移动距离。

但是,也可能需要移动已经受影响的UIView的第三个甚至更多UIViews。我的问题在于我无法

a)以正确的顺序(按其Y原点排序)以受影响的UIViews(不是快照UIView)下方的所有受影响的UIView发货 b)仅基于UIViews上方的UIView移动UIView,而不会受到卡入到位的UIView的影响(即使移动距离可能相同)。

我目前的尝试是在捕捉后将一个UIView与移动的UIView相交,将UIViews和所需的移动距离作为字典添加到数组中,然后添加使用递归在它下面的其他UIViews。但有时,由于0 0; 269 132在视图层次结构中的顺序,0 205.5; 63.5 63.5移动不正确,或者根本无法移动它们。

以下是一个例子:

  • UIView A with frame = 137 137; 132 132
  • UIView B,框架= 0 0; 132 132
  • 带框架= UIView的UIView C,它会卡入0 137; 269 132
  • 边框间距为5像素

UIView C卡入到位时,UIView A应该移动到UIView,因为所需的移动距离是UIView C +边界间距的全高。但是将0 274; 63.5 63.5 A移动到新位置也会影响UIView B,然后移动到UIView,高度为0 0; 269 132 A +边框间距的一半,从而移除空间在0 205.5; 63.5 63.5 A和B之间。

这是另一个例子:

  • UIView A with frame = 0 274; 269 269
  • UIView B,框架= 0 68.5; 269 269
  • 带框架= UIView的UIView C,它会卡入0 274; 269 132

UIView C移动到位时,UIView A会移至0 411; 63.5 63.5,然后影响UIView B并将其移至MainActivity,移除bottomNav之间的空间{1}} A和B之前。

1 个答案:

答案 0 :(得分:0)

您可能需要设置先进先出的堆栈。该算法看起来像这样(无效的Obj-C代码!):

move viewC
[stack addObject: viewC]
while stack.isEmpty == false {
    current = stack[0]
    remove current from stack
    for view in allViews {
        if view != current and view needs to move because of current's position {
            [stack addObject: view]
            move view to correct position
        }
    }
}

上面将首先将viewC移动到新位置,然后扫描除viewC之外的所有视图,并在必要时将它们从viewC下移出。移动的每个视图都将添加到堆栈中。

然后它会查看由于viewC的新位置而移动的所有视图,并检查是否因为 而无法移动任何尚未移动的视图查看新职位。等等...

- 编辑 -

经过反思,我认为你不需要跟踪访问过的观点。我更新了算法以删除该步骤。