2016-09-02 4 views
0

Ich habe Code, der eine zufällige CGRect generiert, überprüft, ob es andere Rectures in einem vorherigen Array schneidet, und wenn es nicht tut, fügt es das neue Rect zum Array hinzu. Das funktioniert ganz gut, aber ich möchte auch sicherstellen, dass das zufällige CGRect nicht ein Bild in der Mitte des Bildschirms überlappt. Ich habe ein Rect erstellt, das das Bild mit viel zusätzlichem Platz an den Seiten umrahmt, aber während sich die zufälligen CGRects immer noch nicht schneiden, schneiden sie manchmal das mittlere Bild rect.CGRectIntersectsRect arbeitet inkonsistent

CGRect aRandomFrame = CGRectMake((aRandomX - 50), (aRandomY - 50), 100, 100); 
CGRect imageRect = CGRectMake((self.fixation.center.x - 50), (self.fixation.center.y - 50), 100, 100); 

if (CGRectContainsRect(BOUNDARY, aRandomFrame)) { 
    BOOL isValidFrame = YES; 
    for (NSValue *aFrameValue in [self points]) { 
     CGRect aFrame = [aFrameValue CGRectValue]; 
     if (CGRectIntersectsRect(aFrame, aRandomFrame) || CGRectIntersectsRect(imageRect, aRandomFrame)) { 
      isValidFrame = NO; 
      break; 
     } 
    } 

    if (isValidFrame) { 
     [[self points] addObject:[NSValue valueWithCGRect:aRandomFrame]]; 
    } 
} 

Als Nebenbei bemerkt, ist GRENZ eine größere rect, um sicherzustellen, dass keiner des Zufalls Rects ist zu weit vom Zentrum entfernt.

Antwort

1

Um einen Leser davon zu überzeugen, dass CGRectIntersectsRect nicht funktioniert, müssen Sie einige NSLog-Beweise präsentieren, die einen Fehler anzeigen.

Der Code sieht in Ordnung, so der Verdacht, Dinge fallen wir nicht in der OP sehen:

  1. Die Berechnung von aRandomX und aRandomY. Ich nehme an, dass etwas wie folgt aussieht:

    CGFloat aRandomX = arc4random_uniform(someView.bounds.size.width); 
    CGFloat aRandomY = arc4random_uniform(someView.bounds.size.height); 
    

someView wichtig ist hier: Es ist ein UIView die Bildansicht enthält, und das Koordinatensystem aller dieser Rects, möglicherweise self.view wenn wir innerhalb eine Ansicht Controller

  1. der Wert BOUNDARY, aber ich wette, das ist ein einfaches konstante Rechteck mit einer Null oder kleinen Herkunft und eine Größe, das gleich oder etwas kleiner als

  2. Der wahrscheinlichste und unheimlichste Täter ist das Koordinatensystem der imageRect. Wenn das Rechteck und die Grenze im Koordinatensystem von someView sind, dann muss dies die zentrale Eigenschaft von self.fixation sein. Mit anderen Worten, self.fixation muss eine direkte Unteransicht von sein.

Egal, wie man es someView in der Ansichtshierarchie betrifft, können Sie sicherstellen, dass imageRect korrekt ist eine etwas anspruchsvollere Ansatz unter Verwendung von:

CGRect imageRect = [self.fixation convertRect:self.fixation.bounds toView:someView]; 
// remember someView might be self.view in a view controller 
// what to do here depends on how your view hierarchy relates to the rects 

Als Randbemerkung, Ihre Schleife ist eine wenig verschwenderisch, da es das ImageRect jedes Mal prüft, wenn es das berechnete Rect gegen das Gesicherte prüft. Sie können, dass wie dieses Problem zu beheben:

if (CGRectContainsRect(BOUNDARY, aRandomFrame)) { 
    if (!CGRectIntersectsRect(imageRect, aRandomFrame)) { 
     BOOL isDisjoint = YES; 
     for (NSValue *frameValue in self.points) { 
      CGRect aFrame = [frameValue CGRectValue]; 
      if (CGRectIntersectsRect(aFrame, aRandomFrame)) { 
       isDisjoint = NO; 
       break; 
      } 
     } 
     if (isDisjoint) { 
      [self.points addObject:[NSValue valueWithCGRect:aRandomFrame]]; 
     } 
    } 
} 

Ein weiterer Vorteil dieser ist für das Debugging: brechen innerhalb dieser zweiten bedingten und prüfen, ob aRandomFrameimageRect schneidet. Wenn dies der Fall ist, NSogle die Rechtecke und poste sie hier. Sie werden eine große Entdeckung gemacht haben, dass CGRectContainsRect einen Fehler hat, aber es ist nicht, ich bin sicher,.

Wenn Sie stattdessen sehen, dass die Rechtecke sich an diesem Punkt nicht schneiden, und wenn etwas falsch ist, wird es mit der imageRect sein. Viel Glück!

+0

Sorry diese Antwort ist so spät, andere Dinge forderten meine Aufmerksamkeit und dies wurde auf den Abstellgleis gesetzt. Aber ich habe implementiert, was du geschrieben hast, und es hat mir geholfen, einige Probleme zu beheben, also danke! – lunadiviner