23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
안녕하세요 Teus입니다.
올해부터 DEVOCEAN을 통해서 스터디를 진행하고 있습니다!
제가 준비한 주제는 React를 활용해서 크로스플랫폼을 플랫폼 어플리캐이션을 만드는 React Native입니다!
이번주는 6주차에 진행한 스터디 내용을 다루는 포스팅 입니다!
이번주도 역시 아이스브레이킹 -> Figma 공유 -> 조별토의 -> 마무리 토의 순서로 진행되었습니다.
지난주에 대비해서 바뀐거는 없네요 :)
바뀐건 바로 아이스브레이킹!
이번주는 PSJ님이 진행을 해 주셨고, 이번주는 라이어 게임임 이었습니다 :)
(라이어게임 규칙을 설명해주시는 PSJ님)
(명탐정 태웅님의 라이어 색출작업중....)
그리고 이번주에는 FireBase를 활용한 사진앱 만들기 9장의 초반부를 읽고 토의를 진행 하였습니다.
(9장 초반주에 대한 내용을 Figma를 이용한 토의시간)
자 그러면 이번주에 배운 내용을 리뷰해 보겠습니다.
일반적으로 HTML에서는 Tag의 Property를 할당할 때 key:value 형태로 keyword argument 방식으로 property 를 설정해 줍니다.
React에서 사용하는 JSX의 경우, 외부에서 만든 변수를 동적으로 사용할 수가 있습니다.
이때 JSX의 특이한 문법으로, {} 안에서 {}를 한번더 사용하여, 변수를 바로 keyword argument로 넣어줄 수가 있습니다.
(...)
function CameraButton() {
const insets = useSafeAreaInsets();
//여기서 선언된 bottom은 platform에 따라서 바뀔 뿐
//해당 변수가 어떤 keyword props인지 정의되지 않음
const bottom = Platform.select({
android: TABBAR_HEIGHT / 2,
ios: TABBAR_HEIGHT / 2 + insets.bottom - 4,
});
return (
//JSX내부에서 {}을 한번 사용하면 javascript의 변수를 가지고 오지만
//여기서 {}를 한번더 사용하여, bottom = {bottom}의 결과를 만들어냄
<View style={[styles.wrapper, {bottom}]}>
<Pressable
android_ripple={{
color: '#ffffff',
}}
style={styles.circle}>
<Icon name="camera-alt" color="white" size={24} />
</Pressable>
</View>
);
}
(...)Component가 존재할 때, 두개이상의 Component가 같은 위치에 있으면 하나의 Component가 다른 Component를 가리게 됩니다.
이때 사용자가 원하는 순서를 설정할 수 있어야 하며, 이때 react native같은 경우 style에서 zIndex라는 것을 통해 결정하게 됩니다.
zIndex는 단순하게 생가해서 3차원 좌표계의 z축이랑 비슷합니다.
zIndex가 낮으면 바닥에 깔리고, zIndex가 높으면 가장 위에 존재하여 시각적으로 보이게 됩니다.
(...)
function MainTab() {
return (
<>
<View style={styles.block}>
<Tab.Navigator
screenOptions={{
headerShown: false,
tabBarShowLabel: false,
tabBarActiveTintColor: '#6200ee',
}}>
(...)
const styles = StyleSheet.create({
block: {
flex: 1,
zIndex: 0,
},
});
(...)갑자기 헛소리 한번 하고가면
라떼는 말이다... 으이! Modal 구현할라면 CSS로 다 만들고 그래쒀 마!
(출처 :링크)
하지만 요즘은 아니죠?
React Native에서는 Modal이라는 Component를 지원합니다.
그래서 이 Modal Component에 Props를 변경하는것 만크로 편하게 Modal을 사용할 수 있습니다
//custom Modal Component를 정의함
function UploadModeModal({visible, onClose}) {
return (
//React Native에서 지원하는 Modal Component 사용
<Modal
//visible prop을 통해서 Modal popup/exit 여부 사용
visible={visible}
transparent={true}
animationType="fade"
onRequestClose={onClose}>
//Modal 내부에서 보여질 내용을 정의
<Pressable style={styles.background} onPress={onClose}>
<View style={styles.whiteBox}>
<Pressable
(첫번째 선택지...)
</Pressable>
<Pressable
(두번째 선택지...)
</Pressable>
</View>
</Pressable>
</Modal>
);
}visible이 useState로 만들어진 prop이면, visible 값이 변할때 마다 Modal이 사라졌다, 생겼다 하는것을 예상해 볼 수 있습니다 :)
하지만 Modal을 사용하는 스타일은 주로 Android에서 아용하며, IOS에서는 Modal보다는 ActionSheet를 사용하게 됩니다.
(물론 IOS에서도 Modal을 사용해도 문제는 없습니다)
IOS의 Action Sheet
ActionSheetIOS 역시 React Native에서 built-in으로 지원하는 Component이며, 사용방법은 간단한편 입니다.
const onPress = () => {
//Modal을 키는 버튼을 눌렀을때, android의 경우 Modal만 보여지게
//visible props를 변경하고 함수를 종료
if (Platform.OS === 'android') {
setModalVisible(true);
return;
}
//IOS의 ActionSheet를 활성화 하는 부분
ActionSheetIOS.showActionSheetWithOptions(
{
options: ['카메라로 촬영하기', '사진 선택하기', '취소'],
cancelButtonIndex: 2,
},
//버튼을 위부터 순서대로 btnindex를 증가시키고, 이에따른 callback을 정의
(buttonIndex) => {
if (buttonIndex === 0) {
console.log('카메라 촬영');
} else if (buttonIndex === 1) {
console.log('사진 선택');
}
},
);
};Mobile 환경 특성상 키보드가 물리키가 아닌 소프트웨어 키보드를 사용합니다.
때문에 소프트웨어 키보드가 popup 되었을 경우 화면의 구성이 바뀔 필요성이 존재합니다.
이때 React Native에서는 Keyboard라는 Event 객체를 통해서 eventlistener 와 비슷한 방식으로 활용할 수가 있습니다.
const animation = useRef(new Animated.Value(width)).current;
const [isKeyboardOpen, setIsKeyboardOpen] = useState(false);
/*
등록 가능한 event name
keyboardWillShow
keyboardDidShow
keyboardWillHide
keyboardDidHide
keyboardWillChangeFrame
keyboardDidChangeFrame
*/
useEffect(() => {
//keyboard가 등장하면 isKeyboardOpen props을 변경함
const didShow = Keyboard.addListener('keyboardDidShow', () =>
setIsKeyboardOpen(true),
);
const didHide = Keyboard.addListener('keyboardDidHide', () =>
setIsKeyboardOpen(false),
);
return () => {
//component가 사라지면 위 keyboard event들을 제거함
didShow.remove();
didHide.remove();
};
}, []);
//useRef의 value를 사용한 키보드 표시에 따른 animation 구현
useEffect(() => {
Animated.timing(animation, {
toValue: isKeyboardOpen ? 0 : width,
useNativeDriver: false,
duration: 150,
delay: 100,
}).start();
}, [isKeyboardOpen, width, animation]);
return (
<View style={styles.block}>
<Animated.Image
source={{uri: res.assets[0]?.uri}}
//animation 값을 사용해서 height를 조정시킴
style={[styles.image, {height: animation}]}
resizeMode="cover"
/>
(...)벌써 스터디의 중간이 지나고 있습니다.
이번주 역시 조별 토의 이후에, 각 조별로 진행사항을 공유 하였습니다.
(디자이너 태웅님 ,핸드메이드 와이어프레임 만드는중...)
(2조는 식단화면 다 짜고, 이제 운동 관리할 내용 짜는중...)
(다같이 모여서 조별 진행사항 이야기 하는중)
다음 주차까지 진행하면 React Native 자체를 활용하는 내용은 끝이 납니다.
이후에는 React Native를 좀더 효율적으로 활용하기 위한 라이브러리 활용 부분의 내용이 이어집니다.
다음 포스팅으로 또 찾아뵙겠습니다!
모두 즐거운 하루 되시기 바랍니다!
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.