2012-05-07 1 views

답변

4

당신은 UIPanGestureRecognizer의 대리자 메서드를 구현할 수)

아주 모자의 일종 당신에게 감사합니다. 제스처의 위치가 관심있는 범위에 있는지 확인하십시오. should * 메소드의 경우 false를 반환하여 제스처를 취소 할 수 있습니다. 제스처가 시작되면 State 속성을 Canceled로 설정하여 취소 할 수 있습니다.

public class GestureView: UIView 
{ 
    RectangleF _bounds; 

    public GestureView (RectangleF rect) : base (rect) 
    { 
     this.BackgroundColor = UIColor.Brown; 

     UIPanGestureRecognizer pan = new UIPanGestureRecognizer (this, new Selector ("panViewWithGestureRecognizer:")); 
     this.AddGestureRecognizer (pan); 
     pan.WeakDelegate = this; 
     _bounds = new RectangleF (0,0,200, 100); 
    } 

    [Export("panViewWithGestureRecognizer:")] 
    void PanGestureMoveAround (UIPanGestureRecognizer p) 
    { 
     if (_bounds.Contains (p.LocationInView (this))) 
     { 
      Console.WriteLine ("PanGestureMoveAround true"); 
      return; 
     } 
     Console.WriteLine ("PanGestureMoveAround false"); 
     p.State = UIGestureRecognizerState.Cancelled; 
     return; 
    } 

    [Export ("gestureRecognizerShouldBegin:")] 
    bool ShouldBegin (UIGestureRecognizer recognizer) 
    { 
     if (_bounds.Contains (recognizer.LocationInView (recognizer.View))) 
     { 
      Console.WriteLine ("ShouldBegin true"); 
      return true; 
     } 
     Console.WriteLine ("ShouldBegin false"); 
     return false; 
    } 

    [Export ("gestureRecognizer:shouldReceiveTouch:")] 
    public bool ShouldReceiveTouch (UIGestureRecognizer recognizer, UITouch touch) 
    { 
     if (_bounds.Contains (touch.LocationInView (recognizer.View))) 
     { 
      Console.WriteLine ("ShouldReceiveTouch true"); 
      return true; 
     } 
     Console.WriteLine ("ShouldReceiveTouch false"); 
     return false; 
    } 
} 
+0

감사합니다. "_bounds.Contains"는 매우 유용했습니다;) – Alex