
사용자의 위치를 알아내고 싶어서 GPS를 사용하고 싶었다.
npx expo install expo-location
import React, { useState, useEffect } from "react";
import { View, Text, Button } from "react-native";
import * as Location from "expo-location";
const LocationScreen = () => {
const [location, setLocation] = useState(null);
const [errorMsg, setErrorMsg] = useState(null);
useEffect(() => {
(async () => {
let { status } = await Location.requestForegroundPermissionsAsync();
if (status !== "granted") {
setErrorMsg("Permission to access location was denied");
return;
}
let loc = await Location.getCurrentPositionAsync({});
setLocation(loc);
})();
}, []);
let text = "Waiting..";
if (errorMsg) {
text = errorMsg;
} else if (location) {
text = `Latitude: ${location.coords.latitude}, Longitude: ${location.coords.longitude}`;
}
return (
<View>
<Text>{text}</Text>
</View>
);
};
export default LocationScreen;
리액트 네이티브에서 <Button> 컴포넌트는 직접적으로 style 속성을 지원하지 않기 때문에, 스타일을 적용하려면 <Button> 대신 다른 컴포넌트(예: <TouchableOpacity> 또는 <Pressable>)를 사용하거나, Button 외부에 스타일이 적용된 래퍼(View)를 만들어야 합니다.
<Button>, <TouchableOpacity>, <Pressable>은 모두 리액트 네이티브에서 터치 가능한 요소를 구현하기 위한 컴포넌트지만, 기능과 스타일링에 차이가 있습니다.
<Button>기능: 기본적인 터치 가능한 버튼을 제공합니다.
스타일링: title(텍스트), onPress(터치 이벤트 핸들러) 등의 속성만을 제공하며, 기본적으로 스타일을 커스터마이즈하기가 어렵습니다. 배경색이나 텍스트 스타일을 변경하는 것이 제한적입니다.
사용 용도: 빠르게 간단한 버튼을 추가할 때 사용하기 좋습니다. 기본적인 스타일로도 충분하다면 <Button>이 편리합니다.
<TouchableOpacity>기능: 사용자가 터치했을 때 투명도가 변하는 버튼을 구현할 수 있습니다. 터치할 때 버튼의 불투명도가 낮아지면서 "눌리는" 효과를 주는 것이 특징입니다.
스타일링: 스타일링이 매우 유연합니다. style 속성을 통해 다양한 스타일을 적용할 수 있으며, 텍스트나 이미지 등 다른 컴포넌트와 함께 사용할 수 있습니다.
사용 용도: 버튼을 커스터마이즈해야 하거나, 텍스트 외에 이미지를 사용해야 할 때 적합합니다.
<Pressable>기능: 리액트 네이티브에서 제공하는 최신 터치 이벤트 핸들링 컴포넌트로, onPress, onPressIn, onPressOut, onLongPress 등 다양한 터치 이벤트에 대한 세밀한 제어가 가능합니다.
스타일링: TouchableOpacity와 마찬가지로 매우 유연한 스타일링이 가능합니다. 또한, 이벤트 상태(예: pressed)에 따라 다른 스타일을 적용할 수 있는 기능이 있어 보다 다이나믹한 사용자 경험을 제공할 수 있습니다.
사용 용도: 더 복잡한 터치 상호작용을 구현해야 하거나, 상태에 따라 스타일을 변경해야 할 때 사용됩니다.
<Button>: 간단한 버튼으로, 기본 스타일만 필요할 때 사용.
<TouchableOpacity>: 터치 시 투명도가 변화하는 효과와 유연한 스타일링이 필요할 때 사용.
<Pressable>: 터치 이벤트에 대한 더 많은 제어가 필요하거나, 상태에 따라 스타일을 변경해야 할 때 사용.
각 컴포넌트는 목적에 맞게 사용하면 되며, 버튼의 외관과 동작을 더 세밀하게 제어하고 싶다면 나 을 사용하는 것이 좋습니다.
25.10.30수정
https://leerowoon.dev/posts/react-native-shadow-style
new architecture가 도입되고
BoxShadow스타일을 적용할 수 있게 되었다.
리액트 네이티브에서 그림자를 주는 방법은 플랫폼에 따라 다르게 적용됩니다. 리액트 네이티브는 iOS와 안드로이드 모두에서 동작하지만, 두 플랫폼의 그림자 처리가 다르기 때문에 각 플랫폼에 맞는 설정을 해야 합니다.
shadowColor, shadowOffset, shadowOpacity, shadowRadius를 사용합니다.import { View } from 'react-native';
const MyComponent = () => {
return (
<View style={{
shadowColor: '#000', // 그림자 색상
shadowOffset: { width: 0, height: 2 }, // 그림자의 위치
shadowOpacity: 0.8, // 그림자의 불투명도
shadowRadius: 3, // 그림자의 반경
}}>
{/* Your content here */}
</View>
);
};
import { View } from 'react-native';
const MyComponent = () => {
return (
<View style={{
elevation: 5, // 그림자의 높이
}}>
{/* Your content here */}
</View>
);
};
import { View, Platform } from 'react-native';
const MyComponent = () => {
return (
<View style={{
...Platform.select({
ios: {
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.8,
shadowRadius: 3,
},
android: {
elevation: 5,
},
})
}}>
{/* Your content here */}
</View>
);
};
이렇게 하면 각각의 플랫폼에 맞는 그림자 스타일이 적용됩니다.
이미지를 http통신을 통해서 백서버로 보내려고 api요청을 보냈는데 자꾸
TypeError: Network request failed 라는 에러가 발생하였다.
여기저기 검색해봐도 방법이 없었는데 아래 블로그에서 같은 에러를 겪은 선례를 발견하였다.
레퍼런스
하지만 이 분도 에러의 원인은 찾지 못했고, 에러가 나지 않게 보내는 법을 알려주신다.
방법은 이미지를 blob으로 바꿔서 보내는 것이다.
const formData = new FormData();
imgs.forEach((img, index) => {
formData.append("photos", {
uri: imgs[index], // 이미지 URI (file:// 형식)
type: "image/jpeg", // MIME 타입
name: `photo${index}.jpg`, // 파일 이름
});
});
위의 코드처럼 폼데이터에 이미지를 하나하나 넣어주었고, 보내는데 성공했다.
최소 너비(min-content width) 기반 크기 결정
TextInput은 flex:1이 있어도, 콘텐츠(placeholder/텍스트) 길이를 기준으로 자체 최소 너비를 가진다.
flex-row + flex-wrap 환경에서는 가로만 확장됨
세로 높이는 intrinsic height 그대로 유지되고,
가로는 남은 공간만큼 확장되지만 부모 높이를 채우지 않는다. (flex: 1이어도)
다른 컴포넌트들과 flex-wrap,flex-row를 가진 View에 있을 시
남은 가로 공간이 최소 너비보다 작아지면 자동 줄바꿈 따라서 minWidth를 지정하면 줄바꿈 시점을 조절할 수 있음
includeFontPadding·lineHeight 영향 있음
Android는 includeFontPadding 영향으로 기본 높이가 더 커질 수 있다.
아래코드 적용시 기본 설정된 패딩을 없앨 수 있다.
style={{
paddingVertical: 0,
paddingTop: 0,
paddingBottom: 0,
includeFontPadding: false,
}}
npm:react-native-svg-transformer
npm:react-native-indicators
npm 문서대로 하되 ts를 쓴다면 아래 설정을 해준다.
declarration.d.ts 폴더에 declare module 'react-native-indicators';추가해서
react-native-indicators 모듈을 any 타입으로 인식하게 한다.
웹에서와 달리, 그라데이션을 주려면 style에서는 못하고, 라이브러리를 받아서 컴포넌트를 사용해야한다.
공식문서
블로그
react-native-safe-area-context를 install해 사용한다.
사용해봤는데,
import {SafeAreaView} from 'react-native';
는 IOS만 지원하는데 반해
import {SafeAreaView} from 'react-native-safe-area-context';
는 Android도 지원한다.
스플래시 돌아가는 동안 로딩 할거 하면 좋음
글로 작성
supabase와 react-native 연결
Sign In with Apple
Sign In with Google
사진저장,가져오기