【XCode】UIAlertController内にUIActivityIndicatorViewをいれてダイアログ表示したい

前回のダークモード対応から結構時間が経ちました
新規にアプリ開発がなくネタがないもので

さて、今回はプロジェクトヘルプにてSwiftで実装することとなりました
Objective-Cを主軸としている側としてはどうもなれないですが
時代の流れです

今更ですが
アラート表示の中にインジケータを表示し、
処理中はモーダル表示してユーザーに操作させないUIを作りたいと思います

たたみます


StoryboardやXIBにてレイアウトを作って
カスタムなViewControllerを用意してpresentするっということも考えたのですが
どうせなら拡張して実装してみようと調べました

■UIAlertControllerExtention.swift

import UIKit


extensionUIAlertController {

    ///Indicator付きAlertViewControllerの作成

    ///

    ///- Parameters:

    ///  - message: アニメーション有無

    ///  - indicatorStyle: インジケータ種別

    ///- Returns: なし

    convenience init(message: String?, indicatorStyle: UIActivityIndicatorView.Style) {

        self.init(title: nil, message: message, preferredStyle: .alert)

        let indicator = UIActivityIndicatorView(style: indicatorStyle)

        indicator.autoresizingMask = [.flexibleHeight]

        indicator.frame = CGRect(x: 20, y: indicator.frame.origin.y, width: indicator.frame.width, height: self.view.bounds.height)

        indicator.isUserInteractionEnabled = false

        indicator.startAnimating()

        self.view.addSubview(indicator)

    }

}


■表示する箇所にて

let progressAlert = UIAlertController(message: "読込中", indicatorStyle: .medium)

とするだけ

UIAlertControllerに追加したUIActivityIndicatorViewに対し制約をつけて表示位置を決めるべきだったのですが
思うような表示サイズになってくれなかったのでチカラワザです

UIActivityIndicatorViewのインスタンス作成時に
くるくるまわっているイメージのViewのWidthとHeightは固定値が、表示位置はViewの中央に設定されているので
UIActivityIndicatorView自体の大きさは基本はそのままで
高さだけUIAlertControllerに準ずるようにする

そしてautoresizingMaskにて高さは自動調整するように設定

UIAlertControllerの左側から数Pixelずらす形でX座標を指定することで
UIAlertControllerのレイアウトの縦の中央に表示されるようになりました

表示するタイトルやメッセージは標準のものを使用しているので
複数行になればレイアウトも追従して表示可能です



この記事へのコメント