EEYatHo 앱 깎는 이야기

iOS ) iOS16 present 버그 - EEYatHo iOS 본문

iOS, Swift/Tip, Bug, Swift Error

iOS ) iOS16 present 버그 - EEYatHo iOS

EEYatHo 2022. 10. 11. 20:17
반응형

 

 

iOS16 에서 특정 조건을 만족하는 케이스에서 present 시 UI 가 깨진다.

 

 

버그 조건 설명


  1. iOS16
  2. 디바이스의 orientation 과, 앱에서 인지하는 orientation 이 다른 상황
  3. modalPresentStyle 이 pageSheet 와 formSheet 가 아닌 viewController 를 present

 

 

 

구현 영상 with gif


iOS16 시뮬레이터에서,

디바이스의 방향은 potraits, 앱의 방향은 landscape 로 바꾼 뒤, ( 그 반대도 버그가 발생한다. )

modalPresentStyle 을 overFullScreen 으로 present 하는 gif 이다.

앱의 orientation 를 무시하고 디바이스의 orientation 에 맞게 present 되어버린다.

  1. home Indicator 와 status bar 의 orientation 이 이상하다. ( landscape 인 채로 남아있다. )
  2. UX 가 이상하다. ( 앱의 방향이 landscape 에서, portraits 로 순식간에 바뀐다. )
  3. 뒤에있던 VC의 UI 가 깨진다. ( 재현용 앱은 간단해서 멀쩡해 보이지만, 사내 앱에서 처참하게 깨졌다.. )

 

( * landscapeButton 을 눌러서, 앱의 방향을 바꾼 코드는 아래와 같다. )

@objc private func landscapeButtonDidTab() {
    let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
    windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: .landscapeRight))
}

 

 

present 버그가 발생한 상태의 특징


  1. UIDevice 는 portrait 로 나온다. ( UIDevice.current.orientation )
  2. statusBar 는 landscape 로 나온다. ( UIApplication.shared.statusBarOrientation )
  3. 앱은 landscape 로 인식한다. ( 코드로 landscape 로 돌릴 때 무반응, portrait 로 돌리면 반응한다. )

 

 

 

임시방편 해결법


  • 특이하게도, 전체를 덮지 않고 부모 뷰를 뒤로 밀어내는(?) 방식의 modalPresatationStyle 은 잘 작동한다.
    - 잘 작동 하는 style : pageSheet, formSheet
    - 버그가 발생하는 style : fullScreen, overFullScreen, currentContext, overCurrentContext, popover, none, automatic

 

  • UIDevice.current.orientation 와, UIApplication.shared.statusBarOrientation 가 다를 때는,
    pageSheet, formSheet 를 사용하도록 하여 일단 해결하였다.

 

  • 해당 버그를 해결법은 고사하고, 발견한 reference 조차 없다.
    앱의 방향을 디바이스와 다르게 강제적으로 회전하고, 심지어 present 까지하는 앱이 잘 없기 때문이다. ( 발견 조건 까다로움 )

    ex ) 디바이스가 portrait 인 상태에서, 영상을 전체화면으로 보여주기 위해 강제로 landscape 로 바꾸고, 거기서 다른 영상이나 영상의 정보를 보여주기 위해 다른 vc를 present 하는 경우에 발생한다..

 

  • 근본적인 Solution 을 알게되면 내용을 추가한다.
Comments