[React-Native] 노치 디자인 대응

2023. 11. 8. 13:52React Native

iPhone X 이후 모델의 노치(notch) 또는 홈 인디케이터(home indicator)로 인해 컨텐츠가 가려지는 문제가 발생할 수 있습니다. 이는 "Safe Area" 개념을 적용하여 해결할 수 있습니다. Safe Area는 노치나 홈 버튼이 존재하는 영역을 피해 콘텐츠가 올바르게 표시될 수 있도록 화면의 안전한 영역을 정의하는 것입니다.

SafeAreaView 사용하기

SafeAreaView 컴포넌트는 iOS의 노치와 같은 화면의 비표준 영역을 자동으로 감지하고, 해당 영역을 피해 콘텐츠가 올바르게 표시될 수 있도록 조정해줍니다.

import { SafeAreaView } from 'react-native';

<SafeAreaView style={{ flex: 1 }}>
  <WebView source={{ uri: 'https://example.com' }} />
</SafeAreaView>

StatusBar Height 조정하기

상태 표시줄(Status Bar)의 높이를 조정하여 WebView 상단의 패딩을 추가할 수도 있습니다. 이 방법은 react-native-status-bar-height 라이브러리를 사용하여 현재 상태 표시줄의 높이를 가져와서 적용합니다.

import { getStatusBarHeight } from 'react-native-status-bar-height';
import { WebView } from 'react-native-webview';

<WebView
  style={{ marginTop: getStatusBarHeight() }}
  source={{ uri: 'https://example.com' }}
/>

CSS 또는 Meta Tag 사용하기

웹 컨텐츠 내부에서 CSS를 사용하거나 meta 태그를 활용해 viewport를 조정하여 Safe Area를 적용하는 방법도 있습니다.

CSS 예시

padding-top: constant(safe-area-inset-top); /* iOS 11.0 */
padding-top: env(safe-area-inset-top); /* iOS 11.2 이상 */

Meta 태그 예시

<meta name="viewport" content="viewport-fit=cover">

react-native-safe-area-context 사용하기

react-native-safe-area-context 라이브러리를 사용하면, 디바이스의 안전 영역 경계를 고려하여 뷰를 배치할 수 있습니다.

import { SafeAreaProvider, useSafeAreaInsets } from 'react-native-safe-area-context';

function App() {
  const insets = useSafeAreaInsets();

  return (
    <SafeAreaProvider>
      <View style={{ paddingTop: insets.top }}>
        <WebView source={{ uri: 'https://example.com' }} />
      </View>
    </SafeAreaProvider>
  );
}

Flex Box 사용하기

flex 속성을 사용해 WebView 컴포넌트가 안전 영역 내에서 유연하게 크기를 조정하도록 만들 수 있습니다.

<WebView
  style={{ flex: 1 }}
  source={{ uri: 'https://example.com' }}
/>

WebView의 스크롤 인디케이터 조정

WebView의 스크롤 인디케이터도 Safe Area를 고려하여 조정해야 할 수 있습니다. 이는 위에서 언급한 방법들을 사용하여 Safe Area 안에서 컨텐츠가 표시되도록 하여 해결할 수 있습니다.

위 방법들을 사용하여 React Native의 WebView 컴포넌트가 iOS 기기의 노치나 홈 인디케이터로 인해 컨텐츠가 가려지는 문제를 해결할 수 있습니다. 개발 환경과 요구 사항에 맞게 가장 적절한 방법을 선택하여 적용하시기 바랍니다.