1. ๊ณ ๋ คํด์ค์ผ ํ ๋ถ๋ถ
์ฐ์ ํด๋ํฐ ํ๋ฉด์ ๋ณด๋ฉด ๋งจ ์๋จ์๋ ๋ฒ ํฐ๋ฆฌ ์๋ ๋ฐ ์๋ฆผ๋ค์ด ๋์ด ๋๊ณ ์๊ณ , ํ๋จ bar์๋ ํ์ผ๋ก, ๋๊ฐ๊ธฐ ๋ฒํผ ๋ฑ์ด ์๋ค.
์ฐ๋ฆฌ๊ฐ ์ด๊ฒ๋ค์ ์์ญ์ ๊ณ ๋ คํ์ง ์๊ณ ์ฑ์ ๋ง๋ ๋ค๋ฉด, ๋ด๊ฐ ๋ง๋ ์ฑ์ ์๋จ ๋ฐ๊ฐ ํธ๋ํฐ์ ๋ฒ ํฐ๋ฆฌ ์๋์ด๋ ์๋ฆผ ๋ถ๋ถ๊ณผ ๊ฒน์น ์ ์๋ค!
2. ํธ๋ํฐ์ ๊ณ ์ ์๋จ, ํ๋จ ์์ญ์ ์นจ๋ฒํ์ง ์๋ ์ฑ์ ๋ง๋๋ ์กฐ์น 2๊ฐ์ง
(1) SafeAreaView ์ฌ์ฉ
// ์ฅ์ฐฉ
import { SafeAreaView } from 'react-native';
// SafeViewArea ์ด์ฉ
<SafeViewArea style={styles.container}>
<Header />
</SafeViewArea>
ํด๋น ์ปดํฌ๋ํธ ์ด์ฉ ์, ์๋์ผ๋ก ํธ๋ํฐ ์์ฒด ์๋จ ํ๋จ ๋ฐ๋ฅผ ์นจ๋ฒํ์ง ์๊ณ ๊ทธ ์์ชฝ์์ ์์ ์ ํ ์ ์๊ฒ ํด์ค๋ค.
ํด๋น <Header />๋ ์๋์ผ๋ก ์์ชฝ ์์ญ์์ ์์ ์ด ์ด๋ฃจ์ด์ง๋ค.
ํ์ง๋ง ํด๋น ์ปดํฌ๋ํธ๋ ์๋จ๊ณผ ํ๋จ์ ์๋์ผ๋ก ์ธก์ ํ๊ธฐ ๋๋ฌธ์, ๋๋๋ก, ๋ด๊ฐ ๋ง๋ ์ฑ์ด ๋๋ฌด ํ๋ฉด ์ค์์ ๋ชฐ๋ ค ์์ฑ๋๋ค.
์ด๊ฒ์ด ๋จ์ ์ด๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ ์ฑ ์์ฒด์ ์ด์ํจ์ ์ค ์ ์์ผ๋ฏ๋ก ๋ค์ ๋ฐฉ๋ฒ์ ์ด์ฉํ์
(2) getStatusBarHeight, getBottomSpace ์ปดํฌ๋ํธ ์ด์ฉ
ํด๋น ์ปดํฌ๋ํธ๋ค์ gitHub์ react-native-iphone-x-helper์ ์ฌ๋ผ์จ ์ปดํฌ๋ํธ ๋ค์ด๋ค.
ํด๋น ํ๊ทธ๋ฅผ ์ด์ฉํ๋ฉด, ์์ดํฐ, ์๋๋ก์ด๋ ๋์ ์๋จ๊ณผ ํ๋จ์ height๋ฅผ ์ป์ ์ ์๋ค.
// ์ฅ์ฐฉ
import { getStatusBarHeight, getBottomSpace } from 'react-native-iphone-x-helper'
// ๋ณ์๋ก ๋ฐ๊ธฐ
// ํด๋น ๋ณ์์๋ ๊ฐ๊ฐ ์๋จ ๋ฐ์ ๋์ด, ํ๋จ ๋ฐ์ ๋์ด๊ฐ ๋ค์ด๊ฐ๋ค.
// getStatusBarHeight()๋ boolean ๊ฐ ์ธ์๋ฅผ ๋ฃ์ด์ผ ํ๋๋ฐ, true๋ฅผ ๋ฃ์ด์ผ, ํธ๋ํฐ ์๋จ๋ฐ ํฌ๊ธฐ๋ฅผ ์ป๊ฒ ๋ค๋ ๊ฒ์ด๋ค.
const statusBarHeight = getStatusBarHeight(true);
const bottomSpace = getBottomSpace();
// ์์ดํฐ์ ์ด๋ ๊ฒ ์๋จ,ํ๋จ๋ฐ ๊ธธ์ด๋ฅผ ์๋์ผ๋ก ์ถ๋ ฅํด์ผํ๋ค.
// ์๋๋ก์ด๋๋ ๊ทธ๋ด ํ์ ์๋ค.
// `` ์ด๊ฑฐ ์ฐ๋ฉด ์์ {} ํฌํ๋ฆฟ์ผ๋ก ๋ณ์์ ๊ฐ์ ๊ตฌํ ์ ์๋ค. %n %s ์ฐ๋ฏ์ด ์ด๋ค.
console.log(`${Platform.OS}: ${statusBarHeight}, ${bottomSpace}`)
const styles = StyleSheet.create({
container: {
flex: 1,
//view ์ ์ฒด์ CSS์์ ์์ชฝ ํจ๋ฉ์ statusBarHeight๋งํผ ์คฌ๋ค.
// padding์ ์์ชฝ ์ฌ๋ฐฑ์ธ๋ฐ, ์๋จ๋ฐ ํฌ๊ธฐ ๋งํผ ์ ์ชฝ์ผ๋ก ๋ค์ด๊ฐ ๊ฒ์ด๋ค.
paddingTop: statusBarHeight,
backgroundColor: '#fff',
},
});
3. ์์ด์ฝ ๋ง์ง
์ฌ๊ธฐ์ ์์ด์ฝ์ ๊ฒ์ํ๋ฉด ํด๋น ์์ด์ฝ์ ์ธ ์ ์๋ import์ ์ฌ์ฉ๋ฐฉ๋ฒ์ด ๋์ ์์
import { Ionicons } from '@expo/vector-icons';
<Ionicons name={props.name} size={24} color="black" />
//์์ฑ์ 3๊ฐ๋ก ์์ด์ฝ ์ด๋ฆ, ํฌ๊ธฐ, ์๊น์ด๋ค.
4.์ก๋คํ ์ง์
(1)export ๋ ์์ธํ
// ํ์ผ ์ด๋ฆ Header.js
// Header๋ผ๋ component๋ฅผ ํด๋น ํ์ผ์ ๋ํ (default) component๋ก ์ง์ ํด export
const Header () => {}
export default Header;
// ์๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ์ด ๊ฒ
export default () => {}
export default ํ๋ฉด ํด๋น ํ์ผ์์ ๋ฑ ํ๋์ component๋ง export ๋๋๋ฐ, ๊ทธ ๋ํ component๋ฅผ ์ง์ ํ๋ ๊ฒ์ด๋ค.
default๋ก ์ง์ ํ ์ปดํฌ๋ํธ๋ import ์ ๊ตฌ์กฐ ๋ถํด ๊ณผ์ ์ ์ ๊ฑฐ์ณ๋ ๋๊ณ , ์ด๋ฆ๋ ๋ง์๋๋ก ํด๋ ๋๋ค.
default๋ก export ์ํ๋ค๋ฉด import ์ ๋ฌด์กฐ๊ฑด ์ปดํฌ๋ํธ ์ด๋ฆ์ ๋์ผํ๊ฒ ๊ฐ์ ธ๊ฐ์ผ ํ๊ณ , ๊ตฌ์กฐ ๋ถํด๋ ์จ์ผ ํ๋ค.
import Header from "./Header.js"
import Header222 from "./Header.js"
// ๋ญ๋ ์๊ด ๋ฌด
๋ง์ฝ์ Header๋ฅผ default๋ก export ์ ํ ๊ฒฝ์ฐ import ์ ๊ตฌ์กฐ ๋ถํด๊ฐ ํ์ํ๋ค.
/*
ํด๋ ํ์ผ ์
const Header () => {}
export Header
*/
import {Header} form "./Header.js"
5. ์ฝ๋ ๋ฆฌ๋ทฐ
/*Header.js ์*/
import { View, Text,StyleSheet } from "react-native"
import { Ionicons } from '@expo/vector-icons';
const IconButton = (props) => {
return(
<View style={{paddingHorizontal: 6}}>
<Ionicons name={props.name} size={24} color="black" />
</View>
)
};
export default () => {
return (
<View style={styles.headerContainer}>
<Text style={styles.title}>์น๊ตฌ</Text>
<View style={{flexDirection: "row"}}>
<IconButton name="search-outline"/>
<IconButton name="person-add-outline"/>
<IconButton name="musical-notes-outline"/>
<IconButton name="settings-outline"/>
</View>
</View>
)
}
const styles = StyleSheet.create({
headerContainer: {
flexDirection: "row",
justifyContent: "space-between",
paddingVertical: 10,
},
title: {
fontSize: 22,
fontWeight: "bold"
}
})
/*App.js ์*/
import { StatusBar } from 'expo-status-bar';
import { Platform, SafeAreaView, StyleSheet, Text, View } from 'react-native';
import { getStatusBarHeight, getBottomSpace } from 'react-native-iphone-x-helper'
import Header from './src/Header';
const statusBarHeight = getStatusBarHeight(true);
const bottomSpace = getBottomSpace();
console.log(`${Platform.OS}: ${statusBarHeight}, ${bottomSpace}`)
export default function App() {
return (
<View style={styles.container}>
<Header />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
paddingTop: statusBarHeight,
backgroundColor: '#fff',
},
});
6. ์ค์ค๋ก ํด๋ณด๊ธฐ
์๋จ ๋ฐ ํ๋จ ๋ฐ์ ๋ํ ์ ์ธ์ ์ ์ญ๋ณ์๋ก์ app() ์ปดํฌ๋ํธ ๋ฐ์์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค.