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?
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
Votre utilisation de CGRectIntersectsRect m'aide. J'ai peur je ne suis pas sûr de ce que le problème est, bonne chance :( –