Мотивация
Я никогда не работал в проекте, где приложение должно иметь два разных макета: один для портретной ориентации и другой для ландшафтной позиции. Таким образом, только из-за любопытства я решил создать простой проект с этой функциональностью.
Проект
Проект состоит из экрана входа в систему, где, когда приложение находится в портретной ориентации, он будет иметь этот макет:
Когда приложение находится в ландшафтной ориентации, он будет иметь этот макет:
Давайте код
import React,{useState, useEffect} from 'react';
import { Text, View, StyleSheet, TextInput, Image, KeyboardAvoidingView, ScrollView, SafeAreaView, Dimensions } from 'react-native';
import Constants from 'expo-constants';
import AssetExample from './components/AssetExample'
export default function App() {
const [isVerticalOrientation, setIsVerticalOrientation] = useState(true)
const [firstInputText, setFirstInputText] = useState('Orientation')
const [secondInputText, setSecondInputText] = useState('Width')
const [thirdInputText, setThirdInputText] = useState('Height')
const checkIfDeviceIsInVerticalOrHorizontalOrientation = () =>{
const screenWidth = Dimensions.get('window').width
const screenHeight = Dimensions.get('window').height
if(screenWidth > screenHeight){
setIsVerticalOrientation(false)
}else{
setIsVerticalOrientation(true)
}
}
return (
checkIfDeviceIsInVerticalOrHorizontalOrientation()} style={!isVerticalOrientation ? styles.containerRow : styles.container}>
setFirstInputText(text)}/>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
paddingTop: Constants.statusBarHeight,
backgroundColor: '#ACACAC',
justifyContent: 'center',
alignItems: 'center',
padding: 8,
},
containerRow: {
flex:1,
flexDirection: 'row',
paddingTop: Constants.statusBarHeight,
backgroundColor: '#ACACAC',
justifyContent: 'center',
alignItems: 'center',
padding: 8,
},
inputStyle: {
borderWidth: 1,
borderColor: 'white',
width: 200,
height:50,
borderRadius: 50,
paddingLeft:10,
marginTop:10,
},
});
Я проверяю Onlayout основного контейнера, используя метод «CheckificeSICISINVENTICALORHORIZONTALORIENTALICY» Если ширина экрана больше, чем его высота, если она есть, устройство находится в ландшафтной ориентации, если он не является, устройство находится в портретном положении. В каждом состоянии я устанавливаю состояние под названием «IsverticalIretionation», что в зависимости от его значения компоновка изменяется на стиль с именем «контейнер» или «контейнер». Эти стили являются основными, поскольку они диктуют, следует ли вести себя как ландшафт или портрет.
Полный код приложения: https://github.com/gabriielsideProjects/awesome-device-orientation Я открыт, чтобы потянуть запрос и предложения. Сделайте себя комфортно 😃. Я использовал Закуски создать приложение. Если вы хотите, вы можете проверить мою закуски И запустить его, чтобы увидеть это работает 🔳. Давайте выпьем уютный и теплый кофе, говорите привет мне на Социальная сеть вы желаете 😃☕.
Оригинал: “https://dev.to/gabrielsideprojects/different-layouts-in-portrait-and-landscape-orientations-492l”