
왼쪽이 android, 오른쪽이 ios이다.
딱봐도 'ios쪽의 골드색 카드 margin이 너무 크다...'라는 생각이 든다.
그래서 Platform이란걸 import해서 android일때, ios일때 마진, 패딩을 따로 주려하니까 '이게 맞나...?'싶었다.
리액트 네이티브가 처음이라 해결책을 gpt에게 물어봤다.
firstPlaceCard: {
flexDirection: 'row',
alignItems: 'center',
padding: Platform.OS === 'ios' ? spacing.lg : spacing.xl,
},
리액트 네이티브로 개발중인데 왜 안드로이드에서는 패딩 잘 먹는데 ios에서는 패딩 넣으면 마진도 같이 넣어지는거야?
카드 크기가 작아짐;;
안드로이드에서는 의도한 대로 카드 내부 여백만 늘어나지만,
iOS에서는 마치 마진이 생긴 것처럼 카드 전체 크기가 줄어든 느낌이 들었습니다.
결론부터 말씀드리면,
iOS는 padding을 “내부 영역을 깎는 개념”으로 훨씬 엄격하게 계산하기 때문입니다.
실제 마진이 추가된 것은 아니지만,
다음 요소들이 겹치면서 카드가 작아진 것처럼 보이게 됩니다.
iOS에서는 다음과 같은 구조에서 문제가 자주 발생합니다.
height, minHeight, flex 등의 제약이 있음padding을 직접 적용함이 경우 iOS는
👉 정해진 높이 안에서 padding을 내부 공간으로 계산
👉 결과적으로 콘텐츠 영역이 줄어들어 카드가 작아 보이게 됩니다.
안드로이드는 이 부분을 비교적 관대하게 처리합니다.
iOS의 SafeAreaView는 자동으로 inset padding을 적용합니다.
<SafeAreaView>
<View style={{ padding: spacing.lg }}>
이 구조에서 카드에도 padding을 주면
이 중첩 계산되어 카드가 주변에서 밀린 것처럼 보이게 됩니다.
iOS는 다음 조합에서 특히 민감합니다.
alignItems: 'center'이 조합이 겹치면 서브픽셀 반올림 때문에
위아래 여백이 줄어든 것처럼 보이는 현상이 발생합니다.
<View style={styles.firstPlaceCard} />
firstPlaceCard: {
padding: spacing.lg,
}
<View style={styles.firstPlaceCard}>
<View style={styles.cardContent}>
...
</View>
</View>
firstPlaceCard: {
flexDirection: 'row',
alignItems: 'center',
},
cardContent: {
padding: Platform.OS === 'ios' ? spacing.lg : spacing.xl,
},
이렇게 하면
디자인을 정확히 맞춰야 할 경우, 아래와 같은 보정도 실무에서 자주 사용됩니다.
padding: Platform.OS === 'ios'
? spacing.lg + 2
: spacing.xl,
또는
paddingVertical: Platform.OS === 'ios' ? spacing.lg : spacing.xl,
paddingHorizontal: spacing.xl,
height + paddingSafeAreaView 안에서 중첩 paddingalignItems: 'center'| 구분 | 내용 |
|---|---|
| 현상 | iOS에서 padding을 주면 카드가 작아 보임 |
| 실제 원인 | padding이 내부 영역으로 계산됨 |
| 안드로이드는 정상인 이유 | 레이아웃 계산이 비교적 느슨함 |
| 가장 좋은 해결책 | padding을 내부 View로 분리 |
리액트 네이티브에서
“iOS만 이상하다”는 느낌이 들 때는 대부분 레이아웃 계산 방식 차이 때문입니다.
특히 카드 UI에서는
👉 padding은 외형이 아니라 내부 콘텐츠에 적용한다
라는 원칙을 지키면 플랫폼 차이로 인한 스트레스를 크게 줄일 수 있습니다.
iOS와 안드로이드에서 동일한 UI를 안정적으로 맞추고 싶다면,
이 구조를 기본 패턴으로 가져가는 것을 추천드립니다.
gpt가 준 가장 좋은 해결책대로 padding을 내부 view로 분리하여 해결했다.