// // RNLongPressHandler.m // RNGestureHandler // // Created by Krzysztof Magiera on 12/10/2017. // Copyright © 2017 Software Mansion. All rights reserved. // #import "RNLongPressHandler.h" #import #import @interface RNBetterLongPressGestureRecognizer : UILongPressGestureRecognizer - (id)initWithGestureHandler:(RNGestureHandler*)gestureHandler; @end @implementation RNBetterLongPressGestureRecognizer { __weak RNGestureHandler *_gestureHandler; } - (id)initWithGestureHandler:(RNGestureHandler*)gestureHandler { if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) { _gestureHandler = gestureHandler; } return self; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesMoved:touches withEvent:event]; if (_gestureHandler.shouldCancelWhenOutside) { CGPoint pt = [self locationInView:self.view]; if (!CGRectContainsPoint(self.view.bounds, pt)) { self.enabled = NO; self.enabled = YES; } } } @end @implementation RNLongPressGestureHandler - (instancetype)initWithTag:(NSNumber *)tag { if ((self = [super initWithTag:tag])) { _recognizer = [[RNBetterLongPressGestureRecognizer alloc] initWithGestureHandler:self]; } return self; } - (void)configure:(NSDictionary *)config { [super configure:config]; UILongPressGestureRecognizer *recognizer = (UILongPressGestureRecognizer *)_recognizer; id prop = config[@"minDurationMs"]; if (prop != nil) { recognizer.minimumPressDuration = [RCTConvert CGFloat:prop] / 1000.0; } prop = config[@"maxDist"]; if (prop != nil) { recognizer.allowableMovement = [RCTConvert CGFloat:prop]; } } - (RNGestureHandlerState)state { // For long press recognizer we treat "Began" state as "active" // as it changes its state to "Began" as soon as the the minimum // hold duration timeout is reached, whereas state "Changed" is // only set after "Began" phase if there is some movement. if (_recognizer.state == UIGestureRecognizerStateBegan) { return RNGestureHandlerStateActive; } return [super state]; } @end