2013-07-23 39 views
6

Mam ruch , który można przesuwać za pomocą gestu panoramowania.Ograniczanie ruchomego widoku za pomocą gestu Przesuwanie

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 
[self.photoMask addGestureRecognizer:pan]; 

Chciałbym ograniczyć obszar, który można przenieść na ekranie. Zamiast tego, aby użytkownik mógł przeciągnąć widok z prawej strony ekranu, chcę go ograniczyć marginesami. Jak mogę to zrobić?

Ponadto, w jaki sposób jest to obsługiwane po obróceniu?

EDIT ---

#pragma mark - Gesture Recognizer 
-(void)handlePan:(UIPanGestureRecognizer *)gesture { 
    NSLog(@"Pan Gesture"); 
    gesture.view.center = [gesture locationInView:self.view]; 
} 

To jest mój obecny sposób poradzić sobie z patelni. Muszę dalej przesuwać widok obrazu o punkt środkowy, a także ograniczać jego ruch, gdy znajduje się blisko krawędzi ekranu, na przykład o 50.

+0

użyj MAX (minFloat, MIN (x, maxFloat)) –

Odpowiedz

7

Jednym z możliwych rozwiązań jest użycie metody handlePan, sprawdzenie lokalizacji punktu na ekranie i zatwierdzenie zmiany tylko wtedy, gdy znajduje się ona w granicach, na które użytkownik chce ją ograniczyć.

Na przykład.

-(void) handlePan:(UIGestureRecognizer*)panGes{ 

    CGPoint point = [panGes locationInView:self.view]; 

    //Only allow movement up to within 100 pixels of the right bound of the screen 
    if (point.x < [UIScreen mainScreen].bounds.size.width - 100) { 

     CGRect newframe = CGRectMake(point.x, point.y, theImageView.frame.size.width, theImageView.frame.size.height); 

     theImageView.frame = newframe; 

    } 

} 

Uważam to również poprawnie obsługiwać dowolny obrót ekranu

EDIT

aby przenieść swój pogląd obrazu przez środek jego ramy, metoda handlePan mógłby wyglądać następująco.

-(void)handlePan:(UIPanGestureRecognizer *)gesture { 

    CGPoint point = [gesture locationInView:self.view]; 

    //Only allow movement up to within 50 pixels of the bounds of the screen 
    //Ex. (IPhone 5) 
    CGRect boundsRect = CGRectMake(50, 50, 220, 448); 

    if (CGRectContainsPoint(boundsRect, point)) { 
     imgView.center = point; 
    }  
} 

Sprawdź, czy punkt znajduje się w pożądanych granicach, a jeśli tak, ustaw środek ramki widoku obrazu na ten punkt.

+0

Dzięki, I dodałem EDYCJĘ do mojego pytania, aktualnie przesuję widok z punktu środkowego, w ten sposób widok obrazu, który się poruszam (który ma okrąg w środku) sprawia, że ​​wygląda jak krąg się rusza ...Próbuję zaktualizować twoją odpowiedź, aby włączyć ten punkt centralny, ale nie jestem pewien jak? Chciałbym pozostać w środkowym punkcie widoku (następnie sprawdzić, czy ten środkowy punkt znajduje się w ograniczonym obszarze ekranu, na przykład 50 marginesów wokół całego ekranu? – StuartM

+0

po prostu edytować dla ciebie –

+0

Jeśli spróbujesz przeciągnąć przeglądaj bardzo szybko, to wtedy warunek się zepsuł. – rakeshNS

3

Nie jestem pewien, czy jestem tutaj zbyt uproszczony, ale myślę, że możesz to zrobić, używając klauzuli "if".

-(void)handlePan:(UIPanGestureRecognizer*)gesture { 

    UIImageView *viewToDrag = gesture.view; // this is the view you want to move 

    CGPoint translation = [gesture translationInView:viewToDrag.superview]; // get the movement delta 

    CGRect movedFrame = CGRectOffset(viewToDrag.frame, translation.x, translation.y); // this is the new (moved) frame 

    // Now this is the critical part because I don't know if your "margin" 
    // is a CGRect or maybe some int values, the important thing here is 
    // to compare if the "movedFrame" values are in the allowed movement area 

    // Assuming that your margin is a CGRect you could do the following: 
    if (CGRectContainsRect(yourPermissibleMargin, movedFrame)) { 
     CGPoint newCenter = CGPointMake(CGRectGetMidX(movedFrame), CGRectGetMidY(movedFrame)); 
     viewToDrag.center = newCenter; // Move your view 
    } 

    // -OR- 

    // If you have your margins as int values you could do the following: 
    if ((movedFrame.origin.x + movedFrame.size.width) < 50) { 
     CGPoint newCenter = CGPointMake(CGRectGetMidX(movedFrame), CGRectGetMidY(movedFrame)); 
     viewToDrag.center = newCenter; // Move your view 
    } 
} 

Prawdopodobnie będziesz musiał dostosować to do swoich konkretnych potrzeb.

Mam nadzieję, że to pomoże!

+0

Dzięki, dodałem EDYCJĘ do mojego pytania. Obecnie przesuwaj widok z punktu środkowego. W ten sposób widok obrazu, który się poruszam (który ma okrąg pośrodku) sprawia, że ​​wygląda jak krąg się rusza ... Próbuję zaktualizować twoją odpowiedź, aby uwzględnić ten punkt centralny, ale nie jestem pewien jak? Chciałbym pozostać w środkowym punkcie widoku (następnie sprawdzić, czy ten środkowy punkt znajduje się w ograniczonym obszarze ekranu, na przykład 50 marginesów wokół całego ekranu? – StuartM

+1

StuartM, zobacz moją zaktualizowaną odpowiedź – LuisCien

0
- (void)dragAction:(UIPanGestureRecognizer *)gesture{ 
    UILabel *label = (UILabel *)gesture.view; 
    CGPoint translation = [gesture translationInView:label]; 
    if (CGRectContainsPoint(label.frame, [gesture locationInView:label])) { 
     label.center = CGPointMake(label.center.x, 
           label.center.y); 
     [gesture setTranslation:CGPointZero inView:label]; 
    } 
    else{ 
     label.center = CGPointMake(label.center.x, 
           label.center.y + translation.y); 
     [gesture setTranslation:CGPointZero inView:label]; 
    } 
} 
0

Oto odpowiedź w Swift 4 - ograniczyć ruch do widoku Superview

@objc func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) 
{ 
    // Allows smooth movement of stickers. 
    if gestureRecognizer.state == .began || gestureRecognizer.state == .changed 
    { 
     let point = gestureRecognizer.location(in: self.superview) 
     if let superview = self.superview 
     { 
      let restrictByPoint : CGFloat = 30.0 
      let superBounds = CGRect(x: superview.bounds.origin.x + restrictByPoint, y: superview.bounds.origin.y + restrictByPoint, width: superview.bounds.size.width - 2*restrictByPoint, height: superview.bounds.size.height - 2*restrictByPoint) 
      if (superBounds.contains(point)) 
      { 
       let translation = gestureRecognizer.translation(in: self.superview) 
       gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x + translation.x, y: gestureRecognizer.view!.center.y + translation.y) 
       gestureRecognizer.setTranslation(CGPoint.zero, in: self.superview) 
      } 
     } 
    } 
} 

Jeśli chcesz mieć większą kontrolę nad nim, dopasowania wartości restrictByPoint aby wykadrować ruchomy widoku danych.