앱을 개발하다 보면 뷰가 계속 쌓여서 신경쓰일 때가 있다.
이럴 때, root view를 변경하고 나머지 뷰를 없애고 싶어진다.
Root View 변경하기
extension UIWindow {
func replaceRootViewController(_ replacementController: UIViewController, animated: Bool, completion: (() -> Void)?) {
let snapshotImageView = UIImageView(image: self.snapshot())
self.addSubview(snapshotImageView)
let dismissCompletion = { () -> Void in // dismiss all modal view controllers
self.rootViewController = replacementController
self.bringSubviewToFront(snapshotImageView)
if animated {
UIView.animate(withDuration: 0.4, animations: { () -> Void in
snapshotImageView.alpha = 0
}, completion: { (success) -> Void in
snapshotImageView.removeFromSuperview()
completion?()
})
} else {
snapshotImageView.removeFromSuperview()
completion?()
}
}
if self.rootViewController!.presentedViewController != nil {
self.rootViewController!.dismiss(animated: true, completion: dismissCompletion)
} else {
dismissCompletion()
}
}
func snapshot() -> UIImage {
UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.main.scale)
drawHierarchy(in: bounds, afterScreenUpdates: true)
guard let result = UIGraphicsGetImageFromCurrentImageContext() else { return UIImage.init() }
UIGraphicsEndImageContext()
return result
}
}
위의 코드는 뷰를 dismiss할 때 dismiss 되기 전 뷰들이 잠깐씩 보였다가 dismiss되는 문제를 해결하기 위한 코드이다.
사용법
if let viewController = self.storyboard?.instantiateViewController(identifier: "test1") as? TestViewController {
keyWindow?.replaceRootViewController(viewController, animated: true, completion: nil)
}
여기서, keyWindow 변수가 무슨 변수인지 궁금한 사람은.. 이전 포스팅을 참고해 주길 바란다.
https://cording-cossk3.tistory.com/147
320x100
'프로그래밍 > iOS-Swift' 카테고리의 다른 글
[SWIFT] Web Socket (Stomp) (0) | 2021.07.09 |
---|---|
[SWIFT] iphone 슬립 모드(화면 자동 잠금) 방지 (0) | 2021.07.07 |
[SWIFT] 최상위 뷰 구하기 (0) | 2021.07.06 |
[SWIFT] URL to UIImage (0) | 2021.07.06 |
[SWIFT] IBDesignable 에러 대응 방법 (0) | 2021.04.09 |
댓글