Domanda

Is it possible to set borders for a PanGestureRecognizer so it can only pan an image in a limited area/view?

thank you very mutch ;)

È stato utile?

Soluzione

You can implement the delegate methods for the UIPanGestureRecognizer. Check to see if the location of the gesture is in the bounds you are interested in. For the should* methods you can return false to cancel the gesture. Once the gesture has been started you can cancel it by setting the State property to Cancelled.

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;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top