Реагировать родной фиксированный нижний колонтитул
Я пытаюсь создать react native приложение, которое выглядит как существующее веб-приложение. У меня есть фиксированный нижний колонтитул в нижней части окна. Кто-нибудь знает, как этого можно достичь с помощью react native?
в существующем приложении это просто:
.footer {
position: fixed;
bottom: 0;
}
11 ответов:
с моей головы вы могли бы сделать это с ScrollView. Ваш контейнер верхнего уровня может быть гибким контейнером, внутри которого есть ScrollView вверху и нижний колонтитул внизу. Затем внутри ScrollView просто поместите остальную часть вашего приложения как обычно.
вот фактический код, основанный на ответе Рамсея Колина:
<View style={{flex: 1}}> <ScrollView>main</ScrollView> <View><Text>footer</Text></View> </View>
Я использую фиксированные нижние колонтитулы для кнопок в моем приложении. Способ реализации фиксированного нижнего колонтитула выглядит так:
<View style={{flex: 1}}> <View><Text>my text</Text></View> <View style={{position: 'absolute', left: 0, right: 0, bottom: 0}}><Text>My fixed footer</Text></View> </View>
и если нужно нижний колонтитул для перемещения вверх, когда появляется клавиатура, например, вы можете использовать:
const { DeviceEventEmitter } = React class MyClass { constructor() { this.state = { btnLocation: 0 } } componentWillMount() { DeviceEventEmitter.addListener('keyboardWillShow', this.keyboardWillShow.bind(this)) DeviceEventEmitter.addListener('keyboardWillHide', this.keyboardWillHide.bind(this)) } keyboardWillShow(e) { this.setState({btnLocation: e.endCoordinates.height}) } keyboardWillHide(e) { this.setState({btnLocation: 0}) } }
затем используйте {bottom: this.государство.btnLocation} в вашем фиксированном классе нижнего колонтитула. Надеюсь, это поможет!
сначала вы получаете размер, а затем манипулируете им через flex style
var Dimensions = require('Dimensions') var {width, height} = Dimensions.get('window')
в визуализации
<View style={{flex: 1}}> <View style={{width: width, height: height - 200}}>main</View> <View style={{width: width, height: 200}}>footer</View> </View>
другой метод заключается в использовании flex
<View style={{flex: 1}}> <View style={{flex: .8}}>main</View> <View style={{flex: .2}}>footer</View> </View>
@Александр Спасибо за решение
Ниже приведен код именно то, что вы ищете
import React, {PropTypes,} from 'react'; import {View, Text, StyleSheet,TouchableHighlight,ScrollView,Image, Component, AppRegistry} from "react-native"; class mainview extends React.Component { constructor(props) { super(props); } render() { return( <View style={styles.mainviewStyle}> <ContainerView/> <View style={styles.footer}> <TouchableHighlight style={styles.bottomButtons}> <Text style={styles.footerText}>A</Text> </TouchableHighlight> <TouchableHighlight style={styles.bottomButtons}> <Text style={styles.footerText}>B</Text> </TouchableHighlight> </View> </View> ); } } class ContainerView extends React.Component { constructor(props) { super(props); } render() { return( <ScrollView style = {styles.scrollViewStyle}> <View> <Text style={styles.textStyle}> Example for ScrollView and Fixed Footer</Text> </View> </ScrollView> ); } } var styles = StyleSheet.create({ mainviewStyle: { flex: 1, flexDirection: 'column', }, footer: { position: 'absolute', flex:0.1, left: 0, right: 0, bottom: -10, backgroundColor:'green', flexDirection:'row', height:80, alignItems:'center', }, bottomButtons: { alignItems:'center', justifyContent: 'center', flex:1, }, footerText: { color:'white', fontWeight:'bold', alignItems:'center', fontSize:18, }, textStyle: { alignSelf: 'center', color: 'orange' }, scrollViewStyle: { borderWidth: 2, borderColor: 'blue' } }); AppRegistry.registerComponent('TRYAPP', () => mainview) //Entry Point and Root Component of The App
ниже скриншот
вы также можете взглянуть на NativeBase (http://nativebase.io). это библиотека компонентов для React Native, которые включают в себя некоторую красивую структуру макета (http://nativebase.io/docs/v2.0.0/components#anatomy) включая верхние и нижние колонтитулы.
Это немного похоже на Bootstrap для мобильных устройств.
простые вещи здесь:
Если вам не нужен ScrollView для этого подхода, вы можете пойти с приведенным ниже кодом, чтобы достичь чего-то вроде этого :
<View style={{flex: 1, backgroundColor:'grey'}}> <View style={{flex: 1, backgroundColor: 'red'}} /> <View style={{height: 100, backgroundColor: 'green'}} /> </View>
можно было бы добиться чего-то подобного в react native с
position: absolute
let footerStyle = { position: 'absolute', bottom: 0, }
есть несколько вещей, чтобы иметь в виду.
absolute
позиционирует элемент относительно его родителя.- можно задать ширину и высоту элемента вручную.
- ширина и высота будут меняться при изменении ориентации. Это должно управляться вручную
практическое определение стиля будет выглядеть примерно вот так:
import { Dimensions } from 'react-native'; var screenWidth = Dimensions.get('window').width; //full screen width let footerStyle = { position: 'absolute', bottom: 0, width: screenWidth, height: 60 }
способ, которым я это сделал, состоял в том, чтобы иметь вид (назовем его P) с flex 1, а затем внутри этого вида есть еще 2 вида (C1 и C2) с flex 0.9 и 0.1 соответственно (вы можете изменить высоту flex на требуемые значения). Затем, внутри С1 имеют представление ScrollView. Это прекрасно работало для меня. Пример ниже.
<View style={{flex: 1}}> <View style={{flex: 0.9}}> <ScrollView> <Text style={{marginBottom: 500}}>scrollable section</Text> </ScrollView> </View> <View style={{flex: 0.1}}> <Text>fixed footer</Text> </View> </View>
лучший способ заключается в использовании justifyContent собственность
<View style={{flexDirection:'column',justifyContent:'flex-end'}}> <View> <Text>fixed footer</Text> </View> </View>
Если у вас есть несколько вид элементов на экране, то вы можете использовать
<View style={{flexDirection:'column',justifyContent:'space-between'}}> <View> <Text>view 1</Text> </View> <View> <Text>view 2</Text> </View> <View> <Text>fixed footer</Text> </View> </View>