EEYatHo 앱 깎는 이야기

Swift ) 스플릿 뷰 감지 viewWillTransition - EEYatHo iOS 본문

iOS, Swift

Swift ) 스플릿 뷰 감지 viewWillTransition - EEYatHo iOS

EEYatHo 2021. 9. 20. 20:45
반응형

iPad 멀티태스킹 지원 작업을 하다가,

당연하게도(?) Spilt View 에서 레이아웃이 깨지게 되었다.

 

Split View 변화를 감지하는 delegate가 당연히 있을 줄 알았는데,

 

엥 없네.. 완전 의외..


0. 스플릿 뷰 변화 감지하기

 

그냥 view의 frame 변화를 감지하는 UIViewController의 콜백으로 처리해야했다.

 

해당 콜백은 아래와 같다.

size는 변화 후 frame의 size이고,

 

애플문서 보니까 coordinator은 변화에대한 정보와,

애니메이션 커스텀이 가능하다고 한다. 와아~,,

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
	// code
}

 


1. Did ( viewDidTransition ) 

 

그런데

will만 사용하기엔 부족한 부분이 발견되어서, ( 탭바의 layer를 수정하는 작업 등 )

did를 찾아보았지만,

지원해주는게 없네..

 

아래처럼 써주면 will, did 동시에 사용할 수 있다.

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    // will code
    coordinator.animate(alongsideTransition: nil) { _ in
        // did code
    }
}

 


2. orientation 까지

 

기존엔 노티로 ( UIDevice.orientationDidChangeNotification )

Orientation 변화 감지용 싱글톤을 사용중이었는데, 

viewWillTransition이 orientation도 같이 잡아준다.

 

기존에 쓰던거 갈아 엎어 버리고,

아래처럼 만들어서 깔끔해졌다.

 

viewWillTransition 굳

import UIKit
import RxSwift

extension HomeViewController {
    /*
     Split View 변화 감지. Orientation 변화까지 감지됨.
     */
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        FrameChangeManager.willChangePS.onNext(size)
        coordinator.animate(alongsideTransition: nil) { _ in
            FrameChangeManager.didChangePS.onNext(size)
        }
    }
    
}

class FrameChangeManager {
    // frame 변화 후의 size만 알면 대응 가능할 경우 이 친구로,
    static let willChangePS = PublishSubject<CGSize>()
    // frame 변화 후 Layout까지 끝나야 하는 경우 (layer추가 등) 이 친구로 작업.
    static let didChangePS = PublishSubject<CGSize>()
}
Comments