前回のダークモード対応から結構時間が経ちました
新規にアプリ開発がなくネタがないもので
さて、今回はプロジェクトヘルプにて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のレイアウトの縦の中央に表示されるようになりました
表示するタイトルやメッセージは標準のものを使用しているので
複数行になればレイアウトも追従して表示可能です
この記事へのコメント