在随机位置用按钮填充视图

时间:2014-04-05 02:19:35

标签: ios iphone objective-c

我想用按钮(UIView)填充区域(UIButton),这样它们就不会相互交叉。

我的想法:

  • 在视图中的随机位置创建初始按钮;
  • 使用初始按钮(计数< 20)中的其他按钮填充视图,它们不相交〜相距10个像素。

到目前为止我做了什么:

我创建了方法:

-(void)generateButtonsForView:(UIView *)view buttonCount:(int)count
{
//get size of main view
    float viewWidth = view.frame.size.width;
    float viewHeight = view.frame.size.height;

    //set button at random position
    UIButton *initialButton = [[UIButton alloc] initWithFrame:CGRectMake(arc4random() % (int)viewWidth,
                                                                         arc4random() % (int)viewHeight,
                                                                         buttonWidth, buttonHeight)];

    [initialButton setBackgroundImage:[UIImage imageNamed:@"button"] forState:UIControlStateNormal];

    [view addSubview:initialButton];

    // set count to 20 - max number of buttons on screen
    if (count > 20)
        count = 20;

    //fill view with buttons from initial button +- 10 pixels
    for (int i=0;i<=count;i++)
    {
        //button
        UIButton *otherButtons = [[UIButton alloc] init];
        [otherButtons setBackgroundImage:[UIImage imageNamed:@"button"] forState:UIControlStateNormal];

        ...//have no idea what to do here

    }
}

所以我对我想要生成其他按钮位置的地方感到困惑,具体取决于初始按钮。我不知道如何产生他们距离彼此5-10像素的位置...任何想法如何实现这一点?谢谢!

1 个答案:

答案 0 :(得分:3)

以下是视图而非​​按钮的示例,但概念是相同的。我使用CGRectInset为新的潜在视图提供一个10点的缓冲区,然后查看新视图是否与任何其他视图相交。如果没有交叉点,请添加子视图(如果有),再次使用新的随机位置。

-(void)generateButtonsForView {
    float viewWidth = self.view.frame.size.width;
    float viewHeight = self.view.frame.size.height;

    UIView *initialView = [[UIView alloc] initWithFrame:CGRectMake(arc4random() % (int)viewWidth, arc4random() % (int)viewHeight, 50, 30)];
    initialView.backgroundColor = [UIColor redColor];
    [self.view addSubview:initialView];
    int numViews = 0;
    while (numViews < 19) {
        BOOL goodView = YES;
        UIView *candidateView = [[UIView alloc] initWithFrame:CGRectMake(arc4random() % (int)viewWidth, arc4random() % (int)viewHeight, 50, 30)];
        candidateView.backgroundColor = [UIColor redColor];
        for (UIView *placedView in self.view.subviews) {
            if (CGRectIntersectsRect(CGRectInset(candidateView.frame, -10, -10), placedView.frame)) {
                goodView = NO;
                break;
            }
        }
        if (goodView) {
            [self.view addSubview:candidateView];
            numViews += 1;
        }
    }
}