在React Native iOS中,我想滑入和滑出<View/>
- 假设它是这样实现的 - 如下图所示。
答案 0 :(得分:6)
结果如下:
这是完整的代码,使其工作。它不适用于RNPlay,因为它们的版本不支持zIndex。
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
StatusBar,
View,
TouchableHighlight,
Animated
} from 'react-native';
class playground extends Component {
constructor(props) {
super(props);
this.state = {
slideAnimation: new Animated.Value(22),
};
}
_showNotification() {
StatusBar.setHidden(true, 'slide');
Animated.timing(
this.state.slideAnimation,
{toValue: 0, duration: 300}
).start();
}
_hideNotification() {
StatusBar.setHidden(false, 'slide');
Animated.timing(
this.state.slideAnimation,
{toValue: 22, duration: 300}
).start();
}
render() {
return (
<View style={styles.container}>
<StatusBar
barStyle="default"
/>
<Animated.View style={[styles.notification, {top: this.state.slideAnimation}]}>
<Text style={styles.notificationText}>This is a notification</Text>
</Animated.View>
<View style={styles.body}>
<TouchableHighlight underlayColor="#D1EEFC" style={styles.button} onPress={()=> { this._showNotification() }}>
<Text style={styles.buttonText}>
Show Notification
</Text>
</TouchableHighlight>
<TouchableHighlight underlayColor="#D1EEFC" style={styles.button} onPress={()=> { this._hideNotification() }}>
<Text style={styles.buttonText}>
Hide Notification
</Text>
</TouchableHighlight>
</View>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#F5FCFF',
},
body: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF', //This is important to hide the notification, because it is actually behind it
marginTop: 22, //This will make a gap of the same height in the top, so that the notification can slide in it.
},
button: {
padding: 10,
borderColor: '#D1EEFC',
borderWidth: 2,
borderRadius: 5,
marginBottom: 22,
},
buttonText: {
fontSize: 17,
textAlign: 'center',
color: '#007AFF'
},
notification: {
backgroundColor: 'black',
position: 'absolute',
top: 22, //Move the notification downwards to setup the scene.
left: 0,
right: 0,
height: 22, //Make it the same height as the status bar
zIndex: 0, //This is what makes the notification benhind the container
},
notificationText: {
color: 'yellow',
textAlign: 'center',
fontSize: 11,
marginTop: 4
},
});
AppRegistry.registerComponent('playground', () => playground);
我设法通过将通知包含在样式溢出的视图中来使掩蔽概念起作用:'hidden'。容器设置为高度:22。因此,如果通知甚至移动1pt,则看起来好像通知在后台滑动。
结果如下:
以下是代码:
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
StatusBar,
View,
TouchableHighlight,
Animated,
Image
} from 'react-native';
class playground extends Component {
constructor(props) {
super(props);
this.state = {
slideAnimation: new Animated.Value(22),
};
}
_showNotification() {
StatusBar.setHidden(true, 'slide');
Animated.timing(
this.state.slideAnimation,
{toValue: 0, duration: 300}
).start();
}
_hideNotification() {
StatusBar.setHidden(false, 'slide');
Animated.timing(
this.state.slideAnimation,
{toValue: 22, duration: 300}
).start();
}
render() {
return (
<View style={styles.container}>
<Image source={require('./img/splash.png')} style={styles.backgroundImage} resizeMode='cover' />
<StatusBar
barStyle="default"
/>
<View style={styles.notificationContainer}>
<Animated.View style={[styles.notification, {top: this.state.slideAnimation}]}>
<Text style={styles.notificationText}>This is a notification</Text>
</Animated.View>
</View>
<TouchableHighlight underlayColor="#D1EEFC" style={styles.button} onPress={()=> { this._showNotification() }}>
<Text style={styles.buttonText}>
Show Notification
</Text>
</TouchableHighlight>
<TouchableHighlight underlayColor="#D1EEFC" style={styles.button} onPress={()=> { this._hideNotification() }}>
<Text style={styles.buttonText}>
Hide Notification
</Text>
</TouchableHighlight>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#F5FCFF',
justifyContent: 'center',
alignItems: 'center',
},
backgroundImage: {
position: 'absolute',
top: 0,
},
button: {
padding: 10,
borderRadius: 5,
marginBottom: 22,
backgroundColor: '#FFFFFF88',
},
buttonText: {
fontSize: 17,
textAlign: 'center',
color: '#000000'
},
notificationContainer: {
position: 'absolute',
top: 0,
left: 0,
right: 0,
height: 22,
overflow: 'hidden' //This is the magic trick to do the masking.
},
notification: {
backgroundColor: '#00000088',
position: 'absolute',
top: 22,
left: 0,
right: 0,
height: 22,
},
notificationText: {
color: 'yellow',
textAlign: 'center',
fontSize: 11,
marginTop: 4
},
});
AppRegistry.registerComponent('playground', () => playground);
答案 1 :(得分:1)
这是你可以做到的一种方式。
使用绝对定位的<View>
。您希望职位样式如下:
position: 'absolute',
top: 0,
left: 0,
height: 20
然后在视图中你需要一个Animated
元素,一个是View或Text元素。您希望嵌套的动画视图在顶视图中“脱离屏幕”开始,然后在组件的componentWillMount
方法中,将文本设置为从视图下方设置为动画以显示在视图中。这将为您的文本提供滑动效果。您可以在此处了解有关动画库的更多信息:Animated RN Docs
最后,看起来您还希望状态栏同时隐藏,因此您需要将其设置为隐藏并为该操作设置动画。这很容易做到,请查看RN Docs StatusBar
如果您遇到麻烦,请在问题中发布一些代码,然后我就可以帮您排查问题。