|
|
|
@ -5,7 +5,6 @@
|
|
|
|
|
*/
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
var ArrayOfPropType = require('ArrayOfPropType');
|
|
|
|
|
var EdgeInsetsPropType = require('EdgeInsetsPropType');
|
|
|
|
|
var Platform = require('Platform');
|
|
|
|
|
var PointPropType = require('PointPropType');
|
|
|
|
@ -22,11 +21,11 @@ var View = require('View');
|
|
|
|
|
var ViewStylePropTypes = require('ViewStylePropTypes');
|
|
|
|
|
|
|
|
|
|
var createReactIOSNativeComponentClass = require('createReactIOSNativeComponentClass');
|
|
|
|
|
var deepDiffer = require('deepDiffer');
|
|
|
|
|
var flattenStyle = require('flattenStyle');
|
|
|
|
|
var insetsDiffer = require('insetsDiffer');
|
|
|
|
|
var invariant = require('invariant');
|
|
|
|
|
var merge = require('merge');
|
|
|
|
|
var nativePropType = require('nativePropType');
|
|
|
|
|
var validAttributesFromPropTypes = require('validAttributesFromPropTypes');
|
|
|
|
|
var pointsDiffer = require('pointsDiffer');
|
|
|
|
|
|
|
|
|
|
var PropTypes = React.PropTypes;
|
|
|
|
|
|
|
|
|
@ -60,37 +59,37 @@ var ScrollView = React.createClass({
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
propTypes: {
|
|
|
|
|
automaticallyAdjustContentInsets: nativePropType(PropTypes.bool), // true
|
|
|
|
|
contentInset: nativePropType(EdgeInsetsPropType), // zeroes
|
|
|
|
|
contentOffset: nativePropType(PointPropType), // zeroes
|
|
|
|
|
automaticallyAdjustContentInsets: PropTypes.bool, // true
|
|
|
|
|
contentInset: EdgeInsetsPropType, // zeros
|
|
|
|
|
contentOffset: PointPropType, // zeros
|
|
|
|
|
onScroll: PropTypes.func,
|
|
|
|
|
onScrollAnimationEnd: PropTypes.func,
|
|
|
|
|
scrollEnabled: nativePropType(PropTypes.bool), // true
|
|
|
|
|
scrollIndicatorInsets: nativePropType(EdgeInsetsPropType), // zeros
|
|
|
|
|
showsHorizontalScrollIndicator: nativePropType(PropTypes.bool),
|
|
|
|
|
showsVerticalScrollIndicator: nativePropType(PropTypes.bool),
|
|
|
|
|
scrollEnabled: PropTypes.bool, // tre
|
|
|
|
|
scrollIndicatorInsets: EdgeInsetsPropType, // zeros
|
|
|
|
|
showsHorizontalScrollIndicator: PropTypes.bool,
|
|
|
|
|
showsVerticalScrollIndicator: PropTypes.bool,
|
|
|
|
|
style: StyleSheetPropType(ViewStylePropTypes),
|
|
|
|
|
throttleScrollCallbackMS: nativePropType(PropTypes.number), // null
|
|
|
|
|
throttleScrollCallbackMS: PropTypes.number, // null
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* When true, the scroll view bounces horizontally when it reaches the end
|
|
|
|
|
* even if the content is smaller than the scroll view itself. The default
|
|
|
|
|
* value is true when `horizontal={true}` and false otherwise.
|
|
|
|
|
*/
|
|
|
|
|
alwaysBounceHorizontal: nativePropType(PropTypes.bool),
|
|
|
|
|
alwaysBounceHorizontal: PropTypes.bool,
|
|
|
|
|
/**
|
|
|
|
|
* When true, the scroll view bounces vertically when it reaches the end
|
|
|
|
|
* even if the content is smaller than the scroll view itself. The default
|
|
|
|
|
* value is false when `horizontal={true}` and true otherwise.
|
|
|
|
|
*/
|
|
|
|
|
alwaysBounceVertical: nativePropType(PropTypes.bool),
|
|
|
|
|
alwaysBounceVertical: PropTypes.bool,
|
|
|
|
|
/**
|
|
|
|
|
* When true, the scroll view automatically centers the content when the
|
|
|
|
|
* content is smaller than the scroll view bounds; when the content is
|
|
|
|
|
* larger than the scroll view, this property has no effect. The default
|
|
|
|
|
* value is false.
|
|
|
|
|
*/
|
|
|
|
|
centerContent: nativePropType(PropTypes.bool),
|
|
|
|
|
centerContent: PropTypes.bool,
|
|
|
|
|
/**
|
|
|
|
|
* These styles will be applied to the scroll view content container which
|
|
|
|
|
* wraps all of the child views. Example:
|
|
|
|
@ -113,7 +112,7 @@ var ScrollView = React.createClass({
|
|
|
|
|
* - Normal: 0.998 (the default)
|
|
|
|
|
* - Fast: 0.9
|
|
|
|
|
*/
|
|
|
|
|
decelerationRate: nativePropType(PropTypes.number),
|
|
|
|
|
decelerationRate: PropTypes.number,
|
|
|
|
|
/**
|
|
|
|
|
* When true, the scroll view's children are arranged horizontally in a row
|
|
|
|
|
* instead of vertically in a column. The default value is false.
|
|
|
|
@ -138,26 +137,26 @@ var ScrollView = React.createClass({
|
|
|
|
|
* taps, and the keyboard will not dismiss automatically. The default value
|
|
|
|
|
* is false.
|
|
|
|
|
*/
|
|
|
|
|
keyboardShouldPersistTaps: nativePropType(PropTypes.bool),
|
|
|
|
|
keyboardShouldPersistTaps: PropTypes.bool,
|
|
|
|
|
/**
|
|
|
|
|
* The maximum allowed zoom scale. The default value is 1.0.
|
|
|
|
|
*/
|
|
|
|
|
maximumZoomScale: nativePropType(PropTypes.number),
|
|
|
|
|
maximumZoomScale: PropTypes.number,
|
|
|
|
|
/**
|
|
|
|
|
* The minimum allowed zoom scale. The default value is 1.0.
|
|
|
|
|
*/
|
|
|
|
|
minimumZoomScale: nativePropType(PropTypes.number),
|
|
|
|
|
minimumZoomScale: PropTypes.number,
|
|
|
|
|
/**
|
|
|
|
|
* When true, the scroll view stops on multiples of the scroll view's size
|
|
|
|
|
* when scrolling. This can be used for horizontal pagination. The default
|
|
|
|
|
* value is false.
|
|
|
|
|
*/
|
|
|
|
|
pagingEnabled: nativePropType(PropTypes.bool),
|
|
|
|
|
pagingEnabled: PropTypes.bool,
|
|
|
|
|
/**
|
|
|
|
|
* When true, the scroll view scrolls to top when the status bar is tapped.
|
|
|
|
|
* The default value is true.
|
|
|
|
|
*/
|
|
|
|
|
scrollsToTop: nativePropType(PropTypes.bool),
|
|
|
|
|
scrollsToTop: PropTypes.bool,
|
|
|
|
|
/**
|
|
|
|
|
* An array of child indices determining which children get docked to the
|
|
|
|
|
* top of the screen when scrolling. For example, passing
|
|
|
|
@ -165,7 +164,7 @@ var ScrollView = React.createClass({
|
|
|
|
|
* top of the scroll view. This property is not supported in conjunction
|
|
|
|
|
* with `horizontal={true}`.
|
|
|
|
|
*/
|
|
|
|
|
stickyHeaderIndices: nativePropType(ArrayOfPropType(PropTypes.number)),
|
|
|
|
|
stickyHeaderIndices: PropTypes.arrayOf(PropTypes.number),
|
|
|
|
|
/**
|
|
|
|
|
* Experimental: When true, offscreen child views (whose `overflow` value is
|
|
|
|
|
* `hidden`) are removed from their native backing superview when offscreen.
|
|
|
|
@ -176,7 +175,7 @@ var ScrollView = React.createClass({
|
|
|
|
|
/**
|
|
|
|
|
* The current scale of the scroll view content. The default value is 1.0.
|
|
|
|
|
*/
|
|
|
|
|
zoomScale: nativePropType(PropTypes.number),
|
|
|
|
|
zoomScale: PropTypes.number,
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
mixins: [ScrollResponder.Mixin],
|
|
|
|
@ -250,32 +249,31 @@ var ScrollView = React.createClass({
|
|
|
|
|
this.props.alwaysBounceVertical :
|
|
|
|
|
!this.props.horizontal;
|
|
|
|
|
|
|
|
|
|
var props = merge(
|
|
|
|
|
this.props, {
|
|
|
|
|
alwaysBounceHorizontal,
|
|
|
|
|
alwaysBounceVertical,
|
|
|
|
|
keyboardDismissMode: this.props.keyboardDismissMode ?
|
|
|
|
|
keyboardDismissModeConstants[this.props.keyboardDismissMode] :
|
|
|
|
|
undefined,
|
|
|
|
|
style: [styles.base, this.props.style],
|
|
|
|
|
onTouchStart: this.scrollResponderHandleTouchStart,
|
|
|
|
|
onTouchMove: this.scrollResponderHandleTouchMove,
|
|
|
|
|
onTouchEnd: this.scrollResponderHandleTouchEnd,
|
|
|
|
|
onScrollBeginDrag: this.scrollResponderHandleScrollBeginDrag,
|
|
|
|
|
onScrollEndDrag: this.scrollResponderHandleScrollEndDrag,
|
|
|
|
|
onMomentumScrollBegin: this.scrollResponderHandleMomentumScrollBegin,
|
|
|
|
|
onMomentumScrollEnd: this.scrollResponderHandleMomentumScrollEnd,
|
|
|
|
|
onStartShouldSetResponder: this.scrollResponderHandleStartShouldSetResponder,
|
|
|
|
|
onStartShouldSetResponderCapture: this.scrollResponderHandleStartShouldSetResponderCapture,
|
|
|
|
|
onScrollShouldSetResponder: this.scrollResponderHandleScrollShouldSetResponder,
|
|
|
|
|
onScroll: this.scrollResponderHandleScroll,
|
|
|
|
|
onResponderGrant: this.scrollResponderHandleResponderGrant,
|
|
|
|
|
onResponderTerminationRequest: this.scrollResponderHandleTerminationRequest,
|
|
|
|
|
onResponderTerminate: this.scrollResponderHandleTerminate,
|
|
|
|
|
onResponderRelease: this.scrollResponderHandleResponderRelease,
|
|
|
|
|
onResponderReject: this.scrollResponderHandleResponderReject,
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
var props = {
|
|
|
|
|
...this.props,
|
|
|
|
|
alwaysBounceHorizontal,
|
|
|
|
|
alwaysBounceVertical,
|
|
|
|
|
keyboardDismissMode: this.props.keyboardDismissMode ?
|
|
|
|
|
keyboardDismissModeConstants[this.props.keyboardDismissMode] :
|
|
|
|
|
undefined,
|
|
|
|
|
style: [styles.base, this.props.style],
|
|
|
|
|
onTouchStart: this.scrollResponderHandleTouchStart,
|
|
|
|
|
onTouchMove: this.scrollResponderHandleTouchMove,
|
|
|
|
|
onTouchEnd: this.scrollResponderHandleTouchEnd,
|
|
|
|
|
onScrollBeginDrag: this.scrollResponderHandleScrollBeginDrag,
|
|
|
|
|
onScrollEndDrag: this.scrollResponderHandleScrollEndDrag,
|
|
|
|
|
onMomentumScrollBegin: this.scrollResponderHandleMomentumScrollBegin,
|
|
|
|
|
onMomentumScrollEnd: this.scrollResponderHandleMomentumScrollEnd,
|
|
|
|
|
onStartShouldSetResponder: this.scrollResponderHandleStartShouldSetResponder,
|
|
|
|
|
onStartShouldSetResponderCapture: this.scrollResponderHandleStartShouldSetResponderCapture,
|
|
|
|
|
onScrollShouldSetResponder: this.scrollResponderHandleScrollShouldSetResponder,
|
|
|
|
|
onScroll: this.scrollResponderHandleScroll,
|
|
|
|
|
onResponderGrant: this.scrollResponderHandleResponderGrant,
|
|
|
|
|
onResponderTerminationRequest: this.scrollResponderHandleTerminationRequest,
|
|
|
|
|
onResponderTerminate: this.scrollResponderHandleTerminate,
|
|
|
|
|
onResponderRelease: this.scrollResponderHandleResponderRelease,
|
|
|
|
|
onResponderReject: this.scrollResponderHandleResponderReject,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var ScrollViewClass;
|
|
|
|
|
if (Platform.OS === 'ios') {
|
|
|
|
@ -306,28 +304,44 @@ var styles = StyleSheet.create({
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var validAttributes = {
|
|
|
|
|
...ReactIOSViewAttributes.UIView,
|
|
|
|
|
alwaysBounceHorizontal: true,
|
|
|
|
|
alwaysBounceVertical: true,
|
|
|
|
|
automaticallyAdjustContentInsets: true,
|
|
|
|
|
centerContent: true,
|
|
|
|
|
contentInset: insetsDiffer,
|
|
|
|
|
contentOffset: pointsDiffer,
|
|
|
|
|
decelerationRate: true,
|
|
|
|
|
horizontal: true,
|
|
|
|
|
keyboardDismissMode: true,
|
|
|
|
|
keyboardShouldPersistTaps: true,
|
|
|
|
|
maximumZoomScale: true,
|
|
|
|
|
minimumZoomScale: true,
|
|
|
|
|
pagingEnabled: true,
|
|
|
|
|
removeClippedSubviews: true,
|
|
|
|
|
scrollEnabled: true,
|
|
|
|
|
scrollIndicatorInsets: insetsDiffer,
|
|
|
|
|
scrollsToTop: true,
|
|
|
|
|
showsHorizontalScrollIndicator: true,
|
|
|
|
|
showsVerticalScrollIndicator: true,
|
|
|
|
|
stickyHeaderIndices: deepDiffer,
|
|
|
|
|
throttleScrollCallbackMS: true,
|
|
|
|
|
zoomScale: true,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (Platform.OS === 'android') {
|
|
|
|
|
var AndroidScrollView = createReactIOSNativeComponentClass({
|
|
|
|
|
validAttributes: merge(
|
|
|
|
|
ReactIOSViewAttributes.UIView,
|
|
|
|
|
validAttributesFromPropTypes(ScrollView.propTypes)
|
|
|
|
|
),
|
|
|
|
|
validAttributes: validAttributes,
|
|
|
|
|
uiViewClassName: 'AndroidScrollView',
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var AndroidHorizontalScrollView = createReactIOSNativeComponentClass({
|
|
|
|
|
validAttributes: merge(
|
|
|
|
|
ReactIOSViewAttributes.UIView,
|
|
|
|
|
validAttributesFromPropTypes(ScrollView.propTypes)
|
|
|
|
|
),
|
|
|
|
|
validAttributes: validAttributes,
|
|
|
|
|
uiViewClassName: 'AndroidHorizontalScrollView',
|
|
|
|
|
});
|
|
|
|
|
} else if (Platform.OS === 'ios') {
|
|
|
|
|
var RCTScrollView = createReactIOSNativeComponentClass({
|
|
|
|
|
validAttributes: merge(
|
|
|
|
|
ReactIOSViewAttributes.UIView,
|
|
|
|
|
validAttributesFromPropTypes(ScrollView.propTypes)
|
|
|
|
|
),
|
|
|
|
|
validAttributes: validAttributes,
|
|
|
|
|
uiViewClassName: 'RCTScrollView',
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|