Swift/이슈 대응

[Swift] Swift UIAlertController를 외부 클릭으로 닫기

언클린 2020. 5. 22. 10:49
728x90

이번 글에서는 다이어로그 표시 부분 외를 클릭할 시 dismiss 되는 기능을 한 번 알아보겠습니다.

이 기능은 기본적으로 UIAlertController에서 제공하고 있는 기능이 아니기 때문에 UITapGestureRecognizer 를 사용하여 구현해 보겠습니다.


1. 프로젝트 생성 & 디자인

뭐 솔직히 이번 기능에는 디자인이라고 할 건 없습니다. 그냥 간단하게 버튼 하나만 구현하여 보겠습니다.

2. 코드

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
    }
    
    @IBAction func didTappedButton(_ sender: UIButton) {
        let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
        let action = UIAlertAction(title: "OK", style: .default, handler: nil)
        alert.addAction(action)
        
        self.present(alert, animated: true) {
        // completion에 제스처를 생성하여 줍니다.
            let tap = UITapGestureRecognizer(target: self, action: #selector(self.didTappedOutside(_:)))
            alert.view.superview?.isUserInteractionEnabled = true
            alert.view.superview?.addGestureRecognizer(tap)
        }
    }
    
    @objc
    private func didTappedOutside(_ sender: UITapGestureRecognizer) {
        self.dismiss(animated: true, completion: nil)
    }
}

3. 마무리

이 기능은 많이 쓰일 것 같진 않지만 예를 들어 액션이 없는 다이어로그나 뭐 간단한 안내 다이어로그에 대해서는 사용해볼 수도 있다고 생각합니다. 이번 글에서도 많은 도움이 되었으면 좋겠습니다.

궁금하신 사항이나 지적은 댓글에 부탁드립니다.

감사합니다.


환경 

Xcode 11.3.1

Swift 5

 

 

 

 

728x90