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