From 774442efd28ffc4b8a52e7827d46ffedd83e1ab4 Mon Sep 17 00:00:00 2001 From: Charlie Cheever Date: Tue, 31 Mar 2015 16:04:48 -0700 Subject: [PATCH] Adding `scrollWithoutAnimationTo` method for ScrollViews Summary: Implementing the consensus approach from the comments on this PR: https://github.com/facebook/react-native/pull/486 We use a boolean flag in the Obj-C code to determine whether to animate or not, and then provide two public JS functions that call the Obj-C with or without the flag. Closes https://github.com/facebook/react-native/pull/509 Github Author: Charlie Cheever Test Plan: Imported from GitHub, without a `Test Plan:` line. --- Libraries/Components/ScrollView/ScrollView.js | 8 ++++++++ React/Modules/RCTUIManager.m | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Libraries/Components/ScrollView/ScrollView.js b/Libraries/Components/ScrollView/ScrollView.js index ff0ab9056e..fc7fc7223c 100644 --- a/Libraries/Components/ScrollView/ScrollView.js +++ b/Libraries/Components/ScrollView/ScrollView.js @@ -202,6 +202,14 @@ var ScrollView = React.createClass({ ); }, + scrollWithoutAnimationTo: function(destY?: number, destX?: number) { + RCTUIManager.scrollWithoutAnimationTo( + this.getNodeHandle(), + destX || 0, + destY || 0 + ); + }, + render: function() { var contentContainerStyle = [ this.props.horizontal && styles.contentContainerHorizontal, diff --git a/React/Modules/RCTUIManager.m b/React/Modules/RCTUIManager.m index 1daf0652ca..82324f2812 100644 --- a/React/Modules/RCTUIManager.m +++ b/React/Modules/RCTUIManager.m @@ -1051,13 +1051,27 @@ static void RCTMeasureLayout(RCTShadowView *view, [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ UIView *view = viewRegistry[reactTag]; if ([view conformsToProtocol:@protocol(RCTScrollableProtocol)]) { - [(id)view scrollToOffset:CGPointMake([offsetX floatValue], [offsetY floatValue])]; + [(id)view scrollToOffset:CGPointMake([offsetX floatValue], [offsetY floatValue]) animated:YES]; } else { RCTLogError(@"tried to scrollToOffset: on non-RCTScrollableProtocol view %@ with tag %@", view, reactTag); } }]; } +- (void)scrollWithoutAnimationToOffsetWithView:(NSNumber *)reactTag scrollToOffsetX:(NSNumber *)offsetX offsetY:(NSNumber *)offsetY +{ + RCT_EXPORT(scrollWithoutAnimationTo); + + [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ + UIView *view = viewRegistry[reactTag]; + if ([view conformsToProtocol:@protocol(RCTScrollableProtocol)]) { + [(id)view scrollToOffset:CGPointMake([offsetX floatValue], [offsetY floatValue]) animated:NO]; + } else { + RCTLogError(@"tried to scrollToOffset: on non-RCTScrollableProtocol view %@ with tag %@", view, reactTag); + } + }]; +} + - (void)zoomToRectWithView:(NSNumber *)reactTag rect:(NSDictionary *)rectDict { RCT_EXPORT(zoomToRect);