iOSでアラートの外側をタップしてUIAlertControllerを閉じる方法
はじめに
iOS開発を始めたばかりの方にとって、UIAlertControllerの理解と実装は少し難しく感じることがあります。この記事では、ユーザーがアラートボックスの外側をタップしたときにアラートを閉じる(dismissする)方法を解説します。
本記事のデモでは、UIAlertControllerクラスを使用します。これは、表示したいメッセージや選択可能なアクションを設定して、アラートやアクションシートを構成するためのクラスです。必要なアクションとスタイルを設定した後、present(_:animated:completion:)メソッドを使ってアラートを表示します。UIKitはアラートやアクションシートをアプリのコンテンツ上にモーダル形式で表示します。
より詳しい情報については、Apple公式ドキュメント(UIAlertController)をご参照ください。
それでは、実際の実装手順を見ていきましょう。
Step 1:プロジェクトの作成
Xcodeを開き、Single View Applicationを新規作成します。プロジェクト名は「UIAlertSample」とします。
Step 2:ボタンの配置とIBActionの作成
Main.storyboardにボタンを1つ追加し、@IBActionを作成します。名前は「showAlert」とします。
@IBAction func showAlert(_ sender: Any) { }基本的な動作としては、ボタンをタップするとアラートが表示され、アラートの外側をタップするとアラートが閉じるというものです。
Step 3:UIAlertオブジェクトの作成
ボタンのアクション「showAlert」内で、まず以下のようにUIAlertオブジェクトを作成します。
let uialert = UIAlertController(title: "WELCOME", message: "Welcome to my tutorials, tap outside to dismiss the alert", preferredStyle: .alert)
Step 4:アラートの表示とセレクタの追加
アラートを表示し、その表示完了時のcompletionブロック内で、以下のようにタップ検出用のセレクタを追加します。
self.present(uialert, animated: true, completion:{
uialert.view.superview?.isUserInteractionEnabled = true
uialert.view.superview?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dismissOnTapOutside)))
})Step 5:セレクタ関数の追加
セレクタとして呼び出される関数を追加します。この関数が呼ばれるとアラートが閉じられます。
@objc func dismissOnTapOutside(){
self.dismiss(animated: true, completion: nil)
}Step 6:アプリを実行して動作確認
以上で実装は完了です。アプリをビルドして実行し、ボタンをタップしてアラートを表示した後、アラートの外側をタップしてアラートが閉じることを確認しましょう。
完全なコード
参考までに、ViewControllerの完全なコードを示します。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func showAlert(_ sender: Any) {
let uialert = UIAlertController(title: "WELCOME", message: "Welcome to my tutorials, tap outside to dismiss the alert", preferredStyle: .alert)
self.present(uialert, animated: true, completion:{
uialert.view.superview?.isUserInteractionEnabled = true
uialert.view.superview?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dismissOnTapOutside)))
})
}
@objc func dismissOnTapOutside(){
self.dismiss(animated: true, completion: nil)
}
}
仕組みの解説
この実装のポイントは、アラート表示完了後のcompletionブロック内で、アラートビューのsuperview(スーパービュー)に対してisUserInteractionEnabledをtrueに設定し、UITapGestureRecognizerを追加している点です。デフォルトではアラートの背後にあるビューはユーザーの操作を受け付けないため、明示的にインタラクションを有効化する必要があります。こうすることで、アラートの外側(背景の暗転部分)のタップが検出され、dismissOnTapOutsideメソッドが呼び出されてアラートが閉じられる仕組みになっています。
-
iPhoneのホームボタン押下速度と触覚フィードバックの調整方法【iOS設定ガイド】
iOSデバイスでは、ホームボタンのクリック(押下)速度を簡単に調整することができます。通常、アプリの切り替えにはホームボタンのダブルクリック、アクセシビリティショートカットの呼び出しにはトリプルクリックが必要です。 これらの操作に必要な速度を遅くするのは、アクセシビリティ上の理由によるものです。たとえば、アプリスイッチャーを開くためにボタンを素早く2回押すことが難しいユーザーにとって、この設定は大きな助けになります。ただし意外なことに、速度を速くすることはできず、遅くすることしか対応していません。パワーユーザーにとっては残念な点ですが、現時点ではこの仕様となっています。 さらに、iPhone
-
NordVPNでNetflixを視聴する方法|海外リージョン制限を解除して楽しむ完全ガイド
好きでも嫌いでも、テレビやノートパソコンの画面に釘付けになってNetflixを観る時間は、私たちが必要としている(そして受けるに値する)最高のセラピーのようなものです。映画からTVドラマまで幅広いコンテンツをストリーミング配信するNetflixは、間違いなく最もエンターテインメント性の高いプラットフォームの一つです。ミレニアル世代が何よりもNetflixを選ぶ理由も、納得できますよね。 しかし正直なところ、他の国や地域のNetflixコンテンツにアクセスできたら、どれほど嬉しいでしょうか?想像するだけでワクワクしませんか?まだまだ観たい作品はたくさんあるのですから、選択肢は多いほうが断然楽し