<์์ฝ>
์ด๋ฒ ๊ฐ์์์ ํ ๊ฒ์,
๊ฐค๋ฌ๋ฆฌ ์๋จ ๋ถ์ ํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ ์ํ ์จ๋ฒ ๋ช + ์จ๋ฒ ์ถ๊ฐ ํ๋ฉด ๋จ๋๋ก ๋ง๋ค๊ธฐ .
์จ๋ฒ ์ถ๊ฐ๋ ๋ฒํผ ๋๋ฅด๋ฉด ํ์ ์ด ๋จ๋๋ก ํ๊ณ , ํด๋น ํ์ ์ text input์ ๋์ด์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅ ํ ์ ์๊ฒ ํ๊ธฐ.
์์ง ์ ๋ ฅ ๊ฐ์ด ์ ๋ฌ๋์ ์๋ก์ด ์จ๋ฒ์ด ๋ง๋ค์ด์ง๋ ๊ฒ์ ๊ตฌํ ํ์ง ์์๋ค.
1. ๋ก์ง
2. ์ฝ๋ ๋ฆฌ๋ทฐ
(1) use-gallery (customHook ๋ถ๋ถ)
์ฐ์ผ ์ํ ๋ณ์ ๋ชจ์
selectedAlbum์ ํ์ฌ ์ ํ๋ ์จ๋ฒ์ ์ด๋ฆ์ ๋งํ๋ ๊ฒ์ด๊ณ , albumTitle์ ์ฌ์ฉ์๊ฐ ์ ๊ท ์ ๋ ฅํ ์จ๋ฒ์ ์ด๋ฆ์ด ๋ค์ด๊ฐ๋ ๊ณณ์ด๋ค.
albums๋ ํ์ฌ ์ ์ฅ๋ ์จ๋ฒ์ ๋ชฉ๋ก์ด๋ค.
modalVisible์ ํ์ ์ฐฝ on/off ์ฉ ์ํ๋ณ์์ด๋ค.
์ ๊ท ์ถ๊ฐ๋ ํจ์ : ๋ชจ๋ฌ์ด๋ผ๋ ํ์ ์ฐฝ ์ผ๊ธฐ / ๋๊ธฐ
(2) App.js
App.js์ ํฐ ์ญํ ์
๋ค๋ฅธ ํ์ผ์์ ๋ง๋ ๊ธฐ๋ฅ์ ๊ทธ๊ฒ์ ์ ํํํ๋ ์ด๋ฆ์ ๋ถ์ฌ ๋ช ์ธ์ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
์ด๊ฒ์ผ๋ก ๋์ฑ ๊ฐ๋ ์ฑ์ด ์ข์์ง๋ค.
์์์ ๋ดค๋ฏ์ด textInput์๋ ์ฌ์ฉ์๊ฐ ์ ๊ท ์ ๋ ฅํ ์จ๋ฒ์ด๋ฆ์ ์ํ๋ณ์๊ฐ, MyDropDownPicker์๋ ์ฌ์ฉ์๊ฐ ํ์ฌ ๋ค์ด๊ฐ ์จ๋ฒ์ ์ด๋ฆ ์ํ๋ณ์๊ฐ ๊ฐ๊ฐ ๋ค์ด๊ฐ๋ค.
(3) MyDropDownPicker
(ํ์ฌ ์ ์ํ ์จ๋ฒ์ ์ ๋ชฉ๊ณผ ์จ๋ฒ ์ถ๊ฐ๋ฒํผ ๊ตฌํ -> ์จ๋ฒ ์ถ๊ฐ ๋๋ฅผ ์ ํ์ ์ฐฝ ๋ธ)
openModal => onPressAddAlbum => ์จ๋ฒ ์ถ๊ฐ๋ผ๋ TouchableOpacity์ ๋ค์ด์๋ค.
(4) TextInputModal
(์ ๊ท ์จ๋ฒ ์ถ๊ฐ๋ฅผ ์ํ ํ์ ์ฐฝ ๋ด๋ถ๋ฅผ ๊ตฌํ, ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ด๋ฆ์ผ๋ก ์๋ก์ด ์จ๋ฒ ๋ง๋ฆ)
Modal์ด๋ ํ๊ทธ์ ๋ํด ์ค๋ช ํ๊ฒ ๋ค.
๋จผ์ ์ฒซ ๋ฒ์งธ ์์ฑ animationType์ ๋ชจ๋ฌ์ด ๋ฐ ๋ ์ด๋ค ์ ๋๋ฉ์ด์ ์ ์ฃผ๊ฒ ๋๋ ์๋ฆฌ์ด๋ค. fade๋ก ๋์ด์์ผ๋ฉด fade in ํจ๊ณผ๋ฅผ ์ฃผ๋ฉด์ ๋ฌ๋ค. transParent๋ ํ์ ์ฐฝ์ด ๋ค์ ํ๋ฉด๋ ๋ณด์ด๊ฒ ํฌ๋ช ํ ๊ฒ์ธ๊ฐ ์๋๊ฐ ์ด๋ค.
Visible์ Activate์ ๊ฐ์ ์๋ฏธ๋ผ ๋ณด๋ฉด๋๋ค. true์ด๋ฉด ํ์ ์ฐฝ์ด ํ๋ฉด์๋ก ๋จ๊ณ , false์ด๋ฉด ๊บผ์ง๋ค.
Modal ์์ ์์ ํ๊ทธ๋ค์ ํ์ ์ฐฝ์ด ๋ฐ ๋ ๋ณด์ฌ์ง๋ ์ ๋ค์ด๋ค.
์ฌ๊ธฐ์๋ ์ผ๋จ TextInput ํ๋์ด๋ค. TextInput์ ์ ์ ๊ฐ๋ค์ OnchangeText๊ฐ ๋ฐ์์ setAlbumTitle์ ์ธ์๋ก ๋ฃ์ด์ค๋ค.
TextInput์ ๊ฐ์ธ๋ View๊ฐ 3๊ฐ์ธ๋ฐ SafeAreaView๋ ์ธํ์ด ํ๋ฉด ์์ชฝ์ผ๋ก ์ค๋๋กํ๋ ๊ฒ์ด๊ณ
KeyBoardAvoidingView๋ ํค๋ณด๋๊ฐ ๋ด์ ๋, ์ธํ ์ฐฝ์ด ํค๋ณด๋ ์๋ก ์ค๋๋ก ํ๋ ์ฉ๋์ด๋ค.
View๋ KeyBoardAvoidingView ๋๋ฌธ์ ์กด์ฌํ๋ ๋ ์์ธ๋ฐ, KBAV๊ฐ ์๋ํ๊ธฐ ์ํ ์ ์ ์กฐ๊ฑด์ผ๋ก behavior ์์ฑ์ ํํ ์์ฑ, ์์ View ํ๊ทธ์ flex: 1์ด๋ผ๋ ์กฐ๊ฑด์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ 3๋ฒ์์ ๋ ์์ธํ ๋ค๋ฃจ๊ฒ ๋ค.
3. ์๋กญ๊ฒ ์๊ฒ ๋ ๊ฒ
(1) Absolute์ ๋ํ์ฌ
CSS์ absolute position ์๋ ๋ฉ์ปค๋์ฆ ์ดํด | Engineering Blog by Dale Seo
CSS์์ ๋ฐฐ์ด Position : "absolute" ์์ฑ์ ์กฐ์ ์์๋ค ์ค์ ๊ฐ์ฅ ๊ฐ๊น์ด position์ด relative ์ธ ๋ ์์ ๊ธฐ์ค์ผ๋ก top,bottom,right,left์ ๊ฐ์ ์ค, ๊ฐ๊ฐ ํด๋น ์กฐ์ ์์๋ก๋ถํฐ ์์์ ์ผ๋ง๋ ๋ฐ์์ ์ผ๋ง๋, ์ค๋ฅธ์ชฝ์์ ์ผ๋ง๋, ์ผ์ชฝ์์ ์ผ๋ง๋ ๋จ์ด์ง ๊ฒ์ธ๊ฐ๋ฅผ ๋งํด์ฃผ๋ ์์ฑ์ด์๋ค.
position์ด absolute์ด๋ฉด ๋ ์ด์ ๋ถ๋ชจ ์์์ ์๋ฐ๋์ง ์๋ ํน์ฑ์ด ์๋ค.
์ผ๋ฐ HTML์ ํ๊ทธ์ position ์์ฑ์ default ๊ฐ์ด static(๊ณ ์ )์ด์๋ค.
ํ์ง๋ง ReactNative ์์๋ ๋ชจ๋ ํ๊ทธ์ position ์์ฑ์ด relative์ด๋ค. ๋ฐ๋ผ์
์ด๋ค ํ๊ทธ์ position์ absolute๋ก ๋๋ฆฌ๋ฉด ๋ฌด์กฐ๊ฑด ๋ถ๋ชจ ์์๋ก๋ถํฐ top,bottom,left,right๋ก ์ผ๋ง๋ ๋จ์ด์ง์ง๋ฅผ ์ ๋๋ค.
(2) AvoidingView์ ๋ํด์
KeyboardAvoidingView · React Native
AvoidingView๊ฐ ์ ๋๋ก ์๋ํ ๋ ค๋ฉด
behavior ์์ฑ์ ๊ผญ ์ ์ด์ค์ผํจ.
behavior ์์ฑ์ ํค๋ณด๋๊ฐ ๋ด์ ๋ ํด๋น ํ๊ทธ๊ฐ ์ด๋ป๊ฒ ๋ฐ์ํ ๊ฒ์ธ์ง์ ๋ํ ๊ฒ์ด๋ค.
๊ธฐ๊ธฐ์ ์ด์์ฒด์ ๊ฐ ios์ธ์ง android์ธ์ง์ ๋ฐ๋ผ ํค๋ณด๋๊ฐ ๋ด์ ๋ ํด๋น ํ๊ทธ๊ฐ ์ด๋ป๊ฒ ๋ฐ์ ํ ๊ฒ์ธ์ง๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก,
behavior ์์ฑ์ ๊ผญ ๊ตฌ๋ถ์ง์ด ๊ธฐ๋ก ํ์
<KeyboardAvoidingView
behavior={Platform.OS === "ios" ? "padding" : "height"}
style={{ flex: 1 }}
>
AvoidingView๊ฐ ๋ ์ ๋๋ก ์๋ํ ๋ ค๋ฉด ํ ๊ฐ์ง ์กฐ๊ฑด์ด ๋ ์๋๋ฐ,
์์ View๊ฐ ํ๋์ฌ์ผ ํ๋ค. (์๋ ์๋ ๋ด์ฉ๋ค์ View ํ๊ทธ๋ฅผ ๋ง๋ค์ด ๊ฐ์ธ์.)
์์ View์ flex: 1 ์ด์ฌ์ผํ๋ค.
๊ทธ๋์ผ์ง Avoiding ๋ด๋ถ View๋ค์ด ๊ณ ์ ๋๋น๊ฐ ์์ด ๊ฐ๋ณ์ ์ด๊ฒ ๋๋ฏ๋ก, AvoidingView์ ๊ท์จ์ ๋ฐ๋ฅผ ์ ์๊ฒ ๋๋ค.
(3) TextInput์ ์์ฑ value์ onChaneText์ ๋ํ์ฌ
TextInput ํ๊ทธ์์ Value๋ ๊ทธ์ ์ ๋ ฅ ํ๋์ ์ด๊ธฐ๊ฐ์ ๋งํ๋ค.
Value๋ ์์ฑ์ ์ด๋ค ํ๊ทธ์ ๋ด๋ถ ์์ฑ์ด๋์ ๋ฐ๋ผ ์ญํ ์ด ํฌ๊ฒ ๋๋๋ค.
- “button”, “reset”, “submit” : ๋ฒํผ ๋ด์ ํ
์คํธ๋ฅผ ์ ์ํจ.
- “hidden”, “password”, “text” : ์
๋ ฅ ํ๋์ ์ด๊น๊ฐ์ ์ ์ํจ.
- “checkbox”, “image”, “radio” : ํด๋น ์
๋ ฅ ํ๋๋ฅผ ์ ํ ์ ์๋ฒ๋ก ์ ์ถ๋๋ ๊ฐ์ ์ ์ํจ.
OnChangeText๋ TextInput์ ํ ์คํธ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํธ์ถ๋๊ณ ๋ณ๊ฒฝ ๋ด์ฉ์ OnChangeText ๋ด๋ถ ๊ตฌํ ๋ก์ง์ผ๋ก ์ ๋ฌํ๋ค.
ํด๋น ๊ธ์ ๋ป์ ํ ์คํธ์ ๋ณ๋์ด ์์ ๋๋ง๋ค, ๊ทธ ๋ด์ฉ์ setAlbumTitle์ด๋ผ๋ ์ํ ๋ณ์ ์ด๊ธฐํ ํจ์์ ์ธ์๋ก ๋ฃ์ด์ฃผ๊ฒ ๋ค๋ ์๋ฏธ ์ด๋ค.