Jam*_*erd 3 react-native react-navigation react-navigation-stack
最近几天,我一直在努力向屏幕添加动画标题。我已成功完成此操作,但现在我想默认将其用作标题,而不是将代码复制并粘贴到我希望使用的所有屏幕中。目前,动画标头已在屏幕中实现,如下所示:
渲染标题:
static navigationOptions = ({ navigation }) => {
return {
header: () => {
return (
<SafeAreaView style={{
height: 0,
overflow: 'visible',
}}>
<Animated.View style={{height: 80, width: 80,
transform: [ {translateY: navigation.getParam('headerScrollY', 0)}]
}}>
<TouchableOpacity style={{padding: 20}} onPress={() => navigation.goBack()}>
<Icon.Ionicons style={{color: '#ffffff', width: 50, height: 50}} name={'ios-arrow-round-back'} size={50} />
</TouchableOpacity>
</Animated.View>
</SafeAreaView>
)
}
}
};
Run Code Online (Sandbox Code Playgroud)
设置状态:
constructor() {
super();
this.state = {
headerScrollY: new Animated.Value(0),
};
}
Run Code Online (Sandbox Code Playgroud)
设置动画插值并将值传递给导航道具(这是我稍后在渲染标题时将要访问的内容)
componentWillMount() {
this.props.navigation.setParams({
headerScrollY: this.state.headerScrollY.interpolate({
inputRange: [0, 80],
outputRange: [0, -80],
})
});
}
Run Code Online (Sandbox Code Playgroud)
主要渲染方法,其中“ scrollView”调用“ onScroll”事件以拾取滚动动作
render() {
return (
<ScrollView
style={Styles.wholePageContainer}
showsVerticalScrollIndicator={false}
scrollEventThrottle={16}
onScroll={Animated.event( [{nativeEvent:{contentOffset: {y: this.state.headerScrollY}}}])}
>
...
</ScrollView>
);
}
Run Code Online (Sandbox Code Playgroud)
要设置默认标头,当我使用“ createStackNavigator”时,我必须设置“ defaultNavigationOptions”的“标头”值。我可以用它来创建一个简单的defaultHeader红色,高度为100(下面的代码和图像):
const HomeStack = createStackNavigator({
Home: HomeScreen,
Category: CategoryScreen,
Venue: VenueScreen,
Activity: ActivityScreen,
}, {
headerMode: 'screen',
defaultNavigationOptions: {
header: <View style={{backgroundColor: '#ff0000', height: 100}} />
,
},
});
Run Code Online (Sandbox Code Playgroud)
不幸的是,对于我的动画标题,我需要“导航”道具,因为它用于存储动画值。我尝试了许多方法将其传递给我需要的值,并且想知道是否有人知道如何执行此操作,甚至是否可能,或者是否有人提出任何建议。
多亏了Hend El-Sahli,我现在可以按预期工作代码了。结果(与其他参考一样)与以前一样,但是在每个屏幕的导航选项中删除了标题定义,并且“ createStackNavigator”调用如下:
const HomeStack = createStackNavigator({
Home: HomeScreen,
Category: CategoryScreen,
Venue: VenueScreen,
Activity: ActivityScreen,
}, {
headerMode: 'screen',
defaultNavigationOptions: ({ navigation }) => ({
header:
<SafeAreaView style={{
height: 0,
overflow: 'visible',
}}>
<Animated.View style={{height: 80, width: 80,
transform: [ {translateY: navigation.getParam('headerScrollY', 0)}]
}}>
<TouchableOpacity style={{padding: 20}} onPress={() => navigation.goBack()}>
<Icon.Ionicons style={{color: '#ffffff', width: 50, height: 50}} name={'ios-arrow-round-back'} size={50} />
</TouchableOpacity>
</Animated.View>
</SafeAreaView>
}),
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
574 次 |
| 最近记录: |