2012-12-14 15 views
10

Sto provando a creare un GestureRecognizer per trascinare un UIView da destra a sinistra. Se l'utente trascina la vista sulla metà dello schermo, la vista verrà automaticamente trascinata nell'angolo sinistro per scartarla, ma se l'utente non trascina fino a metà schermo tornerà all'angolo destro dello schermo. Poco perso qui, qualche tutorial o qualcosa del genere? GrazieUIGestureRecognizer per trascinare UIView

EDIT: Heres po 'di codice, è un UIImageView, all'interno di un UIScrollView, ho bisogno di trascinare l'intera scorrimento o semplicemente l'immagine all'interno di esso:

_myScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, self.window.bounds.size.height)]; [_myScroll setContentSize:CGSizeMake(self.window.bounds.size.width , 1300)]; 

_tutorial = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 1300)]; [_tutorial setImage:[UIImage imageNamed:@"Default"]]; 
_tutorial.contentMode = UIViewContentModeScaleAspectFit; [_myScroll addSubview:_tutorial]; 

_tutorial.userInteractionEnabled = YES; 
    UIPanGestureRecognizer * recognizer = [[UIPanGestureRecognizer alloc]initWithTarget:_tutorial action:@selector(handlePan:)]; 
[_tutorial addGestureRecognizer:recognizer]; 

    [self.window addSubview:_myScroll]; 

E il metodo cerco di trascinamento il UIImageView

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer { 

    CGPoint translation = [recognizer translationInView:_myScroll]; 
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
             recognizer.view.center.y + translation.y); 
    [recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll]; 

} 
+0

Ho risposto alla tua domanda, ma dovresti fornire maggiori dettagli su ciò che hai provato, ad esempio "Posso trascinare la vista, ma non so come farlo andare nella giusta posizione", ... – rdurand

+0

@ rdurand sì, posso trascinare la vista usando un UIPanGestureRecognizer, ma non so esattamente come rilevare la posizione, e quindi inviare la vista alla posizione desiderata. E il secondo problema è, come trascinare la vista, solo in orizzontale – darkman

+0

Fornire del codice. Dicci cosa hai provato, cosa * non funziona *. – rdurand

risposta

22

uno sguardo oltre here. Questo è un tutorial UIGestureRecognizer che ti darà le basi per gestire i gesti di pizzico e pan. Una volta apprese le nozioni di base, è davvero facile realizzare ciò che desideri. Tutto ciò che serve è controllare la posizione della vista una volta completata la panoramica per inviarla nella posizione corretta. Dai uno sguardo a this other tutorial su UIScrollViews, può aiutarti a trovare la tua strada attraverso la seconda parte.

Entrambi i tutorial provengono da raywenderlich.com, probabilmente il sito di tutorial iOS più utile che conosca.


Ecco il codice del metodo handlePan: si può lavorare su:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer { 

    CGPoint translation = [recognizer translationInView:_myScroll]; 

    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
             recognizer.view.center.y + translation.y); 

    if (recognizer.state == UIGestureRecognizerStateEnded) { 

     // Check here for the position of the view when the user stops touching the screen 

     // Set "CGFloat finalX" and "CGFloat finalY", depending on the last position of the touch 

     // Use this to animate the position of your view to where you want 
     [UIView animateWithDuration: aDuration 
           delay: 0 
          options: UIViewAnimationOptionCurveEaseOut 
         animations:^{ 
      CGPoint finalPoint = CGPointMake(finalX, finalY); 
      recognizer.view.center = finalPoint; } 
         completion:nil]; 
    } 


    [recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll]; 

} 

io non ti darò la risposta perfetta qui, si dovrà lavorare sul codice per trovare un modo per farlo funzionare come tu lo vuoi.

Ecco un ultimo consiglio. Puoi fare una sorta di animazione "liscia" usando un slideFactor. Aiuterà la tua animazione a essere più "realistica". Lavorare su questo codice, che si aggiunge proprio all'inizio del "se":

CGPoint velocity = [recognizer velocityInView:self.view]; 
CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y)); 
CGFloat slideMult = magnitude/200; 

float slideFactor = 0.1 * slideMult; // Increase for more slide 

Poi, nel UIView animateWithDuration:, utilizzare slideFactor come la durata.

Problemi correlati