如何在 React 导航 (3.x) 中为全屏模态提供透明背景?
How to give a transparent background to a fullScreen modal in react navigation (3.x)?
如何在反应导航中为全屏模式提供透明背景(3.x)。给出的解决方案在新版本的反应导航中不起作用。
我想要在另一个屏幕上显示的新全屏模式中使用透明颜色。
const MainNavigator = createStackNavigator(
{
BrowserHome: { screen: BrowserHome },
ImageDetailModal: {
screen: ImageDetail,
navigationOptions: {
header: null
}
}
},
{
mode: "modal",
cardStyle: {
backgroundColor: "transparent",
opacity: 1
}
}
);
const AppContainer = createAppContainer(MainNavigator);
export default AppContainer;
虽然我在 'BrowserHome' 组件上显示的图像细节组件是:
export default class ImageDetail extends React.Component {
render() {
const modalColor = this.props.navigation.getParam("modalColor");
return (
<View
style={{ flex: 1, flexDirection: "column", justifyContent: "flex-end" }}
>
<View
style={{
height: "50%",
width: "100%",
backgroundColor: "red",
justifyContent: "center"
}}
>
<Text>Testing a modal with transparent background</Text>
</View>
</View>
);
}
}
您现在可以删除 cardStyle
对象并改为设置 transparentCard: true
:
const MainNavigator = createStackNavigator(
{
BrowserHome: { screen: BrowserHome },
ImageDetailModal: {
screen: ImageDetail,
navigationOptions: {
header: null
}
}
},
{
mode: "modal",
transparentCard: true
})
https://reactnavigation.org/docs/en/stack-navigator.html#stacknavigatorconfig
在 createStackNavigator
中添加行 transparentCard: true
和 cardStyle: {opacity: 1}
const MainStack = createStackNavigator({
Tabs: TabNavigator,
Modal: ModalScreen,
},{
headerMode: 'none',
mode: 'modal',
transparentCard: true,
cardStyle: { opacity: 1 }
});
React 导航 5 倍
如果您更新到 React Navigation 版本 5x,这里有一个更新。
代码示例
<Stack.Navigator
screenOptions={{
headerShown: false,
cardStyle: { backgroundColor: 'transparent' },
cardOverlayEnabled: true,
cardStyleInterpolator: ({ current: { progress } }) => ({
cardStyle: {
opacity: progress.interpolate({
inputRange: [0, 0.5, 0.9, 1],
outputRange: [0, 0.25, 0.7, 1],
}),
},
overlayStyle: {
opacity: progress.interpolate({
inputRange: [0, 1],
outputRange: [0, 0.5],
extrapolate: 'clamp',
}),
},
}),
}}
mode="modal"
>
<Stack.Screen name="Home" component={HomeStack} />
<Stack.Screen name="Modal" component={ModalScreen} />
</Stack.Navigator>
这里的属性 cardOverlayEnabled
和 headerShown
是 optionals。这将取决于您要实现的目标。
React 导航 6x
将 screenOptions.presentation
设置为“transparentModal”。
如何在反应导航中为全屏模式提供透明背景(3.x)。给出的解决方案
const MainNavigator = createStackNavigator(
{
BrowserHome: { screen: BrowserHome },
ImageDetailModal: {
screen: ImageDetail,
navigationOptions: {
header: null
}
}
},
{
mode: "modal",
cardStyle: {
backgroundColor: "transparent",
opacity: 1
}
}
);
const AppContainer = createAppContainer(MainNavigator);
export default AppContainer;
虽然我在 'BrowserHome' 组件上显示的图像细节组件是:
export default class ImageDetail extends React.Component {
render() {
const modalColor = this.props.navigation.getParam("modalColor");
return (
<View
style={{ flex: 1, flexDirection: "column", justifyContent: "flex-end" }}
>
<View
style={{
height: "50%",
width: "100%",
backgroundColor: "red",
justifyContent: "center"
}}
>
<Text>Testing a modal with transparent background</Text>
</View>
</View>
);
}
}
您现在可以删除 cardStyle
对象并改为设置 transparentCard: true
:
const MainNavigator = createStackNavigator(
{
BrowserHome: { screen: BrowserHome },
ImageDetailModal: {
screen: ImageDetail,
navigationOptions: {
header: null
}
}
},
{
mode: "modal",
transparentCard: true
})
https://reactnavigation.org/docs/en/stack-navigator.html#stacknavigatorconfig
在 createStackNavigator
中添加行transparentCard: true
和 cardStyle: {opacity: 1}
const MainStack = createStackNavigator({
Tabs: TabNavigator,
Modal: ModalScreen,
},{
headerMode: 'none',
mode: 'modal',
transparentCard: true,
cardStyle: { opacity: 1 }
});
React 导航 5 倍
如果您更新到 React Navigation 版本 5x,这里有一个更新。
代码示例
<Stack.Navigator
screenOptions={{
headerShown: false,
cardStyle: { backgroundColor: 'transparent' },
cardOverlayEnabled: true,
cardStyleInterpolator: ({ current: { progress } }) => ({
cardStyle: {
opacity: progress.interpolate({
inputRange: [0, 0.5, 0.9, 1],
outputRange: [0, 0.25, 0.7, 1],
}),
},
overlayStyle: {
opacity: progress.interpolate({
inputRange: [0, 1],
outputRange: [0, 0.5],
extrapolate: 'clamp',
}),
},
}),
}}
mode="modal"
>
<Stack.Screen name="Home" component={HomeStack} />
<Stack.Screen name="Modal" component={ModalScreen} />
</Stack.Navigator>
这里的属性 cardOverlayEnabled
和 headerShown
是 optionals。这将取决于您要实现的目标。
React 导航 6x
将 screenOptions.presentation
设置为“transparentModal”。