我有一个UIScrollView
,其中包含许多不同尺寸的可拖动UIViews
,大多数是正方形。这些UIViews
与屏幕上的6列网格对齐。
当UIView
(让其说它的大小为132x132)捕捉到位置而另一个UIView's
帧与第一个UIView
帧相交时,第二个应该移动低于第一个UIView
的高度(取决于UIViews
相交的位置)。我使用CGRectIntersectsRect
以及CGRectGetMaXY
和CGRectGetMinY
来计算所需的移动距离。
但是,也可能需要移动已经受影响的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
移动不正确,或者根本无法移动它们。
以下是一个例子:
137 137; 132 132
0 0; 132 132
UIView
的UIView C,它会卡入0 137; 269 132
当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之间。
这是另一个例子:
0 274; 269 269
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之前。
答案 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的新位置而移动的所有视图,并检查是否因为 >而无法移动任何尚未移动的视图查看新职位。等等...
- 编辑 -
经过反思,我认为你不需要跟踪访问过的观点。我更新了算法以删除该步骤。