PAN Gesture is crashing while taking the location of touch in view in iOS

I just do a sample to check the pan gesture.

The pan gesture is detecting and working fine.

But whenever i give a secondPoint in the pan gesture like CGPoint secondPoint = [sender locationOfTouch:1 inView:self.imageView]; it is crashing.

The console is giving the message

 *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[UIPanGestureRecognizer locationOfTouch:inView:]: index (1) beyond bounds (1).'

When I use panGestureRecognizer.maximumNumberOfTouches = 1; panGestureRecognizer.minimumNumberOfTouches =1; still it is crashing.

When I use panGestureRecognizer.maximumNumberOfTouches = 2; panGestureRecognizer.minimumNumberOfTouches = 2; then it is not entering into the

- (void)panGestureHandler:(UIPanGestureRecognizer *)sender method.

Can anyone please guide me where im going wrong.

Thanks in advance.Hoping for your help.

I tried in this way.

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGestureHandler:)];
     panGestureRecognizer.maximumNumberOfTouches = 2;
     [self.imageView addGestureRecognizer:panGestureRecognizer];

}
- (void)panGestureHandler:(UIPanGestureRecognizer *)sender
{
    if ([sender state] == UIGestureRecognizerStateBegan )
    {
        CGPoint firstPoint = [sender locationOfTouch:0 inView:self.imageView];
        CGPoint secondPoint = [sender locationOfTouch:1 inView:self.imageView];
    }
    else if ([sender state] ==UIGestureRecognizerStateEnded ) 
    {
    }

}

Answers


You provided a maximumNumberOfTouches, but no minimumNumberOfTouches. I.e., the gesture can be recognized after the first touch. In this case, no second touch may exist, and your index 1 (referring the second element) exceeds the array bounds.


I too came across this error despite the max and min number of touches being set. I'm subclassing my gesture recognizer and figure it has something to do with that. I got around it by simply checking numberOfTouches before referencing it:

if ([gestureRecognizer numberOfTouches] > 0) {
    CGPoint point = [gestureRecognizer locationOfTouch:0 inView:self.superview.window];
}

Hope this helps someone!


The error is telling you that on this line:

    CGPoint secondPoint = [sender locationOfTouch:1 inView:self.imageView];

index "1" is out of locationOfTouches bounds. So, as stated above, you need to make sure you set minimumNumberOfTouches

Additionally, you will want to enabled user interaction on the image view in order for it to respond to gesture recognizers.

[self.imageView setUserInteractionEnabled:YES];

When the max/min touches are set, they determines whether it is a valid gesture to begin sending action but they are not the criteria for ending it. For example, if you set the max/min to 2. If a two-finger-touch is detected, the handler starts receiving the action. Leaving one finger will not end the gesture. The handler still receive action with change-state and one touch. In the end, the handler receives 0 touch and end-state.


Need Your Help

Sending mail with html table format using awk command

bash shell awk

I am trying to send mail in html table format using awk command as below: