Déplacement d'une UIView à  l'intérieur d'une autre

remoozremooz Membre
23:00 modifié dans API UIKit #1
J'ai 2 UIView. L'une contient l'autre et je suis capable d'en déplacer une mais impossible de l'obliger à  rester dans l'autre UIView.

Dans la méthode touchesMoved, j'ai le code suivant:
//Bounds detection<br />		if( (firstRect.center.x + 40) &gt; self.bounds.size.width || (firstRect.center.x - 40) &lt; 0)<br />		{<br />			NSLog(@&quot;Limite atteinte en x&quot;);<br />			firstRect.center = [touch previousLocationInView:self];<br />		}<br />		else firstRect.center = [touch locationInView:self];<br />		<br />		if( (firstRect.center.y + 80) &gt; self.bounds.size.height || (firstRect.center.y - 80) &lt; 0)<br />		{<br />			NSLog(@&quot;Limite atteinte en y&quot;);<br />		}


J'ai essayé plusieurs options mais rien n'y fait. Si quelqu'un peut m'aider, merci par avance :)

Réponses

  • Philippe49Philippe49 Membre
    mai 2009 modifié #2
    Il suffit que ta seconde UIView soit dans dans les subviews de la première.

    - Soit par le code [myView1 addSubview myView2];
    - Soit dans IB comme l'indique les images ci-dessous
  • remoozremooz Membre
    mai 2009 modifié #3
    En effet ça va mieux ma vue ne peut plus être déplacer en dehors de la vue principale. Le problème suivant est que dès que la limite est atteinte je ne plus du tout déplacer ma vue.
  • Philippe49Philippe49 Membre
    23:00 modifié #4
    dans 1241977165:

    Le problème suivant est que dès que la limite est atteinte je ne plus du tout déplacer ma vue.

    Je ne suis pas sur de bien comprendre. Tu parles de la vue la plus interne ? Tu dois pouvoir la déplacer mais elle disparaà®t car elle n'est visible qu'à  travers "la fenêtre", le clipping de la vue mère. Tu peux y remédier en utilisant la property clipsToBounds de UIView.

    clipsToBounds
    A Boolean value that determines whether subviews can be drawn outside the bounds of the receiver.

    @property(nonatomic) BOOL clipsToBounds

    Cependant, je ne sais pas ce que tu fais avec cela, mais cela semble bizarre comme besoin.
  • Philippe49Philippe49 Membre
    23:00 modifié #5
    Par ailleurs tu utilises bounds plutôt que frame. Attention ce n'est pas la même chose, bounds est en quelque sorte la définition de la zone visible de ta vue, alors que frame sont des coordonnées dans le repère de la surpervue.

    Par exemple, un bounds=CGRectMake(-frame.size.width/2.,-frame.size.height/2.,frame.size.width,frame.size.height) correspond à  rendre visible un rectangle à  l'échelle 1, et dont le centre est le point (0,0).
  • remoozremooz Membre
    23:00 modifié #6
    Oui c'est vrai je n'ai pas été très clair sur mon besoin.

    Mon besoin est de pouvoir déplacer une forme (UIView) à  l'intérieur d'une autre (UIView). Ma 1ère forme doit rester à  l'intérieur.
  • Philippe49Philippe49 Membre
    23:00 modifié #7
    dans 1241875847:

    Dans la méthode touchesMoved, j'ai le code suivant:
    //Bounds detection<br />		if( (firstRect.center.x + 40) &gt; self.bounds.size.width || (firstRect.center.x - 40) &lt; 0)<br />		{<br />			NSLog(@&quot;Limite atteinte en x&quot;);<br />			firstRect.center = [touch previousLocationInView:self];<br />		}<br />		else firstRect.center = [touch locationInView:self];<br />		<br />		if( (firstRect.center.y + 80) &gt; self.bounds.size.height || (firstRect.center.y - 80) &lt; 0)<br />		{<br />			NSLog(@&quot;Limite atteinte en y&quot;);<br />		}
    



    Il faut faire le test sur la valeur future et non sur la valeur actuelle
    <br />		CGpoint location=[touch locationInView:self];<br />		if( (location.x + 40) &gt; self.bounds.size.width || (location.x - 40) &lt; 0 || idem en y)<br />		{<br />			NSLog(@&quot;Limite atteinte en x&quot;);<br />		}<br />		else {<br />		 	firstRect.center = location;<br />		}<br />
    
  • remoozremooz Membre
    23:00 modifié #8
    C'est bon ma vue ne peut être déplacée en dehors de la vue principale.
    Par contre quand la limite est atteinte, il arrive que je ne puisse plus la déplacer. Il faut que j'enlève mon "doigt" puis que je recommence à  la déplacer.
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event<br />{<br />	UITouch *touch = [[event allTouches] anyObject];<br />	<br />	if ([touch view] == myView)<br />	{<br />		//Bounds detection<br />		CGPoint location = [touch locationInView:self.view];<br />		<br />		if( (location.x + 25) &gt; self.view.frame.size.width || (location.x - 25) &lt; 0 || (location.y + 25) &gt; self.view.frame.size.height || (location.y - 25) &lt; 0)<br />		{<br />			NSLog(@&quot;Limite atteinte en x&quot;);<br />		}<br />		else <br />		{<br />		 	myView.center = location;<br />		}<br />	}<br />}
    


    Ma vue est un carré de 50x50 px.
  • Philippe49Philippe49 Membre
    23:00 modifié #9
    Cela doit être que [touch view] devient != myView.


    Essai : Définir un booléen draggingMyView
    - Le mettre à  YES dans touchesBegan si le touch a lieu dans myView
    - Supprimer le test if ([touch view] == myView) dans touchesMoved
    - Le mettre à  NO dans touchesEnded


    rq perso dans ce genre de problème je confie à  la vue qui se déplace le soin de se déplacer, et non au contrôleur de la supervue ...
  • remoozremooz Membre
    23:00 modifié #10
    Yes impeccable merci beaucoup  :kicking:
Connectez-vous ou Inscrivez-vous pour répondre.