1

如果事先未定义 UIView 的数量,如何防止多个 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
4

1 回答 1

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 个块。您可以使用数组跟踪这些空间。

于 2013-09-03T18:11:14.650 回答