2012-12-14 7 views
5

私はUIViewを持っています画面を上下に移動しようとしていますが、通常の位置にあるときにビューをドラッグすることはできません(0、0)境界外の場合にパンジェスチャーを無効にする

認識器の中心がビューの高さの半分ではないが、ビューが動かず、中心が常に高さの半分(この場合は230)であることを検出しようとしました。

アイデア?

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

答えて

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

点がCGRectContainsPoint(rect, point)を使用し、ビューの境界内にあるかどうかを計算

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

代わりの手動を試みます。これは私のためにどのような作品であり、それはより短く、より読みやすいですので、私はそれが好き:

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. 
     } 
} 
関連する問題