Search code examples
iosobjective-cios7uigesturerecognizeruipangesturerecognizer

UIScreenEdgePanGestureRecognizer failing to recognize gesture on right edge


I am having an issue where i have defined a UIScreenEdgePanGestureRecognizer to detect pan gesture appearing on the right edge of my device but the gesture is recognized sporadically:

I have the following code:

 _swipeInLeftGestureRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeInFromRightEdge:)];
 _swipeInLeftGestureRecognizer.minimumNumberOfTouches = 1;
 _swipeInLeftGestureRecognizer.maximumNumberOfTouches = 1;
 [_swipeInLeftGestureRecognizer setEdges:UIRectEdgeRight];
 [self.view addGestureRecognizer:_swipeInLeftGestureRecognizer];

- (void)handleSwipeInFromRightEdge:(UIGestureRecognizer*)sender
{
    NSLog(@"swipe from right edge!!!!");
}

The gesture is attached to a view with nothing on it.

Am I missing something?


Solution

  • I've managed to create a workaround. It is pretty straightforward. I've subclassed UIWindow and used touchesBegan/touchesMoved/etc. methods to simulate gesture recognition.

    It works. UIWindow is not rotated automatically, so I have to transform touch coordinates accordingly.

    Here is my version of the transformation:

    - (CGPoint)transformPoint:(CGPoint)point {
        CGPoint pointInView = point;
    
        if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown) {
            pointInView.x = self.bounds.size.width - pointInView.x;
            pointInView.y = self.bounds.size.height - pointInView.y;
        } else if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft) {
            CGFloat x = pointInView.x;
            CGFloat y = pointInView.y;
            pointInView = CGPointMake(self.bounds.size.height - y, x);
        } else if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight) {
            CGFloat x = pointInView.x;
            CGFloat y = pointInView.y;
            pointInView = CGPointMake(y, self.bounds.size.width - x);
        }
        return pointInView;
    }