Swift로 가로 대화 (AlertDialog)

17968 단어 AlertDialogSwiftSwift5

시작하기



iPhone 앱에서 기본 대화 상자 (AlertDialog)
가로로 운용할 수 없었기 때문에 자작했다.
좌표는 iPhone11Pro를 기반으로 하고, 화면 중심에 정사각형으로 표시되도록 하고 있다.

디폴트 Alert를 가로 방향으로 표시하는 방법은 일단은 발견되었지만,
버튼 선택해 사라지는 순간에 세로 표시가 되어 버리기 때문에 불채용으로 했다.
참고

화면 이미지





출처



Vc.swift

import UIKit

//変数
var msgDialog01: MessageDialog?

class ViewController: UIViewController{

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        //ダイアログ準備
        msgDialog01 = MessageDialog(self.view, true)
        msgDialog01?.prepare("よろしいですか?", execFunc)

        //実行
        msgDialog01?.show()

    }

    func execFunc(){
        print("execFunc.")
    }
}


//画面表示用ダイアログクラス
public class MessageDialog{

    //操作無効用の半透明フィルム
    private let vwFilm = UIView()

    //ダイアログ
    private let vwDialog = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 300, height: 300))

    //メッセージ
    private let lblMsg = UILabel.init(frame: CGRect.init(x: 20, y: 20, width: 260, height: 200))

    //キャンセルボタン
    private let btnCancel = UIView.init(frame: CGRect.init(x: 20, y: 230, width: 120, height: 50))
    private let lblCancel = UILabel.init(frame: CGRect.init(x: 0, y: 0, width: 120, height: 50))

    //OKボタン
    private let btnOk = UIView.init(frame: CGRect.init(x: 160, y: 230, width: 120, height: 50))
    private let lblOk = UILabel.init(frame: CGRect.init(x: 0, y: 0, width: 120, height: 50))


    //Ok押下時の実行関数
    public var okAct: (() -> Void)?


    init(_ mainView: UIView, _ isRotate: Bool){
        //半透明部分
        vwFilm.isHidden = true
        vwFilm.alpha = 0.5
        vwFilm.backgroundColor = .black

        //ダイアログ
        vwDialog.isHidden = true
        vwDialog.backgroundColor = .systemGray5
        vwDialog.alpha = 1

        //Msg
        vwDialog.addSubview(lblMsg)
        lblMsg.numberOfLines = 5
        lblMsg.textAlignment = .center

        //okボタン
        btnOk.addSubview(lblOk)
        vwDialog.addSubview(btnOk)

        lblOk.text = "OK"
        lblOk.textAlignment = .center
        lblOk.textColor = .white

        btnOk.backgroundColor = .systemBlue

        //Cancelボタン
        btnCancel.addSubview(lblCancel)
        vwDialog.addSubview(btnCancel)

        lblCancel.text = "Cancel"
        lblCancel.textColor = .white
        lblCancel.textAlignment = .center

        btnCancel.backgroundColor = .darkGray


        setTapOneEvent()

        mainView.addSubview(vwFilm)
        mainView.addSubview(vwDialog)

        vwDialog.center = mainView.center
        vwFilm.frame = mainView.frame

        if isRotate{
            vwDialog.transform = CGAffineTransform(rotationAngle: CGFloat( CGFloat.pi / 2 * 1))
        }
    }

    func prepare(_ msg: String, _ okAct: (() -> Void)?){
        self.lblMsg.text = msg
        self.okAct = okAct
    }


    func show(){
        vwFilm.isHidden = false
        vwDialog.isHidden = false
    }

    func hide(){
        vwFilm.isHidden = true
        vwDialog.isHidden = true
    }

    //タップイベントをセットする
    private func setTapOneEvent(){
        let tapOk = UITapGestureRecognizer(target: self, action: #selector(btnOk_Tap))
        tapOk.numberOfTouchesRequired = 1
        tapOk.numberOfTapsRequired = 1
        btnOk.addGestureRecognizer(tapOk)


        let tapCancel = UITapGestureRecognizer(target: self, action: #selector(btanCancel_Tap))
        tapCancel.numberOfTouchesRequired = 1
        tapCancel.numberOfTapsRequired = 1
        btnCancel.addGestureRecognizer(tapCancel)
    }

    @objc private func btnOk_Tap(){
        self.okAct?()
        hide()
    }

    @objc private func btanCancel_Tap(){
        hide()
    }
}

좋은 웹페이지 즐겨찾기