본문 바로가기
프로그래밍/iOS-Swift

[SWIFT] Root View 변경하기

by 채연2 2021. 7. 6.

앱을 개발하다 보면 뷰가 계속 쌓여서 신경쓰일 때가 있다.

이럴 때, 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

 

[SWIFT] 최상위 뷰 구하기

우선, 최상위 뷰를 구하기 전에 필요한 코드가 있다. UIApplication.shared.keyWindow? ~~ 하지만 위의 코드를 사용해도 빌드에는 문제가 없지만, iOS 13부터는 deprecated 되었다고 경고문이 뜬다. 그래서 대체

cording-cossk3.tistory.com

 

320x100

댓글