Skip to content

Commit

Permalink
Support updating gesture handler config for PanGestureHandler on iOS
Browse files Browse the repository at this point in the history
  • Loading branch information
brentvatne committed Aug 5, 2017
1 parent e21b24e commit d2dd9ea
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 30 deletions.
8 changes: 7 additions & 1 deletion GestureHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,14 @@ function createHandler(handlerName, propTypes = null, config = {}) {
);
}

// TODO: Support gesturehandler config updates
componentDidUpdate(prevProps, prevState) {
// TODO: Support gesturehandler config updates
const viewTag = findNodeHandle(this._viewNode);
RNGestureHandlerModule.updateGestureHandler(
this._handlerTag,
viewTag,
filterConfig(this.props, this.constructor.propTypes, config)
);
}

render() {
Expand Down
2 changes: 1 addition & 1 deletion ios/Handlers/RNGestureHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
- (void)registerGestureHandler:(RNGestureHandler *)gestureHandler forViewWithTag:(NSNumber *)viewTag;
- (void)dropGestureHandlersForViewWithTag:(NSNumber *)viewTag;
- (RNGestureHandler *)findGestureHandlerByRecognizer:(UIGestureRecognizer *)recognizer;

- (RNGestureHandler *)findGestureHandlerForView:(NSNumber *)viewTag withTag:(nonnull NSNumber *)handlerTag;
@end


Expand Down
84 changes: 56 additions & 28 deletions ios/Handlers/RNGestureHandler.m
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#define TEST_MAX_IF_NOT_NAN(value, max) \
(!isnan(max) && ((max < 0 && value < max) || (max >= 0 && value > max)))


#define APPLY_PROP(recognizer, config, type, prop, propName) do { \
id value = config[propName]; \
if (value != nil) recognizer.prop = [RCTConvert type:value]; \
Expand Down Expand Up @@ -96,6 +97,17 @@ - (RNGestureHandler *)findGestureHandlerByRecognizer:(UIGestureRecognizer *)reco
return nil;
}

- (RNGestureHandler *)findGestureHandlerForView:(NSNumber *)viewTag withTag:(nonnull NSNumber *)handlerTag {
NSArray *handlers = _gestureHandlers[viewTag];
for (RNGestureHandler *handler in handlers) {
if (handler.tag == handlerTag) {
return handler;
}
}
return nil;
}


@end


Expand Down Expand Up @@ -223,6 +235,19 @@ - (RNGestureHandler *)findGestureHandlerByRecognizer:(UIGestureRecognizer *)reco
return nil;
}

- (RNGestureHandler *)findGestureHandlerForView:(NSNumber *)viewTag withTag:(nonnull NSNumber *)handlerTag {
RNGestureHandler *handler = [_registry findGestureHandlerForView:viewTag withTag:handlerTag];

if (handler != nil) {
return handler;
}

/* Maybe we want to do something if invalid tag is given? */

return nil;
}


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
Expand Down Expand Up @@ -433,38 +458,41 @@ - (instancetype)initWithTag:(NSNumber *)tag
config:(NSDictionary<NSString *, id> *)config
{
if ((self = [super initWithTag:tag config:config])) {
RNBetterPanGestureRecognizer *recognizer = [[RNBetterPanGestureRecognizer alloc] initWithGestureHandler:self];

APPLY_FLOAT_PROP(minDeltaX);
APPLY_FLOAT_PROP(minDeltaY);
APPLY_FLOAT_PROP(maxDeltaX);
APPLY_FLOAT_PROP(maxDeltaY);
APPLY_FLOAT_PROP(minOffsetX);
APPLY_FLOAT_PROP(minOffsetY);
APPLY_FLOAT_PROP(minVelocityX);
APPLY_FLOAT_PROP(minVelocityY);

APPLY_NAMED_INT_PROP(minimumNumberOfTouches, @"minPointers");
APPLY_NAMED_INT_PROP(maximumNumberOfTouches, @"maxPointers");

id prop = config[@"minDist"];
if (prop != nil) {
CGFloat dist = [RCTConvert CGFloat:prop];
recognizer.minDistSq = dist * dist;
}

prop = config[@"minVelocity"];
if (prop != nil) {
CGFloat velocity = [RCTConvert CGFloat:prop];
recognizer.minVelocitySq = velocity * velocity;
}

[recognizer updateHasCustomActivationCriteria];
_recognizer = recognizer;
_recognizer = [[RNBetterPanGestureRecognizer alloc] initWithGestureHandler:self];
[self setConfig:config];
}
return self;
}

- (void)setConfig:(NSDictionary *)config {
RNBetterPanGestureRecognizer *recognizer = _recognizer;
APPLY_FLOAT_PROP(minDeltaX);
APPLY_FLOAT_PROP(minDeltaY);
APPLY_FLOAT_PROP(maxDeltaX);
APPLY_FLOAT_PROP(maxDeltaY);
APPLY_FLOAT_PROP(minOffsetX);
APPLY_FLOAT_PROP(minOffsetY);
APPLY_FLOAT_PROP(minVelocityX);
APPLY_FLOAT_PROP(minVelocityY);

APPLY_NAMED_INT_PROP(minimumNumberOfTouches, @"minPointers");
APPLY_NAMED_INT_PROP(maximumNumberOfTouches, @"maxPointers");

id prop = config[@"minDist"];
if (prop != nil) {
CGFloat dist = [RCTConvert CGFloat:prop];
recognizer.minDistSq = dist * dist;
}

prop = config[@"minVelocity"];
if (prop != nil) {
CGFloat velocity = [RCTConvert CGFloat:prop];
recognizer.minVelocitySq = velocity * velocity;
}

[recognizer updateHasCustomActivationCriteria];
}

- (RNGestureHandlerEventExtraData *)eventExtraData:(id)recognizer
{
return [RNGestureHandlerEventExtraData
Expand Down
4 changes: 4 additions & 0 deletions ios/RNGestureHandlerManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
tag:(nonnull NSNumber *)handlerTag
config:(NSDictionary *)config;

- (void)updateGestureHandler:(nonnull NSNumber *)handlerTag
forView:(nonnull NSNumber *)viewTag
withConfig:(NSDictionary *)config;

- (void)dropGestureHandlersForView:(nonnull NSNumber *)viewTag;

- (void)handleSetJSResponder:(nonnull NSNumber *)viewTag
Expand Down
11 changes: 11 additions & 0 deletions ios/RNGestureHandlerManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,17 @@ - (void)createGestureHandler:(NSNumber *)viewTag
[self registerRootViewIfNeeded:view];
}

- (void)updateGestureHandler:(nonnull NSNumber *)handlerTag
forView:(nonnull NSNumber *)viewTag
withConfig:(NSDictionary *)config {
RNGestureHandler *gestureHandler = [_registry findGestureHandlerForView:viewTag withTag:handlerTag];

if ([gestureHandler respondsToSelector:@selector(setConfig:)]) {
[gestureHandler performSelector:@selector(setConfig:) withObject:config];
}
}


- (void)dropGestureHandlersForView:(NSNumber *)viewTag
{
[_registry dropGestureHandlersForViewWithTag:viewTag];
Expand Down
7 changes: 7 additions & 0 deletions ios/RNGestureHandlerModule.m
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,13 @@ - (void)setBridge:(RCTBridge *)bridge
}];
}

RCT_EXPORT_METHOD(updateGestureHandler:(nonnull NSNumber *)handlerTag withViewTag:(nonnull NSNumber *)viewTag config:(NSDictionary *)config)
{
[self addOperationBlock:^(RNGestureHandlerManager *manager) {
[manager updateGestureHandler:handlerTag forView:viewTag withConfig:config];
}];
}

RCT_EXPORT_METHOD(dropGestureHandlersForView:(nonnull NSNumber *)viewTag)
{
[self addOperationBlock:^(RNGestureHandlerManager *manager) {
Expand Down

0 comments on commit d2dd9ea

Please sign in to comment.