적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Project/ToyProject_Couple App

[Swift iOS] modal presentation style 모달로 화면 띄우기

hongssup_ 2021. 3. 11. 16:28
반응형

1. 모달로 뷰컨트롤러 띄우는 법

2. 모달 스타일 설정

3. 모달 크기 변경 

 

뷰컨트롤러로 화면을 이동하는 방법은 여러가지가 있겠지만 

가장 많이 쓰이는 방법으로 크게 두가지를 꼽을 수 있다. 

네비게이션 컨트롤러로 옆으로 넘겨주는 방법과

let vc = NavViewController()

self.navigationController?.pushViewController(vc, animated: true)

모달로 화면을 아래에서 위로 띄우는 방법. 

let vc = ModalViewController()

vc.modalPresentationStyle = .automatic

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

 

여기서 modalPresentationStyle 은 기본으로 .automatic으로 설정이 되어 있어 따로 선언을 해줄 필요는 없다.

상황에 따라 자동으로 모달 스타일을 지정해주는데 대부분의 경우 .pagesheet 스타일로 띄워지는 듯 하다.

하지만 fullscreen으로 모달을 띄우고 싶다면 스타일을 .fullscreen 혹은 .overCurrentContext 로 변경해주면 된다. 

 

모달 크기를 조절하고 싶었는데, 방법을 찾다가 이것저것 해도 안돼서 그냥 

기본 뷰를 투명으로 만들고 원하는 크기의 UIView() 를 따로 만들어서 모달처럼 보이게 했다. 

그런데 모달 스타일을 기본으로 두면 뒤에 깔리는 화면이 뒤로 밀리면서 크기가 작아져서? 맘에 안들었는데

.fullscreen 이나 .overCurrentContext 로 스타일을 설정할 경우, 기본 모달의 자동 swipe down to dismiss 기능이 사라지더라. 

.fullscreen 으로 모달을 만들고 아래로 스와이프해서 창을 닫으려면 따로 제스처 기능을 추가해줘야 되는 것 같더라. 

extension weatherViewController: UIAdaptivePresentationControllerDelegate {
    func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController) {
        self.dismiss(animated: true, completion: nil)
    }
}

이렇게 extension으로 스와이프 delegate를 추가해줘도 된다고 하는데 나는 안되더라. 왜인지 모르겠다.

 

원한다면 제스처는 추후 넣어주도록 하고,

우선은 적당한 크기의 모달 뷰를 .fullscreen으로 만들어 띄우고 닫기 버튼을 추가해 dismiss를 하는 것으로 타협. 

728x90
반응형