From 40e264d9595d4cd69923cd68a685ec4d5c57bd28 Mon Sep 17 00:00:00 2001 From: Nicolas Djambazian Date: Sun, 6 Aug 2017 16:56:30 +0200 Subject: [PATCH] try to Go Back to the first implentation --- example/Pages/Avignon.js | 2 +- src/ImageHeaderScrollView.js | 109 ++++++++++++----------------------- 2 files changed, 38 insertions(+), 73 deletions(-) diff --git a/example/Pages/Avignon.js b/example/Pages/Avignon.js index 4c1f0c1..876e782 100644 --- a/example/Pages/Avignon.js +++ b/example/Pages/Avignon.js @@ -17,7 +17,7 @@ class BasicUsage extends React.Component { minOverlayOpacity={0.4} renderHeader={() => } - renderTouchableFixedForeground={() => + renderFixedForeground={() => console.log('tap!!')} style={styles.button}> Discover Avignon now! diff --git a/src/ImageHeaderScrollView.js b/src/ImageHeaderScrollView.js index 455d7dd..a5eb193 100644 --- a/src/ImageHeaderScrollView.js +++ b/src/ImageHeaderScrollView.js @@ -16,7 +16,6 @@ export type Props = { renderFixedForeground: () => React.Element, renderForeground: () => React.Element, renderHeader: () => React.Element, - renderTouchableFixedForeground: () => React.Element, }; export type DefaultProps = { @@ -27,8 +26,6 @@ export type DefaultProps = { maxOverlayOpacity: number, minHeight: number, minOverlayOpacity: number, - renderFixedForeground: () => React.Element, - renderForeground: () => React.Element, renderHeader: () => React.Element, }; @@ -50,8 +47,6 @@ class ImageHeaderScrollView extends Component { maxOverlayOpacity: 0.3, minHeight: 80, minOverlayOpacity: 0, - renderFixedForeground: () => , - renderForeground: () => , renderHeader: () => , }; @@ -106,13 +101,14 @@ class ImageHeaderScrollView extends Component { ]); const headerScale = this.state.scrollY.interpolate({ - inputRange: [-this.props.maxHeight, 0], - outputRange: [3, 1], + inputRange: [-2 * this.props.maxHeight, 0], + outputRange: [5, 1], extrapolate: 'clamp', }); + const height = this.interpolateOnImageHeight([this.props.maxHeight, this.props.minHeight]); const headerTransformStyle = { - height: this.props.maxHeight, + height, transform: [{ scale: headerScale }], }; @@ -121,18 +117,33 @@ class ImageHeaderScrollView extends Component { { opacity: overlayOpacity, backgroundColor: this.props.overlayColor }, ]; + const absoluteContainerStyle = { + position: 'absolute', + top: 0, + left: 0, + right: 0, + height: this.props.maxHeight, + }; + return ( - {this.props.renderHeader()} - - - {this.props.renderFixedForeground()} + + {this.props.renderHeader()} + + {this.props.renderFixedForeground && + + {this.props.renderFixedForeground()} + } ); } renderForeground() { + if (!this.props.renderForeground) { + return null; + } + const headerTranslate = this.state.scrollY.interpolate({ inputRange: [0, this.props.maxHeight * 2], outputRange: [0, -this.props.maxHeight * 2 * this.props.foregroundParallaxRatio], @@ -152,31 +163,6 @@ class ImageHeaderScrollView extends Component { ); } - renderTouchableFixedForeground() { - if (!this.props.renderTouchableFixedForeground) { - return ; - } - - const height = this.interpolateOnImageHeight([this.props.maxHeight, this.props.minHeight]); - - const headerScale = this.state.scrollY.interpolate({ - inputRange: [-this.props.maxHeight, 0], - outputRange: [3, 1], - extrapolate: 'clamp', - }); - - const headerTransformStyle = { - height, - transform: [{ scale: headerScale }], - }; - - return ( - - {this.props.renderTouchableFixedForeground()} - - ); - } - render() { const { children, @@ -191,18 +177,10 @@ class ImageHeaderScrollView extends Component { renderFixedForeground, renderForeground, renderHeader, - renderTouchableFixedForeground, ...scrollViewProps } = this.props; - const headerScrollDistance = this.interpolateOnImageHeight([maxHeight, maxHeight - minHeight]); - const topMargin = this.interpolateOnImageHeight([0, minHeight]); - - const childrenContainerStyle = StyleSheet.flatten([ - { transform: [{ translateY: headerScrollDistance }] }, - { backgroundColor: 'white', paddingBottom: maxHeight }, - childrenStyle, - ]); + const childrenContainerStyle = StyleSheet.flatten([childrenStyle, { paddingTop: maxHeight }]); return ( { ref={ref => (this.container = ref)} onLayout={() => this.container.measureInWindow((x, y) => this.setState({ pageY: y }))} > + (this.scrollViewRef = ref)} + style={styles.container} + scrollEventThrottle={16} + onScroll={Animated.event([{ nativeEvent: { contentOffset: { y: this.state.scrollY } } }])} + {...scrollViewProps} + > + + {children} + + {this.renderHeader()} - - (this.scrollViewRef = ref)} - style={styles.container} - scrollEventThrottle={16} - onScroll={Animated.event([ - { nativeEvent: { contentOffset: { y: this.state.scrollY } } }, - ])} - {...scrollViewProps} - > - - {children} - - - - {this.renderTouchableFixedForeground()} {this.renderForeground()} ); @@ -254,19 +227,11 @@ const styles = StyleSheet.create({ justifyContent: 'center', }, overlay: { - position: 'absolute', - top: 0, - right: 0, - left: 0, - bottom: 0, + ...StyleSheet.absoluteFillObject, zIndex: 100, }, fixedForeground: { - position: 'absolute', - top: 0, - right: 0, - left: 0, - bottom: 0, + ...StyleSheet.absoluteFillObject, zIndex: 101, }, touchableFixedForeground: {