2012-12-14 9 views
5

Ich habe eine UIView Ich versuche, den Bildschirm auf und ab zu bewegen, aber ich möchte nur das Schwenken aktivieren, sodass Sie die Ansicht nicht nach unten ziehen können, wenn sie sich in ihrer normalen Position befindet (0, 0)Deaktivierung der Schwenkgeste, wenn das Out-of-Bounds erkannt wurde

Ich versuchte zu erkennen, wenn das Erkennungszentrum nicht halb so hoch wie die Ansicht ist, aber die Ansicht ist dann unbeweglich, und die Mitte ist immer die halbe Höhe (230 in diesem Fall).

Irgendwelche Ideen?

- (IBAction)panDetected:(UIPanGestureRecognizer *)recognizer { 
    CGPoint translation = [recognizer translationInView:self.view]; 
    NSLog(@"\ncenter.y: %f\ntranslation.y: %f\n", recognizer.view.center.y, translation.y); 
    if (recognizer.view.center.y > ([[UIScreen mainScreen] bounds].size.height - 20)/2) { 
      return; 
    } 
    recognizer.view.center = CGPointMake(recognizer.view.center.x, 
             recognizer.view.center.y + translation.y); 
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; 
} 
+1

recognizer.view.center = CGPointMake (recognizer.view.center.x, MAX (recognizer.view.center.y + translation.y, 230)); – Rich86man

Antwort

0
recognizer.view.center = CGPointMake(recognizer.view.center.x, MAX(recognizer.view.center.y + translation.y, ([[UIScreen mainScreen] bounds].size.height - 20)/2)); 
0

versuchen

CGPoint translation = [recognizer translationInView:self.view]; 
if (translation.x+recognizer.view.frame.origin.x<0||translation.y+recognizer.view.frame.origin.y<0) 
    { 
     return; 
    } 

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

//limit the boundary  
if ((recognizer.view.frame.origin.x>0 && translation.x > 0) || (recognizer.view.frame.origin.x + recognizer.view.frame.size.width<=320 && translation.x < 0)) 
    finalpoint.x = recognizer.view.center.x; 

if ((recognizer.view.frame.origin.y>0 && translation.y > 0) || (recognizer.view.frame.origin.y + recognizer.view.frame.size.height<=self.view.frame.size.height && translation.y < 0)) 
    finalpoint.y = recognizer.view.center.y; 

//set final position 
recognizer.view.center = finalpoint; 
[recognizer setTranslation:CGPointZero inView:self.view]; 
3

Statt manuell Berechnung, ob die Punkte innerhalb der Grenzen der Ansicht sind, verwenden CGRectContainsPoint(rect, point). Dies ist, was für mich funktioniert, und Ich mag es, weil es kürzer und besser lesbar:

func handlePan(pan: UIPanGestureRecognizer) { 
    switch pan.state { 
    case .Began: 
     if CGRectContainsPoint(self.pannableView.frame, pan.locationInView(self.pannableView)) { 
      // Gesture started inside the pannable view. Do your thing. 
     } 
}