나의 플랫폼/iOS

[iOS] Custom Alert

GsBOB 2017. 9. 6. 11:24

UIAlertController로 바뀐 후, 알림창을 어떻게 바꿀 수 있을까 해서 테스트를 해보았습니다.



import UIKit


class CustomAlertViewController: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()

        let alertBtn = UIButton(type: .system)

        alertBtn.frame = CGRect(x: 0, y: 100, width: 150, height: 30)

        alertBtn.setTitle("show alert", for: .normal)

        alertBtn.addTarget(self, action: #selector(shwoAlert(_:)), for: .touchUpInside)

        alertBtn.center.x = self.view.frame.width / 2

        

        self.view.addSubview(alertBtn)

    }

    

    @objc func shwoAlert(_ sender: Any) {

        let alert = UIAlertController(title: nil, message: nil, preferredStyle: .alert)

        

        alert.setValue(creatCustomVC(), forKey: "contentViewController")

        

        self.present(alert, animated: false)

    }

    

    func creatCustomVC() -> UIViewController {

        let customVC = UIViewController()

        

        let containerView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0))

        customVC.view = containerView

        customVC.preferredContentSize.width = self.view.frame.width

        customVC.preferredContentSize.height = self.view.frame.height

        

        containerView.backgroundColor = UIColor.red

        

        return customVC

    }

}


위 소스를 보시면


버튼을 추가 해서 버튼을 누르면 알림창이 뜨도록 만들었습니다.


커스텀 하게 만들기 위해 가장 중요한 부분이 


alert.setValue(creatCustomVC(), forKey: "contentViewController")


이 부분 입니다.


Custom한 UIViewController를 넣을 수 있으니깐요.


결과 화면이 아래와 같습니다,.



라운딩된 코너는 수정이 힘들어 보입니다.

애플에서도 이 부분에 대해서는 커스텀하게 하지 말라는 문구도 있었구요.

https://stackoverflow.com/a/32320905


그래도 어느 정도 커스텀하게 표현을 할 수 있을 것 같네요.

참고하세요~