플러팅 AI/React-native

RN 으로 짠 Modal 이 android 에서는 잘만 작동하다가 IOS는 이유

Solo.dev 2024. 12. 26. 22:01

React Native를 활용한 앱 개발에서 Modal은 매우 유용한 컴포넌트입니다. 그런데 Modal이 Android에서는 잘 작동하지만 iOS에서만 이상한 문제가 발생하는 경우가 있습니다. 특히, 모달이 열리지 않거나 UI가 깨지는 상황은 많은 개발자들에게 혼란을 줄 수 있습니다. 이번 글에서는 이러한 문제가 왜 발생하는지, iOS와 Android의 차이는 무엇인지, 그리고 어떻게 해결할 수 있는지를 자세히 알아보겠습니다.


1. iOS와 Android의 Modal 처리 방식 차이

iOS: 새로운 View 계층 생성

iOS에서 Modal은 기존 화면 위에 **새로운 뷰 계층(View Hierarchy)**을 생성하여 렌더링됩니다. 이 뷰는 전체 화면을 덮으며 다른 모든 요소와 독립적으로 동작합니다. 따라서, 모달이 이미 활성화된 상태에서 또 다른 모달을 띄우려고 하면 다음과 같은 문제가 발생할 수 있습니다:

  • 두 개의 모달 상태가 충돌하여 하나가 렌더링되지 않음.
  • 기존 모달이 터치 이벤트를 차단하여 새로운 모달이 제대로 동작하지 않음.

Android: 오버레이 방식

반면 Android에서는 Modal이 기존 화면 위에 오버레이(Overlay) 형태로 렌더링됩니다. 이로 인해 두 개의 모달이 활성화되어도 큰 충돌 없이 렌더링되는 경우가 많습니다.

결론적으로, iOS는 새로운 뷰 계층을 생성하기 때문에 모달 상태와 뷰 계층 관리가 훨씬 더 중요합니다.


2. 왜 iOS에서는 문제가 발생할까?

문제 원인: 상태 관리의 충돌

React Native에서 Modal은 visible 속성으로 열리고 닫힙니다. 하지만 iOS에서는 다음과 같은 문제가 발생할 수 있습니다:

  1. 동시에 두 개의 모달이 활성화됨
    • 두 모달(Modal A와 Modal B)의 상태가 모두 true로 설정되면, iOS에서는 어떤 모달을 우선적으로 렌더링해야 할지 알 수 없어 렌더링 충돌이 발생합니다.
    • 예를 들어, 프로필 모달(Modal A)이 열려 있는 상태에서 구독 모달(Modal B)을 열려고 하면 UI가 깨지거나 새로운 모달이 렌더링되지 않을 수 있습니다.
  2. 뷰 계층 충돌
    • iOS에서 Modal은 최상위 뷰 계층을 차지합니다. 하지만 이 뷰가 기존 모달의 계층과 겹치거나 터치 이벤트가 기존 모달에 의해 차단되면 새로운 모달이 정상적으로 작동하지 않습니다.
  3. React 상태 업데이트와 네이티브 UI 간의 비동기 문제
    • React 상태 업데이트(setState)가 iOS 네이티브 UI와 동기화되지 않아 모달이 즉시 열리지 않는 문제가 발생할 수 있습니다.
    • 예를 들어, setState 호출 후 바로 모달을 열려고 하면 상태가 아직 업데이트되지 않아 UI가 반영되지 않는 상황이 생깁니다.

3. 해결 방법: iOS에서 Modal 문제를 방지하는 내가 사용한 방법 

1) 하나의 모달만 활성화

React 상태를 통해 동시에 하나의 모달만 활성화되도록 상태를 관리해야 합니다. 새로운 모달을 열기 전에 기존 모달을 닫는 것이 중요합니다.

코드 예제:



const handleUnlimitedService = () => {
  if (isProfileModalVisible) {
      setProfileModalVisible(false); // 기존 모달 닫기
  }

  setTimeout(() => {
      setShowSubscriptionModal(true); // 새로운 모달 열기
  }, 0);
};


 

4. iOS와 Android에서 Modal을 동일하게 관리하기

iOS와 Android 모두에서 안정적으로 모달을 관리하려면 다음의 원칙을 준수하세요:

  1. 하나의 모달만 활성화되도록 보장
    • 새로운 모달을 열기 전에 기존 모달을 닫는 로직을 추가합니다.
       

5. 결론

React Native에서 iOS와 Android는 Modal을 처리하는 방식에 차이가 있습니다. Android에서는 문제가 없던 코드가 iOS에서 제대로 작동하지 않는 이유는 뷰 계층 관리와 이벤트 처리 방식의 차이 때문입니다.

iOS 모달 처리의 핵심:

  1. 하나의 모달만 활성화: 상태 충돌을 방지.

이 글을 통해 React Native로 iOS 모달 문제를 해결하고 안정적인 상태 관리 방법을 배우셨기를 바랍니다. 😊

다른 방법도 많으니 다른 방법으로도 시도해보시길 바랍니다 안되시면