iOS 화면 전환 방식 : Presentation

안녕하세요!
오늘은 iOS에서 화면 전환을 구현하는 방식 중 Presentation 방식에 대해 알아보도록 하겠습니다😊

📑참고 글
[Apple Developer Document] present 메서드
[Apple Developer Document] dismiss 메서드

Presentation방식은 소스코드로 구현하는 방법인데요,
전환할 다음 화면의 뷰 컨트롤러 인스턴스를 present메서드로 호출해서 전환하고,
dismiss메서드로 자신의 뷰 컨트롤러를 걷어내는 방식입니다.


present(_:animated:completion:)

먼저 present 메서드에 대해 먼저 알아보도록 하겠습니다.

present(_:animated:completion:)

func present(_ viewControllerToPresent: UIViewController, 
    animated flag: Bool, 
  completion: (() -> Void)? = nil)

UIViewController 클래스에 정의되어 있는 인스턴스 메서드로,
매개변수로 전달 받은 ViewController를 modal하게 띄어줍니다. (디폴트 스타일은 UIModalTransitionStyle.coverVertical로, 화면이 아래에서 위로 올라오는 스타일입니다.)

현재 화면에서 present메서드를 호출하면, 파라미터로 받은 뷰 컨트롤러의 화면을 현재 화면 위에 띄웁니다. (메서드 말 그대로, view를 present합니다)


메서드의 파라미터는 3가지가 있습니다.

viewControllerToPresent: UIViewController
현재 뷰 컨트롤러 위에 뛰울 뷰 컨트롤러 입니다. 즉, 전환할 화면의 뷰컨트롤러가 되겠습니다!

flag: Bool
presentation에 애니메이션 효과를 주려면 true를, 아니면 false를 전달합니다.

completion: (() -> Void)? = nil
presentation(화면전환)이 끝나고 해야할 작업을 전달합니다. 없으면 nil을 쓰면 됩니다.


참조 관계

presentation방식에선 present하는 뷰 컨트롤러와 present되는 뷰 컨트롤러사이에 참조 관계가 형성됩니다.

presentation방식에서 화면을 전환하는 주체현재 뷰의 뷰 컨트롤러(VC1)입니다.

따라서 VC1의 presentedViewController 프로퍼티는 VC2를 참조하게 되고,
VC2의 presentingViewController 프로퍼티는 VC1을 참조합니다.


dismiss(animated:completion:)

present메서드로 전환한 화면에서 기존 화면으로 돌아가기 위해선 dismiss 메서드를 사용합니다.

dismiss(animated:completion:)

func dismiss(animated flag: Bool, 
  completion: (() -> Void)? = nil)

dismiss메서드에선 전환할 화면의 인스턴스를 전달 받지 않아도 됩니다.
이 메서드를 호출하면, 호출하는 뷰 컨트롤러의 화면이 걷혀지기 때문입니다.


나머지 메서드의 파라미터는 present메서드와 동일합니다.

flag: Bool
presentation에 애니메이션 효과를 주려면 true를, 아니면 false를 전달합니다.

completion: (() -> Void)? = nil
presentation(화면전환)이 끝나고 해야할 작업을 전달합니다. 없으면 nil을 쓰면 됩니다.


코드에서 사용 하기

그럼 이번엔 VC1 화면에서 -> VC2 화면으로 전환하는 과정을 코드로 살펴보겠습니다.

1. 새로운 화면(VC2)의 뷰 컨트롤러를 인스턴스화

 let vc2 = storyboard?.instantiateViewController(withIdentifier: "SecondVC") as! ViewController

기존 화면(VC1)의 뷰 컨트롤러에서 새로운 화면(VC2)의 뷰 컨트롤러의 인스턴스를 생성해줍니다.

withIdentifier 에는 VC2의 Storyboard ID를 넣어줍니다. Storyboard ID는 스토리보드 아이덴티티 인스펙터 탭에서 확인하면 됩니다!

instantiateViewController는 UIViewController타입의 인스턴스를 반환하기 때문에 VC2의 뷰 컨트롤러 클래스 타입으로 다운 캐스팅해줍니다.


2. 화면 전환 스타일 정의

vc2.modalTransitionStyle = UIModalTransitionStyle

vc2의 modalTransitionStyle 프로퍼티에 화면 전환 스타일을 정해줍니다.
UIModalTransitionStyle 열거형의 타입 중 선택하면 됩니다.

UIModalTransitionStyle

case coverVertical  //default
case flipHorizontal
case crossDissolve
case partialCurl

3. present 로 화면 전환

VC1에서 vc2present하면 VC1 화면이 VC2 화면으로 덮여지게 됩니다.

present(vc2, animated: true: completion: nil)

4. dismiss 로 화면 전환 되돌리기

VC2에서 VC1으로 돌아가려면, VC2에서 dismiss메서드를 호출하면 됩니다!

dismiss(animated: true: completion: nil)

이렇게 present와 dismiss로 화면을 전환하는 방식에 대해 공부해보았습니다.

질문이나 잘못된 내용에 대한 답변은 언제나 환영입니다! 🤓
(잘 보셨다면 좋아요 꾸욱~도 언제나 환영입니다😺)

좋은 웹페이지 즐겨찾기