버그 잡이

iPad SplitviewController에서 DetailView 로 collapse 하기 #UISplitViewControllerDelegate 본문

IOS

iPad SplitviewController에서 DetailView 로 collapse 하기 #UISplitViewControllerDelegate

버그잡이 2022. 6. 23. 20:22

 

SplitViewcontroller 구조의 아이패드 앱은 멀티태스크 동작으로 화면 사이즈가 줄어들면 기존에 나눠졌던 화면 중 하나가 사라지게 됩니다.

 

두 개로 나뉘어진 구조를 기준으로

* 왼쪽: Master

* 오른쪽: Detail

이라고 칭하는데, 보통 Master가 남고 Detail이 사라집니다.

 

그런데 갑자기 이런 요구사항이 들어옵니다.

"SplitViewController가 collap 될때 detail 화면이 남고 master 화면이 사라지게 해주세요."

 

 

위 그림처럼 되는 구조인데 어디 한번 방법을 찾아봅시다.

 

 

1. UISplitViewControllerDelegate 함수 찾아보기

 

UISplitViewControllerDelegate에서 관련된 기능을 제공하는 함수가 없는지 찾아봤습니다.

그 결과 아래 두 개의 함수를 발견했습니다.

primaryViewController(forCollapsing:)

primaryViewController(forExpanding:)

 

함수명 그대로 SplitViewController가 Collapsing(확장), Expanding(축소) 할때 어떤 VC를 PrimaryViewController로 가져갈 것인지 정할 수 있는 함수입니다.

일반적으로는 둘 다 primaryViewController가 Master에 해당하는 VC 이지만

위에서 말한 요구사항을 충족하기 위해서는 forCollapsing 일때 detailVC를 primaryViewController가 되도록 정해줍니다.

 func primaryViewController(forCollapsing splitViewController: UISplitViewController) -> UIViewController? {
     return detailVC
 }

 func primaryViewController(forExpanding splitViewController: UISplitViewController) -> UIViewController? {
     return masterVC
 }

 

위와 같이 정해주니 SplitViewController가 collap 될때 detail 화면이 남고 master 화면이 사라지게 됩니다.

 

 

 

 

2. iOS12 이슈

 

iOS13 이상에서는 위의 delegate 함수가 정상 동작했습니다.

그런데 iOS12 에서는 위의 delegate 함수를 호출하니 crash가 나는 문제가 있었습니다.

 

원인을 찾아보려고 백방노력했지만 원인을 찾을 수는 없었습니다.

(만약 원인을 아시는 분이 있으시면 댓글 남겨주세요..!)

 

그래도 운이 좋게 해결 방법을 찾았는데요.

UISplitViewController에 있는 아래 delegate 함수를 활용하는 것입니다.

splitViewController(_:collapseSecondary:onto:)

위 함수를 추가로 채택하고 return true로 하면 더 이상 crash가 나지 않고 정상 동작합니다.

 func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
       return true
 }
 
  func primaryViewController(forCollapsing splitViewController: UISplitViewController) -> UIViewController? {
     return detailVC
 }

 func primaryViewController(forExpanding splitViewController: UISplitViewController) -> UIViewController? {
     return masterVC
 }

 

관련해서 뇌피셜이지만 
iOS 13부터 "splitViewController(_:collapseSecondary:onto:)" 없이도 UISplitviewController가 잘 동작하게 된 것 같습니다.
iOS 12 이전에는 위 함수가 필수로 채택 되어야 하는 함수가 아닐까 싶습니다
(관련해서 정확한 사실을 알고 계신분은 댓글 부탁드립니다!!)




참고

https://www.wake-up-neo.com/ko/ios/ipad-ios-13%EC%97%90%EC%84%9C-uisplitviewcontroller%EA%B0%80-%EC%8B%9C%EC%9E%91%EB%90%A0-%EB%95%8C-%EC%98%AC%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%B6%95%EC%86%8C%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4/812457467/

 

 

 

 

 

반응형
Comments