React Native
리액트 네이티브에서는 이미지의 크기를 반드시 명시적으로 설정해줘야 한다.
그리고 웹에서 사용하는 것 처럼 width, height를 auto로 값을 설정해주는 것도 불가능하다.
이미지를 부모 영역 안에서 width는 100%로 꽉 차게 하고,
height값은 이미지가 원래 가지고 있는 사이즈의 비율에 따라 자연스럽게 차지하게 만들었다.
import React, { useState } from 'react';
import { View, Image, Platform } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import styles from './styles';
const DetailScreen = () => {
// 이미지 비율을 저장할 상태 객체 (파일명을 키로 사용)
const [imageRatios, setImageRatios] = useState<{ [key: string]: number }>({});
const insets = useSafeAreaInsets(); // 안전 영역 설정
// 이미지가 로드되면 이미지의 비율 계산
const onImageLoad = (filename: string, event: any) => {
const { width, height } = event.nativeEvent.source;
if (width && height) {
setImageRatios((prev) => ({
...prev,
[filename]: width / height,
}));
}
};
return (
<View style={[styles.container, { paddingBottom: Platform.OS === 'ios' ? insets.bottom : 20 }]}>
<View style={styles.content}>
{data?.fileList.length > 0 &&
data.fileList.map((file, index) => (
<View
key={`file-${file.filename}`}
style={{
width: '100%',
marginBottom: 15,
}}>
<Image
source={{ uri: file.realPath }}
style={{
width: '100%',
aspectRatio: imageRatios[file.filename] || 1.5,
}}
resizeMode="contain"
onLoad={(event) => onImageLoad(file.filename, event)}
/>
</View>
))}
</View>
</View>
);
};
export default DetailScreen;const [imageRatios, setImageRatios] = useState<{ [key: string]: number }>({});imageRatios 객체는 각 이미지 파일명을 키로 하고, 해당 이미지의 가로/세로 비율을 값으로 저장한다.
const onImageLoad = (filename: string, event: any) => {
const { width, height } = event.nativeEvent.source;
if (width && height) {
setImageRatios((prev) => ({
...prev,
[filename]: width / height,
}));
}
};onLoad 이벤트에서 이미지의 실제 너비와 높이를 가져오고, 가로/세로 비율을 계산해서 상태에 저장한다.
<Image
source={{ uri: file.realPath }}
style={{
width: '100%',
aspectRatio: imageRatios[file.filename] || 1.5,
}}
resizeMode="contain"
onLoad={(event) => onImageLoad(file.filename, event)}
/>이미지의 너비는 컨테이너의 100%로 설정하고, aspectRatio 속성에 계산된 비율을 적용했다.
그리고 비율이 계산되지 않았을 경우 기본값으로 1.5를 넣어주었다.
이렇게 하면 리액트 네이티브 환경에서도 이미지 사이즈를 고정값으로 넣지 않고 auto처럼 설정해주는 것이 가능하다.