はじめに
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()
    }
}