如何使用自动布局来防止任意数量的动态创建的视图重叠

时间:2013-09-03 14:57:29

标签: ios objective-c uiview autolayout

如果未事先定义UIViews的数量,如何防止多个UIView重叠?只要满足某个填充定义,我就不在乎它们放在屏幕上的位置。

使用自动布局似乎是这样做的方法,但我做不到。

我可能需要一个循环

UIView *prevView = nil;
for (UIView *aView in [self subViews])
{
  // would really need to check foreach subview if this view isn't overlapping
  // lets assume just 2 views for simplicity
  if (CGRectIntersectsRect(aView.frame,prevView.frame))
  {
    // update the view frame
    // or update autolayout constraints
  }
}
// might need to call the function recursively if first pass wasn't successful

1 个答案:

答案 0 :(得分:1)

根据您的具体需求和需求,您可以:

  1. 创建新子视图时正确定位。如果您的子视图没有移动,您可以轻松编写一些逻辑来制作子视图的正确布局。

  2. 按照建议循环浏览子视图并重新定位每个重叠的子视图,直到它不再重叠:

    while(CGRectIntersectsRect(aView.frame, prevView.frame)){
        // Re-locate aView
        [aView setCenter: CGPointMake(arc4random_uniform(self.view.frame.size.width), arc4random_uniform(self.view.frame.size.height))];
    }
    

    下行当然是表现:有很多子视图可能需要一段时间(以及许多随机生成的数字)才能找到一个可用空间。 如果你使用它,你应该至少确保你的应用程序不会陷入无限循环

  3. 将屏幕划分为固定大小的块,并使用这些块来定位视图。例如,如果您的子视图永远不会超过50 * 50,则将屏幕划分为50 * 50的x个块。您可以使用数组跟踪这些空间。