Remplissez la vue avec des buttons à des positions randoms

Je veux remplir la zone ( UIView ) avec des buttons ( UIButton ) afin qu'ils ne se croisent pas les uns avec les autres.

Mon idée:

  • créer le button initial à la position random dans la vue;
  • Remplir la vue avec d'autres buttons du button initial (countr <20) qu'ils ne coupent pas ~ 10 pixels l'un de l'autre.

Qu'ai-je fait jusqu'ici?

J'ai créé une méthode:

 -(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 } } 

Donc, je suis confus sur l'endroit où je veux générer la position des autres buttons, en fonction du button initial. Je ne sais pas comment générer leur position qu'ils étaient à une distance de 5-10 pixels les uns des autres … Des idées pour réaliser cela? Merci!

Voici un exemple avec des vues plutôt que des buttons, mais le concept est le même. J'utilise CGRectInset pour donner à la nouvelle vue potentielle un tampon de 10 points autour d'elle, puis détermine si la nouvelle vue croise l'une des autres vues. S'il n'y a pas d'intersection, ajoutez la sous-vue, si c'est le cas, réessayez avec un nouvel location random.

 -(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; } } }