在不同位置创建20个UIViews而不重叠

时间:2014-01-28 17:48:03

标签: ios objective-c uiview

抱歉,我的英语不太好。 我尝试在屏幕上创建20个具有固定高度和宽度但位置不同的UIViews。

for( int i = 0; i < 20; i++ ) {

    UIView *view = [[UIView alloc]init];
    view.backgroundColor = [UIColor redColor];
    view.tag = i;

    randomX = fmod(arc4random(),((int)self.view.frame.size.width - view.frame.size.width));
    randomY = fmod(arc4random(),((int)self.view.frame.size.height - view.frame.size.height));
    view.frame = CGRectMake(randomX, randomY, 100, 100);

这只是我计划的一部分。 如果我这样做,uiviews会在屏幕上创建,但它们重叠。 我知道有一个像CGRectIntersectRect这样的函数,但我不知道它在这种情况下是如何正常工作的。 有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

这里有一小段代码,没有真正经过测试,但我认为它会起作用(我认为理论上它可以永远运行,但实际上需要一瞬间:-)) -

NSMutableArray *views = [NSMutableArray array];
for( int i = 0; i < 20; i++ )
{
    UIView *view = [[UIView alloc]init];
    view.backgroundColor = [UIColor redColor];
    view.tag = i;

    __block BOOL ok = YES;

    do
    {
        CGFloat randomX = fmod(arc4random(),((int)self.view.frame.size.width - view.frame.size.width));
        CGFloat randomY = fmod(arc4random(),((int)self.view.frame.size.height - view.frame.size.height));

        view.frame = CGRectMake(randomX, randomY, 100, 100);

        [views enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
         {
             CGRect rect1 = ((UIView *)obj).frame;
             CGRect rect2 = view.frame;

             if (CGRectIntersectsRect(rect1, rect2))
             {
                 ok = NO;
                 *stop = YES;
             }
             else
                 ok = YES;
         }];
    }
    while (!ok);

    [self.view addSubview:view];
    [views addObject:view];
}