2012-12-14 16 views
10

Próbuję zbudować GestureRecognizer, aby przeciągnąć UIView od prawej do lewej. Jeśli użytkownik przeciągnie widok na połowę ekranu, widok zostanie automatycznie przeciągnięty w lewy narożnik, aby go odrzucić, ale jeśli użytkownik nie przeciągnie do połowy ekranu, powróci do narożnika z prawej strony ekranu. Trochę zagubione, jakieś tutoriale czy coś takiego? DziękiUIGestureRecognizer przeciągnij UIView

EDIT: Herezje niektóre kodu, jego UIImageView, wewnątrz UIScrollView, muszę przeciągnąć cały zwój czy tylko obraz wewnątrz niego:

_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]; 

i metoda próbuję przeciągnij 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

Odpowiedziałem na twoje pytanie, ale powinieneś podać więcej szczegółów na temat tego, co wypróbowałeś, np. "Mogę przeciągnąć widok, ale nie wiem, jak sprawić, by trafiło we właściwe miejsce", ... – rdurand

+0

@ rdurand tak, mogę przeciągnąć widok za pomocą narzędzia UIPanGestureRecognizer, ale nie wiem dokładnie, jak wykryć pozycję, a następnie wysłać widok do żądanej pozycji. Drugim problemem jest, jak przeciągnąć widok, tylko poziomo. – darkman

+0

Podaj jakiś kod. Powiedz nam, co próbowałeś, co * nie działa *. – rdurand

Odpowiedz

22

wyglądają na here. Jest to samouczek UIGestureRecognizer, który da ci podstawy do obsługi gestów szczypania i patrzenia. Gdy już poznasz podstawy, naprawdę łatwo jest osiągnąć to, czego chcesz. Wszystko, czego potrzebujesz, to sprawdzenie pozycji widoku po ukończeniu panoramy, aby wysłać ją do właściwej pozycji. Spójrz na this other tutorial na UIScrollViews, może pomóc Ci znaleźć drogę przez drugą część.

Oba tutoriale pochodzą z raywenderlich.com, prawdopodobnie najbardziej przydatnej witryny samouczków dla systemu iOS, którą znam.


Oto kod na swojej metodzie handlePan: można pracować na:

- (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]; 

} 

nie daje doskonałą odpowiedź tutaj, będziesz musiał pracować na kodzie, aby znaleźć sposób, aby działał tak, jak chcesz.

Oto ostatnia wskazówka. Możesz zrobić "gładką" animację za pomocą funkcji slideFactor. Pomoże to twoja animacja będzie bardziej "realistyczna". Prace nad tym kodem, który dodać na samym początku „if”:

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 

Następnie w UIView animateWithDuration: użyć slideFactor jako czas trwania.

Powiązane problemy