본문 바로가기

IOS Swift

Swift) UIModalPresentationStyle 종류들

UIViewController 화면 이동 중에 UIModalPresentationStyle를 정할 수 있는데 여기서 굉장히 다양한 타입들이 존재합니다

 

이 종류들이 무엇을 뜻하는지 하나씩 일일이 테스트를,,,,해보겠습니다,,,

 

 

enum ModalPresentStyle: Int, CaseIterable {
    case automatic = 0
    case none
    case fullScreen
    case pageSheet
    case currentContext
    case overCurrentContext
    case popover
    case formSheet
    case overFullScreen
}

extension ModalPresentStyle {
    var style: UIModalPresentationStyle {
        switch self {
        case .automatic:
            return .automatic
        case .none:
            return .none
        case .fullScreen:
            return .fullScreen
        case .pageSheet:
            return .pageSheet
        case .currentContext:
            return .currentContext
        case .overCurrentContext:
            return .overCurrentContext
        case .popover:
            return .popover
        case .formSheet:
            return .formSheet
        case .overFullScreen:
            return . overFullScreen
        }
    }
    
    var title: String {
        return String(describing: self)
    }
}

enum을 만들어서 타입들을 다 선언합니다

 

class ViewController: UIViewController {
    var stackView = UIStackView()
    let modelPresentStyle = ModalPresentStyle.allCases

    override func viewDidLoad() {
        super.viewDidLoad()
        layout()
    }
    
    @objc func modalButtonTapped(_ sender: UIButton) {
        let vc = SecondViewController()
        vc.modalPresentationStyle = modelPresentStyle[sender.tag].style
        present(vc, animated: true)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("\(#function)")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("\(#function)")
    }
    
    func layout() {
        view.addSubview(stackView)
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10).isActive = true
        stackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 100).isActive = true
        stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10).isActive = true
        stackView.spacing = 10
        stackView.axis = .vertical
        stackView.alignment = .fill
        stackView.distribution = .fill
        
        modelPresentStyle.forEach {
            let button = UIButton(type: .system)
            button.setTitle($0.title, for: .normal)
            button.setTitleColor(.black, for: .normal)
            button.tag = $0.rawValue
            stackView.addArrangedSubview(button)
            button.frame.size = CGSize(width: 150, height: 50)
            button.addTarget(self, action: #selector(modalButtonTapped), for: .touchUpInside)
        }
    }
}

enum CaseIterable, StackView를 이용해 일일이 만들지 않고 타입별로 만들어서 넣어주면 코드가 엄청 줄어든답니다 ><

 

tag와 rawValue를 이용해서 구별하여 modalPresentationStyle를 구별하여 맵핑합니다

 

실행하면 이렇게 뙇 편하게 만들어집니다

 

 

모든 버튼은 이 화면을 출력하게 되어있습니다 대충 만들어서 가운데 dismiss기능만 하는 버튼을 넣었습니다

 

automatic은 ViewController의 viewWillDisAppear가 x, dismiss에도 viewWillAppear 호출 x

none은 런타임 에러를 발생

fullScreen은 ViewController의 viewWIllDisAppear를 발생 dismiss시 ViewController의viewWillAppear가 호출 o

pageSheet은 automatic과 동일

currentContext은 fullScreen과 동일

overCurrentContext은 보이는 모습은 currentContext과 동일하지만 automatic처럼 생명주기 함수가 호출되지 않습니다

popover은 automatic과 동일

formSheet은 automatic과 동일

overFullScreen은  fullScreen 보이는 모습은 똑같지만 automatic처럼 생명주기 함수가 호출되지 않습니다

 

문서를 읽어보면 각 타입마다 설명이 있기 때문에 세부적으론 더 다르지만 여기서 가장 두드러진 특징은

over가 붙으면 생명주기 함수가 호출되지 않습니다 

이 뜻은 호출 Controller의 계층이 소멸되지 않는다는 뜻이라고 할 수 있겠네요

 

이 글을 쓴 이유는 저번 면접에서 over가 붙으면 어떤 뜻이냐라는 질문에 대답을 못했기 때문에(...한심) 적게 되었습니다

반성 -> 공부 -> 안까먹게 글쓰기를 위해 포스팅을 합니다

틀린 내용이 있으면 지적부탁드리겠습니다 (_ _)

 

 

 

 

 

'IOS Swift' 카테고리의 다른 글

iOS) 중요한 값 Info.plist에 저장하여 사용하기  (1) 2023.03.07
Swift) Subscript  (0) 2023.02.21
Swift) Dictionary Default Value  (0) 2023.02.02
iOS Swift <-> Unity Plugin (2)  (0) 2022.07.20
iOS Swift <-> Unity Plugin (1)  (0) 2022.07.19