2013-07-23 15 views
6

Ich habe eine UIImageView, die über eine Schwenkgeste bewegbar ist.Wie man eine bewegliche Ansicht durch Schwenkgeste beschränkt

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

Ich möchte den Bereich beschränken, der auf dem Bildschirm verschoben werden kann. Anstatt die Benutzer in der Lage sein, den Blick direkt auf der Seite des Bildschirms zu ziehen, möchte ich es mit einem Vorsprung von einer Art zu beschränken. Wie kann ich das machen?

Auch, wie ist dies dann, wenn sie gedreht behandelt?

EDIT ---

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

Dies ist meine aktuelle Methode, um die Pfanne zu handhaben. Was ich tun muß, ist weiterhin die Imageview durch den Mittelpunkt bewegen und beschränkt auch seine Bewegung, wenn nahe an den Rand des Bildschirms um 50 zum Beispiel.

+0

Verwenden Sie MAX (minFloat, MIN (x, maxFloat)) –

Antwort

7

Eine mögliche Lösung hierfür ist in Ihrer handlePan-Methode, überprüfen Sie die Position des Punktes auf dem Bildschirm, und verpflichten Sie nur die Änderung, wenn es innerhalb der Grenzen ist, die Sie beschränken möchten.

Für z.

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

    } 

} 

Ich glaube, das wäre richtig behandeln auch jede Drehung des Bildschirms

EDIT

Um die Bildansicht durch die Mitte seines Rahmens zu bewegen, die handlePan Methode wie folgt aussehen könnte.

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

Prüfen, ob der Punkt innerhalb gewünschten Grenzen liegt und, wenn ja, stellen Sie die Mitte des Bildrahmens Ansicht zu diesem Punkt. Hier

+0

Dank sehen, ich eine EDIT auf meine Frage hinzugefügt haben. Derzeit bewege ich den Blick vom Mittelpunkt. auf diese Weise der Imageview ich bewegt bin (die einen Kreis in der Mitte hat) es wie der Kreis aussehen lässt bewegt ...Ich versuche, deine Antwort zu aktualisieren diesen Mittelpunkt zu übernehmen, aber nicht sicher, wie? Ich mochte den Mittelpunkt der Ansicht bleiben zu bewegen (dann prüfen, ob dieser Mittelpunkt in einem begrenzten Bereich des Bildschirms ist. Zum Beispiel ein 50 Rand um den gesamten Bildschirm? – StuartM

+0

gerade bearbeitet für Sie –

+0

Wenn Sie versuchen, das ziehen sehr schnell sehen, dann würde diese Bedingung brechen. – rakeshNS

3

Ich bin mir nicht sicher, ob ich hier übermäßig simpel bin, aber ich denke, dass Sie dies erreichen können, indem Sie eine if-Klausel verwenden.

-(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 
    } 
} 

Sie müssen dies wahrscheinlich anpassen, um Ihre spezifischen Anforderungen zu erfüllen.

Hoffe, das hilft!

+0

Danke, ich habe eine EDIT meine Frage hinzugefügt. Zur Zeit bewege ich die Ansicht vom Mittelpunkt aus. Auf diese Weise die Imageview ich bewegt bin (das einen Kreis in der Mitte hat) es wie der Kreis aussehen läßt bewegt ... Ich versuche, deine Antwort zu aktualisieren diesen Mittelpunkt zu übernehmen, aber nicht sicher, wie? Ich mochte den Mittelpunkt der Ansicht bleiben zu bewegen (dann prüfen, ob dieser Mittelpunkt in einem begrenzten Bereich des Bildschirms ist. Zum Beispiel ein 50 Rand um den ganzen Bildschirm? – StuartM

+1

StuartM bitte meinen Antwort aktualisiert – 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

ist die Antwort in Swift 4 - die Bewegung Ansicht einschränken

@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) 
      } 
     } 
    } 
} 

zu Superview Wenn Sie mehr Kontrolle über die es wünschen, Spiel restrictByPoint Wert auf Ihre bewegliche Ansicht des Rahmens.

Verwandte Themen