UIAlertControllerは拡張高い
2021/01/12
UIAlertControllerはサブクラス化が禁止されていますが、内部では色々な事ができるように作られています。setValueを使うと上部にViewControllerを追加できるので画像を表示できるようにカスタマイズしてみました。取りあえずiOS10と11で動きます。
- 画像表示
- ダイナミックフォント対応
- チェックマーク表示
- 項目が多い時のスクロール対応
- アラビア語でも大丈夫かも
使ってみる
カスタムしたCustomAlertControllerに上部に表示させるVCを追加します。
アクションシート
iPadでのポップオーバー表示もできます。
@IBAction func actionSheetButtonTouched(_ sender: UIBarButtonItem) {
let alert = CustomAlertController(title: "Very cute", message: "Animal, Pet, Cat", preferredStyle: .actionSheet)
let storyboard = UIStoryboard(name: String(describing: CustomAlertSubtitleViewController.self), bundle: nil)
let vc = storyboard.instantiateInitialViewController() as! CustomAlertSubtitleViewController
vc.image = UIImage(named: "Cat")
vc.text = alert.title
vc.detailText = alert.message
alert.contentViewController = vc
alert.checkedIndex = 1
alert.popoverPresentationController?.barButtonItem = sender
alert.addAction(UIAlertAction(title: "SNS", style: .default) { (action: UIAlertAction) in
})
alert.addAction(UIAlertAction(title: "Mail", style: .default) { (action: UIAlertAction) in
})
alert.addAction(UIAlertAction(title: "Download", style: .default) { (action: UIAlertAction) in
})
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel) { (action: UIAlertAction) in
})
present(alert, animated: true, completion: nil)
}
アラート
テキストフィールドを複数追加しても崩れません。
@IBAction func alertButtonTouched(_ sender: UIBarButtonItem) {
let alert = CustomAlertController(title: "Very cute", message: "Animal, Pet, Cat", preferredStyle: .alert)
let storyboard = UIStoryboard(name: String(describing: CustomAlertSubtitleViewController.self), bundle: nil)
let vc = storyboard.instantiateInitialViewController() as! CustomAlertSubtitleViewController
vc.image = UIImage(named: "Cat")
vc.text = alert.title
vc.detailText = alert.message
alert.contentViewController = vc
alert.checkedIndex = 1
alert.addTextField() { (text: UITextField) in
}
alert.addAction(UIAlertAction(title: "SNS", style: .default) { (action: UIAlertAction) in
})
alert.addAction(UIAlertAction(title: "Mail", style: .default) { (action: UIAlertAction) in
})
alert.addAction(UIAlertAction(title: "Download", style: .default) { (action: UIAlertAction) in
})
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel) { (action: UIAlertAction) in
})
present(alert, animated: true, completion: nil)
}