2016-05-23 12 views
0

Ich habe ein Array von Teilansichten meiner Containeransicht, die programmatisch hinzugefügt wurden, indem ich den Frame manuell programmiere.
Wenn der Benutzer einen Filter auswählt, möchte ich die ausgewählten Ansichten vergrößern (passend zum Filter) und ihre Größe um 1,1 erhöhen und die Mitte beibehalten, aber die Überlappung verhindern.
Hier ist mein Code so weit:Überlappung der Ansichten verhindern

- (void) positionSubviewsWithoutOverlapping: (NSArray *) views { 
    for (UIView *v in views){ 
     CGPoint center = v.center; 
     v.frame = CGRectMake(v.frame.origin.x, v.frame.origin.y, v.frame.size.width*1.1, v.frame.size.height*1.1); 
     v.center = center; 
    } 
    while ([self repositionSubviews:views]) { 
    } 
} 

- (BOOL) repositionSubviews: (NSArray *) views{ 
    BOOL somethingChanged = FALSE; 
    for (UIView *v1 in views){ 
     for (UIView *v2 in views){ 
      if (v1 != v2){ 
       if (CGRectIntersectsRect(v1.frame, v2.frame)){ 
        somethingChanged = TRUE; 
        [self preventOverlapOfView1:v1 View2:v2]; 
       } 
      } 
     } 
    } 
    return somethingChanged; 
} 

- (void) preventOverlapOfView1: (UIView *) v1 View2: (UIView *) v2 { 
    if (CGRectGetMaxX(v1.frame) > CGRectGetMinX(v2.frame)){ 
     CGFloat diff = CGRectGetMaxX(v1.frame)-CGRectGetMinX(v2.frame); 
     v1.frame = CGRectMake(v1.frame.origin.x-diff, v1.frame.origin.y, v1.frame.size.width, v1.frame.size.height); 
    } 
    else if (CGRectGetMinX(v1.frame) < CGRectGetMaxX(v2.frame)){ 
     CGFloat diff = CGRectGetMaxX(v2.frame)-CGRectGetMinX(v1.frame); 
     v2.frame = CGRectMake(v2.frame.origin.x-diff, v2.frame.origin.y, v2.frame.size.width, v2.frame.size.height); 
    } 
    if (CGRectGetMaxY(v1.frame) > CGRectGetMinY(v2.frame)){ 
     CGFloat diff = CGRectGetMaxY(v1.frame)-CGRectGetMinY(v2.frame); 
     v2.frame = CGRectMake(v2.frame.origin.x, v2.frame.origin.y-diff, v2.frame.size.width, v2.frame.size.height); 
    } 
    else if (CGRectGetMinY(v1.frame) < CGRectGetMaxY(v2.frame)){ 
     CGFloat diff = CGRectGetMaxY(v2.frame)-CGRectGetMinY(v1.frame); 
     v1.frame = CGRectMake(v1.frame.origin.x, v1.frame.origin.y-diff, v1.frame.size.width, v1.frame.size.height); 
    } 
} 

Das Problem in - (void) preventOverlapOfView1: (UIView *) v1 View2: (UIView *) v2 ist, ich CGRectIntersection verwenden sollte, aber ich kann nicht herausfinden, wie es zu benutzen. Hat jemand einen Vorschlag?

Antwort

0

Als ein leicht linker Vorschlag, warum verwenden Sie nicht einfach eine UICollectionView? Es ist genau auf die Art der Anwendung zugeschnitten, die Sie vorschlagen. Sie können eine bestimmte Zelle vergrößern und die anderen Zellen automatisch verschieben, um der Größenänderung Rechnung zu tragen.

Wenn nicht, dann würde ich vorschlagen, dass Sie Auto-Layout dafür verwenden. Das wiederum hilft anderen Ansichten, sich nicht zu überlappen. Aber die Sammlungsansicht wäre die beste Option.

+0

Danke für die Antwort! Leider kann ich UICollectionView nicht verwenden, die Ansichten werden mit der SVGKit-Bibliothek aus einer Karte einer Etage geladen, die im Grunde eine SVG-Datei ist. Ich muss die Räume der aus dem Filter ausgewählten Karte zoomen. – lorenzoliveto

+0

Ihre Verwendung von CGRectIntersectsRect sieht für mich in Ordnung aus. Ich bin nicht sicher, was das Problem ist, viel Glück :( –

Verwandte Themen