2011-07-16 3 views
0

J'ai plusieurs vues dans une vue principale. Ces points de vue sont tous les uns derrière les autres, de sorte que seul le sommet est actuellement vu. Ce que je voudrais faire est, sur une entrée d'utilisateur particulière, avoir une des vues dans le dos se déplacent plus bas sur l'écran, de sorte qu'il peut être vu en dessous de la vue de dessus. J'ai essayé de le faire en déterminant si les deux vues sont en train de se chevaucher, d'abaisser celle en arrière, si elles se chevauchent encore, de l'abaisser davantage, et ainsi de suite jusqu'à ce qu'elles ne se chevauchent plus et soient toutes deux entièrement visibles. Ensuite, je voudrais que la vue principale soit redimensionnée pour que les deux vues puissent être vues mais je pense que ce serait juste d'utiliser setBounds ou setFrame, je n'y suis pas encore arrivé. Pour le premier problème, je n'ai pas trouvé un moyen de voir littéralement si deux vues se chevauchent, si cela ne peut pas être fait, je pensais peut-être en dessinant sur les limites de la vue et en vérifiant si elles se chevauchent. Je sais comment je peux faire l'un ou l'autre. Je pense que les limites ou le cadre sont nécessaires, mais je ne suis pas vraiment sûr de savoir comment ils sont différents.Cacao se déplaçant chevauchant NSViews

Fondamentalement, je veux vérifier si deux NSViews se chevauchent, s'ils le font, je veux abaisser l'un d'entre eux.

EDIT: Cette partie du problème est à peu près résolue, mais un nouveau problème s'est posé. J'ai trois vues, une vue principale et deux sous-vues. La vue principale n'a rien, elle ne contient que plusieurs sous-vues, tout ce qui est à l'intérieur de la vue principale est ce qui devrait être vu. Les deux sous-vues sont empilées au-dessus de la vue principale, de sorte que la vue la plus en avant est celle visible, celle en arrière est masquée. Lorsque l'utilisateur démarre, la vue à l'arrière devient visible et j'installe une minuterie répétitive avec un sélecteur qui va vérifier si les vues se chevauchent, comme @Vince a dit, si elles le font, il compense celui dans le dos un peu et vérifie à nouveau jusqu'à ce qu'ils ne se chevauchent plus. En utilisant ceci:

- (void)updateViews { 
CGRect viewFrame = [view frame]; //view is the frontmost view that will not move 
CGRect backroundViewFrame = [backgroundView frame]; //the view in the back 

CGRect rectIntersection = CGRectIntersection (viewFrame, 
               backgroundFrame); 

//if the intersect is NOT null, it'll offset down by 2 
if (!CGRectIsNull(rectIntersection)) { 
    CGRect newFrame = CGRectOffset (
            rectIntersection, 
            0,  //doesn't move in x 
            -2  //lowers by 2 in y 
            ); 
    [backgroundView setFrame:newFrame]; //lowers the view to the new offset rect 

} else{ 
    [viewsUpdater invalidate]; //stops the timer when rects no longer intersect 
    viewsUpdater = nil; 
} 

Le problème est que quand je baisse la backgroundView, il est seulement visible dans l'espace où il croise la vue de face. Même si j'élargis la vue principale plus bas (ce qui est l'idée, ils vont tous commencer les uns au-dessus des autres avec les mêmes dimensions et quand le backgroundView s'abaisse, la vue principale s'ajustera et affichera les deux). Mais pour l'instant, peu importe la taille de la vue principale, backgroundView n'est visible que dans la zone où elle se croise avec la vue de face. Je pense que ça bouge là où ça doit aller, mais au moment où ça s'arrête, c'est complètement invisible, donc je ne peux pas le dire.

Merci pour l'aide.

+0

désolé, peut-être mal compris le problème tout d'abord, mis à jour! –

Répondre

4

Fondamentalement, vous serez en mesure de savoir si deux objets NSView chevauchent en obtenant l'intersection des deux frame propriétés (CGRectIntersection()), puis d'essais pour que le résultat nul en utilisant CGRectIsNull(). Voici le doc pour cela.

Maintenant, de mettre un point de vue sur une autre, il semble que vous devez utiliser cette méthode de NSView: -(void)setSubviews:(NSArray *)newSubviews; qui, selon le documentation, vous permet de réorganiser les sous-vues.

Ou simplement en utilisant -(void)replaceSubview:(NSView *)oldView with:(NSView *)newView;, cela dit, puisque le oldView sera publié, veillez à conserver une référence à celui-ci avant.

Si vous venez de tenter de déplacer une vue inférieure, il suffit de changer le origin du cadre du recepteur, par exemple:

CGRect actualFrame = [aView frame]; 
CGPoint framesOrigin = actualFrame.origin; 
CGRect newFrame = CGRectMake(framesOrigin.x, 
          (framesOrigin.y)+50, 
          actualFrame.width, 
          actualFrame.height); 
[aView setFrame:newFrame]; 

Cela déplacera aView bas, en changeant la coordonnée y de son cadre de origine.

Enfin, la différence entre les propriétés bounds et frame, ce poste sur le SO Difference between view's frame and view's bound + iPhone, devrait répondre à votre question;)

+0

Cela m'a vraiment beaucoup aidé. J'ai utilisé CGRectOffset au lieu de CGRectMake cependant. Merci beaucoup! – Elbimio

+0

vous êtes les bienvenus, si ma réponse correspond à vos besoins, cliquez sur le Chekmark sur la gauche;) –

+0

J'ai l'intention de. Je ne l'ai pas encore fait pour que d'autres personnes viennent encore chercher à répondre à la partie dans le montage. S'ils voient que c'est déjà répondu, ils ignoreraient probablement la question. – Elbimio