如果未事先定义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
答案 0 :(得分:1)
根据您的具体需求和需求,您可以:
创建新子视图时正确定位。如果您的子视图没有移动,您可以轻松编写一些逻辑来制作子视图的正确布局。
按照建议循环浏览子视图并重新定位每个重叠的子视图,直到它不再重叠:
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))];
}
下行当然是表现:有很多子视图可能需要一段时间(以及许多随机生成的数字)才能找到一个可用空间。 如果你使用它,你应该至少确保你的应用程序不会陷入无限循环。
将屏幕划分为固定大小的块,并使用这些块来定位视图。例如,如果您的子视图永远不会超过50 * 50,则将屏幕划分为50 * 50的x个块。您可以使用数组跟踪这些空间。