2016-05-23 1 views
0

J'ai un tableau de sous-vues de ma vue de conteneur, ajouté par programme en réglant le cadre manuellement.
Lorsque l'utilisateur sélectionne un filtre, je voudrais zoomer sur les vues sélectionnées (correspondant au filtre) en augmentant leur taille de 1,1 et en maintenant le centre mais en évitant le chevauchement.
Voici mon code à ce jour:Empêcher le chevauchement des vues

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

Le problème est dans - (void) preventOverlapOfView1: (UIView *) v1 View2: (UIView *) v2, je devrais utiliser CGRectIntersection mais je ne peux pas comprendre comment l'utiliser. Est-ce que quelqu'un a une suggestion?

Répondre

0

Comme une suggestion légèrement à gauche, pourquoi ne pas simplement utiliser un UICollectionView? Il est conçu précisément pour le type d'application que vous suggérez. Vous pouvez agrandir une certaine cellule et déplacer automatiquement les autres cellules pour s'adapter au changement de taille.

Sinon, alors je vous suggère d'utiliser autolayout pour cela. Cela aidera encore mieux les autres points de vue à ne pas se chevaucher. Mais la vue de la collection serait la meilleure option.

+0

Merci pour la réponse! Malheureusement, je ne peux pas utiliser UICollectionView, les vues sont chargées en utilisant la bibliothèque SVGKit à partir d'une carte d'un étage qui est essentiellement un fichier svg. Je dois zoomer les pièces de la carte sélectionnée à partir du filtre. – lorenzoliveto

+0

Votre utilisation de CGRectIntersectsRect m'aide. J'ai peur je ne suis pas sûr de ce que le problème est, bonne chance :( –