๐ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ์คํ์ผ๋ง์ ์ธ๊ณ๋ก ํ๋ฉ! ๋ค์ดํฐ๋ธ ๋๋ ๋ด๊ธฐ ๐จ

์๋ ํ์ธ์, ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ ์ ๋ง ํฅ๋ฏธ์ง์งํ ์ฃผ์ ๋ก ์ฌ๋ฌ๋ถ๊ณผ ํจ๊ป ํ ๊ฑฐ์์. ๋ฐ๋ก '๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ์คํ์ผ๋ง ๊ธฐ๋ฒ: ๋ค์ดํฐ๋ธ ๋๋ ๋ด๊ธฐ'์ ๋ํด ๊น์ด ์๊ฒ ํํค์ณ ๋ณผ ๊ฑฐ๋๋๋ค. ์ด ๊ธ์ ๋ค ์ฝ๊ณ ๋๋ฉด, ์ฌ๋ฌ๋ถ๋ ๋ค์ดํฐ๋ธ ์ฑ ๊ฐ์ ๋๋์ UI๋ฅผ ๋๋ฑ ๋ง๋ค์ด๋ผ ์ ์์ ๊ฑฐ์์. ์ง์ง ๋๋ฐ ์ฉ์ด์! ๐
์ฐ๋ฆฌ๊ฐ ์ฑ์ ๋ง๋ค ๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ ๋ญ๊น์? ๋ฐ๋ก ์ฌ์ฉ์ ๊ฒฝํ(UX)์ด์ฃ ! ๊ทธ๋ฆฌ๊ณ ๊ทธ UX์ ํต์ฌ์๋ ๋ฐ๋ก '์คํ์ผ๋ง'์ด ์์ด์. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ก ์ฑ์ ๊ฐ๋ฐํ ๋, ๋ค์ดํฐ๋ธ ๋๋์ ์ ๋๋ก ๋ด๋ ๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง ์์์ฃ ? ์ด๊ฒ ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ์ค๋ ํ๊ณ ๋ค ์ฃผ์ ์์!
์ฌ๋ฌ๋ถ, ํน์ ์ฌ๋ฅ๋ท์ด๋ผ๋ ์ฌ์ดํธ ์์ธ์? ์ฌ๋ฅ ๊ฑฐ๋ ํ๋ซํผ์ธ๋ฐ, ๊ฑฐ๊ธฐ์๋ ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ ๊ด๋ จ ์ฌ๋ฅ๋ค์ด ํ๋ฐํ๊ฒ ๊ฑฐ๋๋๊ณ ์๋๋ผ๊ณ ์. ์ค๋ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ธ ๋ด์ฉ๋ค๋ก ์ฌ๋ฌ๋ถ๋ ์ฌ๋ฅ๋ท์์ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ๊ฐ๋ฐ ์ค๋ ฅ์ ๋ฝ๋ด๋ณผ ์ ์์ ๊ฑฐ์์. ๊ฟํ ๋๋ฐฉ์ถ ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ์์ํด๋ณผ๊น์? ๐
1. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ์คํ์ผ๋ง์ ๊ธฐ๋ณธ, ์ ๋๋ก ์๊ณ ๊ฐ์! ๐
์, ๋จผ์ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ์คํ์ผ๋ง์ ๊ธฐ๋ณธ๋ถํฐ ํํํ๊ฒ ๋ค์ ธ๋ณผ๊ฒ์. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์๋ CSS๋ฅผ ์ง์ ์ฌ์ฉํ์ง ์๊ณ , JavaScript ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ์คํ์ผ์ ์ ์ํ๋ค๋ ๊ฑฐ ์๊ณ ๊ณ์ จ์ฃ ? ์ด๊ฒ ๋ฐ๋ก ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์ ํน๋ณํ ์ ์ด์์!
๐ ํต์ฌ ํฌ์ธํธ: ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์ ์คํ์ผ๋ง์ CSS์ ๋น์ทํ์ง๋ง, ์์ ํ ๋์ผํ์ง๋ ์์์. ์นด๋ฉ ์ผ์ด์ค(camelCase)๋ฅผ ์ฌ์ฉํ๊ณ , ๋ชจ๋ ๊ธธ์ด ๋จ์๋ ์ซ์๋ก ํํํ๋ค๋ ์ ์ ๊ผญ ๊ธฐ์ตํ์ธ์!
์๋ฅผ ๋ค์ด๋ณผ๊น์? CSS์์ background-color
๋ก ์ฐ๋ ๊ฑธ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์๋ backgroundColor
๋ก ์จ์. ๊ทธ๋ฆฌ๊ณ font-size: 16px;
๋์ fontSize: 16
์ด๋ผ๊ณ ์ฐ์ฃ . ์ด๋ฐ ์์ผ๋ก์!
๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์ ์คํ์ผ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ์ธ ๊ฐ์ง๊ฐ ์์ด์:
- ์ธ๋ผ์ธ ์คํ์ผ
- StyleSheet.create() ์ฌ์ฉ
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ (์: styled-components)
๊ฐ๊ฐ์ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณผ๊น์? ๐
1.1 ์ธ๋ผ์ธ ์คํ์ผ - ๊ฐ๋จํ๊ณ ๋น ๋ฅด๊ฒ! โก
์ธ๋ผ์ธ ์คํ์ผ์ ์ปดํฌ๋ํธ์ ์ง์ ์คํ์ผ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ด์์. ๊ฐ๋จํ๊ณ ๋น ๋ฅด๊ฒ ์คํ์ผ์ ์ ์ฉํ ์ ์์ด์, ํ๋กํ ํ์ ์ ๋ง๋ค ๋ ์์ฃผ ์ฌ์ฉ๋ผ์.
import React from 'react';
import { View, Text } from 'react-native';
const MyComponent = () => (
<View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
<Text style={{fontSize: 20, color: 'blue'}}>์๋
ํ์ธ์, ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ!</Text>
</View>
);
export default MyComponent;
๋ณด์
จ๋์? style
์์ฑ์ JavaScript ๊ฐ์ฒด๋ฅผ ์ง์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ด์์. ๊ฐ๋จํ์ฃ ? ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ฉด ๊ฐ๋
์ฑ์ด ๋จ์ด์ง ์ ์์ด์. ๊ทธ๋์ ๋ณดํต์ ๋ค์ ๋ฐฉ๋ฒ์ ๋ ๋ง์ด ์ฌ์ฉํ๋ต๋๋ค.
1.2 StyleSheet.create() - ์ฑ๋ฅ๊ณผ ๊ฐ๋ ์ฑ UP! ๐
StyleSheet.create()
๋ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์ ์ ๊ณตํ๋ API์์. ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์คํ์ผ์ ๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ฌ์ฌ์ฉํ ์ ์๊ณ , ์ฑ๋ฅ๋ ์ข์์ง๋ต๋๋ค.
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
const MyComponent = () => (
<View style={styles.container}>
<Text style={styles.text}>์๋
ํ์ธ์, ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ!</Text>
</View>
);
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
text: {
fontSize: 20,
color: 'blue',
},
});
export default MyComponent;
์ด๋ ๊ฒ ํ๋ฉด ์คํ์ผ์ ๋ฐ๋ก ๊ด๋ฆฌํ ์ ์์ด์ ์ฝ๋๊ฐ ํจ์ฌ ๊น๋ํด์ ธ์. ๊ฒ๋ค๊ฐ StyleSheet.create()
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๊ฐ ์คํ์ผ์ ์ต์ ํํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ๋ ์ข์์ง๋ต๋๋ค. ์์ ๊ฟํ์ด์ฃ ? ๐
1.3 ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ - styled-components๋ก ๋ ๊ฐ๋ ฅํ๊ฒ! ๐ช
๋ง์ง๋ง์ผ๋ก ์๊ฐํ ๋ฐฉ๋ฒ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฑฐ์์. ๊ทธ ์ค์์๋ styled-components๊ฐ ํนํ ์ธ๊ธฐ ์์ฃ . ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด CSS-in-JS ๋ฐฉ์์ผ๋ก ์คํ์ผ์ ์์ฑํ ์ ์์ด์.
import React from 'react';
import styled from 'styled-components/native';
const Container = styled.View`
flex: 1;
justify-content: center;
align-items: center;
`;
const StyledText = styled.Text`
font-size: 20px;
color: blue;
`;
const MyComponent = () => (
<Container>
<StyledText>์๋
ํ์ธ์, ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ!</StyledText>
</Container>
);
export default MyComponent;
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ์ ์คํ์ผ์ ๋ ๊ธด๋ฐํ๊ฒ ์ฐ๊ฒฐํ ์ ์์ด์. ์ฌ์ฌ์ฉ์ฑ๋ ๋๊ณ , ๋์ ์คํ์ผ๋ง๋ ์ฝ๊ฒ ํ ์ ์๋ต๋๋ค.
์ฌ๊ธฐ๊น์ง ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ์คํ์ผ๋ง์ ๊ธฐ๋ณธ์ ์์๋ดค์ด์. ์ด์ ์ด ๊ธฐ๋ณธ์ ๋ฐํ์ผ๋ก ๋ค์ดํฐ๋ธ ๋๋์ ๋ด๋ ๋ฐฉ๋ฒ์ ์์ธํ ์์๋ณผ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ๋ค์ ์น์ ์์ ๊ณ์ํด์! ๐
2. ๋ค์ดํฐ๋ธ ๋๋ ๋ด๊ธฐ: ํ๋ซํผ๋ณ ์คํ์ผ๋ง ๋ง์คํฐํ๊ธฐ ๐ญ
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ค์ดํฐ๋ธ ๋๋์ ๋ด๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์ ๋งค๋ ฅ ์ค ํ๋๋ ๋ฐ๋ก ํฌ๋ก์ค ํ๋ซํผ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ด์ฃ . ํ์ง๋ง ๋๋ก๋ iOS์ Android์ ๊ฐ๊ฐ ๋ค๋ฅธ ์คํ์ผ์ ์ ์ฉํด์ผ ํ ๋๊ฐ ์์ด์. ์ด๋ป๊ฒ ํ๋ฉด ๋ ๊น์? ๐ค
2.1 Platform API - iOS vs Android ์๋ฒฝ ๊ตฌ๋ถ! ๐ฑ
๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ Platform
API๋ฅผ ์ ๊ณตํด์. ์ด๋ฅผ ์ด์ฉํ๋ฉด ํ์ฌ ์คํ ์ค์ธ ํ๋ซํผ์ ํ์ธํ๊ณ , ๊ทธ์ ๋ง๋ ์คํ์ผ์ ์ ์ฉํ ์ ์๋ต๋๋ค.
import { Platform, StyleSheet } from 'react-native';
const styles = StyleSheet.create({
container: {
flex: 1,
...Platform.select({
ios: {
backgroundColor: 'red',
},
android: {
backgroundColor: 'blue',
},
}),
},
});
์ด๋ ๊ฒ ํ๋ฉด iOS์์๋ ๋นจ๊ฐ์ ๋ฐฐ๊ฒฝ์ด, Android์์๋ ํ๋์ ๋ฐฐ๊ฒฝ์ด ์ ์ฉ๋ผ์. ์์ ์ฉ์ง ์๋์? ๐
2.2 ํ๋ซํผ๋ณ ํ์ผ ๋ถ๋ฆฌ - ๊น๋ํ๊ณ ๋ช ํํ๊ฒ! ๐
๋ ๋ณต์กํ ์คํ์ผ๋ง์ด ํ์ํ๋ค๋ฉด, ์์ ํ์ผ์ ๋ถ๋ฆฌํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์์. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ ํ์ผ ์ด๋ฆ์ .ios.
๋ .android.
๋ฅผ ๋ถ์ด๋ฉด ์๋์ผ๋ก ํ๋ซํผ์ ๊ตฌ๋ถํด์ค๋ต๋๋ค.
์๋ฅผ ๋ค์ด, Button.ios.js
์ Button.android.js
ํ์ผ์ ๋ง๋ค๊ณ , ๊ฐ๊ฐ ๋ค๋ฅธ ์คํ์ผ์ ์ ์ฉํ ์ ์์ด์. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉํ ๋๋ ๊ทธ๋ฅ import Button from './Button'
์ฒ๋ผ importํ๋ฉด ๋ผ์. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๊ฐ ์์์ ํ๋ซํผ์ ๋ง๋ ํ์ผ์ ์ ํํด์ค ๊ฑฐ์์. ์์ ํธํ์ฃ ? ๐
2.3 ๋ค์ดํฐ๋ธ UI ์ปดํฌ๋ํธ ํ์ฉํ๊ธฐ - ์ง์ง ๋ค์ดํฐ๋ธ์ฒ๋ผ! ๐จ
๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ ๊ฐ ํ๋ซํผ์ ๋ค์ดํฐ๋ธ UI ์ปดํฌ๋ํธ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๊ฒ ํด์ค์. ์๋ฅผ ๋ค์ด, iOS์ DatePickerIOS
๋ Android์ ViewPagerAndroid
๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ง ๋ค์ดํฐ๋ธ ์ฑ ๊ฐ์ ๋๋์ ๋ผ ์ ์๋ต๋๋ค.
import React from 'react';
import { View, DatePickerIOS, Platform } from 'react-native';
const MyDatePicker = () => {
if (Platform.OS === 'ios') {
return (
<View>
<DatePickerIOS date={new Date()} onDateChange={(date) => console.log(date)} />
</View>
);
}
// Android์ ๊ฒฝ์ฐ ๋ค๋ฅธ DatePicker ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋์ฒด UI๋ฅผ ์ ๊ณต
return null;
};
export default MyDatePicker;
์ด๋ ๊ฒ ํ๋ฉด iOS์์๋ ๋ค์ดํฐ๋ธ DatePicker๊ฐ ๋ํ๋๊ณ , Android์์๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ด์. ์์ ํ๋ก์ฒ๋ผ ๋ณด์ด์ง ์๋์? ๐
๐ฅ ๊ฟํ: ๋ค์ดํฐ๋ธ UI ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๋๋ ํญ์ ๋์ฒด UI๋ฅผ ์ค๋นํด๋์ธ์. ๋ชจ๋ ํ๋ซํผ์์ ๋์ผํ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ ์ค์ํ๋๊น์!
2.4 Shadow ์คํ์ผ๋ง - iOS vs Android ๊ทธ๋ฆผ์ ์๋ฒฝ ๋์! ๐
๊ทธ๋ฆผ์ ํจ๊ณผ๋ UI์ ๊น์ด๊ฐ์ ์ฃผ๋ ์ค์ํ ์์์์. ํ์ง๋ง iOS์ Android์์ ๊ทธ๋ฆผ์๋ฅผ ํํํ๋ ๋ฐฉ์์ด ๋ฌ๋ผ์ ์ข ๊น๋ค๋ก์ธ ์ ์์ด์. ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น์?
import { Platform, StyleSheet } from 'react-native';
const styles = StyleSheet.create({
box: {
...Platform.select({
ios: {
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.25,
shadowRadius: 3.84,
},
android: {
elevation: 5,
},
}),
},
});
iOS์์๋ shadow
์์ฑ๋ค์ ์ฌ์ฉํ๊ณ , Android์์๋ elevation
์ ์ฌ์ฉํด์. ์ด๋ ๊ฒ ํ๋ฉด ๋ ํ๋ซํผ ๋ชจ๋์์ ์์ ๊ทธ๋ฆผ์ ํจ๊ณผ๋ฅผ ๋ผ ์ ์๋ต๋๋ค. ์์ ํ๋ก ๊ฐ๋ฐ์ ๋๋ ์๋์์? ๐
2.5 ํฐํธ ์คํ์ผ๋ง - ๊ฐ ํ๋ซํผ์ ๊ธฐ๋ณธ ํฐํธ ํ์ฉํ๊ธฐ ๐
ํฐํธ๋ ํ๋ซํผ๋ง๋ค ์ฐจ์ด๊ฐ ์์ด์. iOS์ Android์ ๊ธฐ๋ณธ ํฐํธ๋ฅผ ํ์ฉํ๋ฉด ๋์ฑ ๋ค์ดํฐ๋ธ์ค๋ฌ์ด ๋๋์ ๋ผ ์ ์๋ต๋๋ค.
import { Platform, StyleSheet } from 'react-native';
const styles = StyleSheet.create({
text: {
...Platform.select({
ios: {
fontFamily: 'System',
},
android: {
fontFamily: 'Roboto',
},
}),
fontSize: 16,
},
});
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ํ๋ซํผ์ ๊ธฐ๋ณธ ํฐํธ๋ฅผ ์ฌ์ฉํ ์ ์์ด์. iOS์์๋ 'San Francisco', Android์์๋ 'Roboto' ํฐํธ๊ฐ ์ ์ฉ๋ ๊ฑฐ์์. ์์ ๋ค์ดํฐ๋ธ ์ฑ ๊ฐ์ฃ ? ๐
์ฌ๊ธฐ๊น์ง ํ๋ซํผ๋ณ ์คํ์ผ๋ง์ ๋ํด ์์๋ดค์ด์. ์ด์ ์ฌ๋ฌ๋ถ๋ iOS์ Android์์ ๊ฐ๊ฐ ๋ค์ดํฐ๋ธ์ค๋ฌ์ด UI๋ฅผ ๋ง๋ค ์ ์์ ๊ฑฐ์์. ๋ค์ ์น์ ์์๋ ๋ ์ฌํ๋ ์คํ์ผ๋ง ๊ธฐ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ๊ณ์ ๋ฐ๋ผ์ค์ธ์! ๐
3. ๊ณ ๊ธ ์คํ์ผ๋ง ๊ธฐ๋ฒ: ๋ค์ดํฐ๋ธ ๋๋ ๊ทน๋ํํ๊ธฐ ๐
์, ์ด์ ์ ๋ง ๊ณ ๊ธ ์คํฌ์ ๋ฐฐ์๋ณผ ์๊ฐ์ด์์! ์ฌ๋ฌ๋ถ์ ์ฑ์ ์ง์ง ๋ค์ดํฐ๋ธ ์ฑ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ค ์ ์๋ ๊ฟํ๋ค์ ์๊ฐํ ๊ฒ์. ์ค๋น๋์ จ๋์? let's go! ๐โโ๏ธ๐จ
3.1 ์ ๋๋ฉ์ด์ ๋ง์คํฐํ๊ธฐ - ๋ถ๋๋ฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ! ๐ฌ
์ ๋๋ฉ์ด์
์ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ด์. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์๋ Animated
API๋ฅผ ์ฌ์ฉํด ๋ฉ์ง ์ ๋๋ฉ์ด์
์ ๋ง๋ค ์ ์๋ต๋๋ค.
import React, { useRef, useEffect } from 'react';
import { Animated, Text, View } from 'react-native';
const FadeInView = (props) => {
const fadeAnim = useRef(new Animated.Value(0)).current // ์ด๊ธฐ ํฌ๋ช
๋: 0
useEffect(() => {
Animated.timing(
fadeAnim,
{
toValue: 1,
duration: 10000,
useNativeDriver: true,
}
).start();
}, [fadeAnim])
return (
<Animated.View
style={{
...props.style,
opacity: fadeAnim,
}}
>
{props.children}
</Animated.View>
);
}
export default () => {
return (
<View style={{flex: 1, alignItems: 'center', justifyContent: 'center'}}>
<FadeInView style={{width: 250, height: 50, backgroundColor: 'powderblue'}}>
<Text style={{fontSize: 28, textAlign: 'center', margin: 10}}>ํ์ด๋์ธ!</Text>
</FadeInView>
</View>
)
}
์ด ์ฝ๋๋ ํ ์คํธ๊ฐ ์์ํ ๋ํ๋๋ ํ์ด๋์ธ ํจ๊ณผ๋ฅผ ๋ง๋ค์ด์. useNativeDriver: true๋ฅผ ์ค์ ํ๋ฉด ๋ค์ดํฐ๋ธ ์ค๋ ๋์์ ์ ๋๋ฉ์ด์ ์ด ์คํ๋์ด ๋์ฑ ๋ถ๋๋ฝ๊ฒ ๋์ํ๋ต๋๋ค. ์์ ์ฉ์ด์, ๊ทธ์ตธ? ๐
3.2 ์ ์ค์ฒ ํธ๋ค๋ง - ํฐ์น์ ๋ฐ์ํ๋ UI ๋ง๋ค๊ธฐ ๐
๋ค์ดํฐ๋ธ ์ฑ์ ํฐ ํน์ง ์ค ํ๋๋ ํฐ์น์ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ํ๋ค๋ ๊ฑฐ์์. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์๋ PanResponder
๋ฅผ ์ฌ์ฉํด ์ด๋ฐ ์ ์ค์ฒ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ด์.
import React, { useRef } from 'react';
import { Animated, PanResponder, View } from 'react-native';
const App = () => {
const pan = useRef(new Animated.ValueXY()).current;
const panResponder = useRef(
PanResponder.create({
onMoveShouldSetPanResponder: () => true,
onPanResponderMove: Animated.event([
null,
{ dx: pan.x, dy: pan.y }
], { useNativeDriver: false }),
onPanResponderRelease: () => {
Animated.spring(pan, {
toValue: { x: 0, y: 0 },
useNativeDriver: false
}).start();
}
})
).current;
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Animated.View
style={{
transform: [{ translateX: pan.x }, { translateY: pan.y }]
}}
{...panResponder.panHandlers}
>
<View style={{ width: 100, height: 100, backgroundColor: 'skyblue', borderRadius: 50 }} />
</Animated.View>
</View>
);
}
export default App;
์ด ์ฝ๋๋ ํ๋ฉด์ ์์ ๋๋๊ทธํ ์ ์๊ฒ ๋ง๋ค์ด์. ์๊ฐ๋ฝ์ ๋ผ๋ฉด ์๋ ์์น๋ก ๋์๊ฐ์ฃ . ์์ ๋ค์ดํฐ๋ธ ์ฑ ๊ฐ์ง ์๋์? ๐
3.3 ์ปค์คํ ํฐํธ ์ฌ์ฉํ๊ธฐ - ๋ธ๋๋ฉ์ ์ํ ํ์ ์์! ๐จ
๋๋ก๋ ๊ธฐ๋ณธ ํฐํธ๋ง์ผ๋ก๋ ๋ถ์กฑํ ๋๊ฐ ์์ฃ . ์ปค์คํ ํฐํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ์ ๋ธ๋๋ฉ์ ๊ฐํํ ์ ์์ด์. ์ด๋ป๊ฒ ํ๋์ง ๋ณผ๊น์?
- ๋จผ์ , ํฐํธ ํ์ผ(.ttf ๋๋ .otf)์ ํ๋ก์ ํธ์ assets ํด๋์ ๋ฃ์ด์.
- ๊ทธ ๋ค์,
react-native.config.js
ํ์ผ์ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํด์:module.exports = { assets: ['./assets/fonts/'] };
react-native link
๋ช ๋ น์ด๋ฅผ ์คํํด ํฐํธ๋ฅผ ๋งํฌํด์.- ์ด์ ์คํ์ผ์์ ํฐํธ๋ฅผ ์ฌ์ฉํ ์ ์์ด์:
const styles = StyleSheet.create({ text: { fontFamily: 'MyCustomFont-Regular', fontSize: 16, }, });
์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ฌ๋ถ๋ง์ ํน๋ณํ ํฐํธ๋ก ์ฑ์ ๊พธ๋ฐ ์ ์์ด์. ์์ ํ๋กํ์ ๋ํ์ฃ ? ๐
3.4 ๋คํฌ ๋ชจ๋ ์ง์ํ๊ธฐ - ์ฌ์ฉ์ ๊ฒฝํ ๋ ๋ฒจ UP! ๐
์์ฆ ํธ๋ ๋์ธ ๋คํฌ ๋ชจ๋, ์ฌ๋ฌ๋ถ์ ์ฑ์๋ ์ ์ฉํด๋ณผ๊น์? ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์๋ Appearance
API๋ฅผ ์ฌ์ฉํด ์ฝ๊ฒ ๊ตฌํํ ์ ์์ด์.
import React from 'react';
import { useColorScheme, View, Text, StyleSheet } from 'react-native';
const App = () => {
const colorScheme = useColorScheme();
const themeTextStyle = colorScheme === 'light' ? styles.lightThemeText : styles.darkThemeText;
const themeContainerStyle =
colorScheme === 'light' ? styles.lightContainer : styles.darkContainer;
return (
<View style={[styles.container, themeContainerStyle]}>
<Text style={[styles.text, themeTextStyle]}>
{colorScheme === 'light' ? '๋ผ์ดํธ ๋ชจ๋์์! ๐' : '๋คํฌ ๋ชจ๋์์! ๐'}
</Text>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
lightContainer: {
backgroundColor: '#fff',
},
darkContainer: {
backgroundColor: '#000',
},
lightThemeText: {
color: '#000',
},
darkThemeText: {
color: '#fff',
},
text: {
fontSize: 24,
fontWeight: 'bold',
},
});
export default App;
์ด ์ฝ๋๋ ์ฌ์ฉ์์ ์์คํ ์ค์ ์ ๋ฐ๋ผ ์๋์ผ๋ก ๋ผ์ดํธ ๋ชจ๋์ ๋คํฌ ๋ชจ๋๋ฅผ ์ ํํด์. ์์ ์ฉ์ง ์๋์? ์ฌ์ฉ์๋ค์ด ์ข์ํ ๊ฑฐ์์! ๐
3.5 ๋ฐ์ํ ๋์์ธ ๊ตฌํํ๊ธฐ - ๋ชจ๋ ํ๋ฉด ํฌ๊ธฐ์ ์๋ฒฝ ๋์! ๐ฑ๐ป
๋ง์ง๋ง์ผ๋ก, ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋์ํ๋ ๋ฐ์ํ ๋์์ธ์ ๊ตฌํํด๋ณผ๊ฒ์. Dimensions
API๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ํ ์ ์๋ต๋๋ค.
import React from 'react';
import { View, Text, StyleSheet, Dimensions } from 'react-native';
const { width, height } = Dimensions.get('window');
const App = () => {
return (
<View style={styles.container}>
<View style={styles.box}>
<Text style={styles.text}>๋ฐ์ํ ๋ฐ์ค์์!</Text>
</View>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
box: {
width: width * 0.8, // ํ๋ฉด ๋๋น์ 80%
height: height * 0.2, // ํ๋ฉด ๋์ด์ 20%
backgroundColor: 'skyblue',
justifyContent: 'center',
alignItems: 'center',
borderRadius: 10,
},
text: {
fontSize: width * 0.05, // ํ๋ฉด ๋๋น์ ๋น๋กํ ํฐํธ ํฌ๊ธฐ
color: 'white',
},
});
export default App;
์ด๋ ๊ฒ ํ๋ฉด ์ด๋ค ํฌ๊ธฐ์ ํ๋ฉด์์๋ ๊ท ํ ์กํ UI๋ฅผ ๋ณด์ฌ์ค ์ ์์ด์. ์์ดํฐSE๋ถํฐ ์์ดํจ๋ ํ๋ก๊น์ง, ๋ชจ๋ ๊ธฐ๊ธฐ์์ ๋ฉ์ง๊ฒ ๋ณด์ผ ๊ฑฐ์์! ๐
๐ก ํ๋ก ํ: ํ๋ฉด ๋ฐฉํฅ์ด ๋ฐ๋ ๋๋ง๋ค ์คํ์ผ์ ๋ค์ ๊ณ์ฐํ๊ณ ์ถ๋ค๋ฉด, Dimensions.addEventListener('change', updateStyles)
๋ฅผ ์ฌ์ฉํด๋ณด์ธ์. ์๋ฒฝํ ๋ฐ์ํ ์ฑ์ ๋ง๋ค ์ ์๋ต๋๋ค!
์ฌ๊ธฐ๊น์ง ๊ณ ๊ธ ์คํ์ผ๋ง ๊ธฐ๋ฒ๋ค์ ์ดํด๋ดค์ด์. ์ด์ ์ฌ๋ฌ๋ถ์ ์ง์ ํ ๋ค์ดํฐ๋ธ ๋๋์ ์ฑ์ ๋ง๋ค ์ ์๋ ์ค๋ ฅ์๊ฐ ๋์๋ต๋๋ค! ๐
4. ๋ง๋ฌด๋ฆฌ: ๋ค์ดํฐ๋ธ ๋๋ ๋ด๊ธฐ์ ํต์ฌ ํฌ์ธํธ ๐ฏ
์ฐ์, ์ ๋ง ๋ง์ ๋ด์ฉ์ ๋ค๋ค์ฃ ? ์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ด์ฉ์ ์ ๋ฆฌํด๋ณผ๊ฒ์. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ก ๋ค์ดํฐ๋ธ ๋๋์ ๋ด๋ ํต์ฌ ํฌ์ธํธ๋ ๋ค์๊ณผ ๊ฐ์์:
- ํ๋ซํผ๋ณ ์คํ์ผ๋ง: iOS์ Android์ ์ฐจ์ด๋ฅผ ์ดํดํ๊ณ , ๊ฐ ํ๋ซํผ์ ๋ง๋ UI๋ฅผ ์ ๊ณตํ์ธ์.
- ๋ค์ดํฐ๋ธ UI ์ปดํฌ๋ํธ ํ์ฉ: ๊ฐ ํ๋ซํผ์ ๋ค์ดํฐ๋ธ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ทน ํ์ฉํ์ธ์.
- ์ ๋๋ฉ์ด์ ๊ณผ ์ ์ค์ฒ: ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ๊ณผ ์ง๊ด์ ์ธ ์ ์ค์ฒ๋ก ์ฑ์ ๋์ฑ ์๋๊ฐ ์๊ฒ ๋ง๋์ธ์.
- ์ปค์คํ ํฐํธ์ ๋คํฌ ๋ชจ๋: ๋ธ๋๋ฉ์ ๊ฐํํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ์ธ์.
- ๋ฐ์ํ ๋์์ธ: ๋ชจ๋ ํ๋ฉด ํฌ๊ธฐ์ ์๋ฒฝํ๊ฒ ๋์ํ๋ UI๋ฅผ ๋ง๋์ธ์.
์ด ๋ชจ๋ ๊ฒ์ ๋ง์คํฐํ๋ฉด, ์ฌ๋ฌ๋ถ์ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ์ฑ์ ์ง์ง ๋ค์ดํฐ๋ธ ์ฑ๊ณผ ๊ตฌ๋ณํ๊ธฐ ์ด๋ ค์ธ ์ ๋๋ก ๋ฉ์ ธ์ง ๊ฑฐ์์! ๐
๋ง์ง๋ง ์กฐ์ธ: ์ง์์ ์ธ ํ์ต๊ณผ ์คํ์ด ํต์ฌ์ด์์! ๐
๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ์ธ๊ณ๋ ๊ณ์ํด์ ๋ฐ์ ํ๊ณ ์์ด์. ์๋ก์ด ๊ธฐ๋ฅ๊ณผ API๊ฐ ๊ณ์ ๋์ค๊ณ ์์ฃ . ๊ทธ๋ฌ๋ ํญ์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฒดํฌํ๊ณ , ์๋ก์ด ๊ธฐ์ ์ ์คํํด๋ณด์ธ์. ์ฌ๋ฌ๋ถ์ ์ฑ์ ์ ์ ๋ ๋ฉ์ ธ์ง ๊ฑฐ์์!
๊ทธ๋ฆฌ๊ณ ์์ง ๋ง์ธ์. ์๋ฒฝํ ๋ค์ดํฐ๋ธ ๋๋์ ๋ด๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ๊ฐ์ฅ ์ค์ํ ๊ฑด ์ฌ์ฉ์์๊ฒ ๊ฐ์น๋ฅผ ์ ๋ฌํ๋ ๊ฑฐ์์. ๊ธฐ์ ์ ๊ทธ ๊ฐ์น๋ฅผ ๋ ์ ์ ๋ฌํ๊ธฐ ์ํ ๋๊ตฌ์ผ ๋ฟ์ด๋๋๋ค. ๐
์, ์ด์ ์ฌ๋ฌ๋ถ์ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ก ๋ค์ดํฐ๋ธ ๋๋ ๋ด๊ธฐ์ ๋ชจ๋ ๊ฒ์ ์๊ฒ ๋์์ด์. ์ด ์ง์์ ํ์ฉํด ๋ฉ์ง ์ฑ์ ๋ง๋ค์ด๋ณด์ธ์. ์ฌ๋ฌ๋ถ์ ์ฑ์ด ์ฑ์คํ ์ด์ ํ๋ ์ด์คํ ์ด๋ฅผ ํฉ์ธ ๋ ์ ๊ธฐ๋ํ๊ณ ์์๊ฒ์! ํ์ดํ ! ๐ช๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ