動作 - iOSで長いタスクを実行するときに「オーバーレイ」をロードする



ios 常駐 アプリ (6)

@sonrobbyの回答を更新し、背景ビューとサイズ変更マスクを介した方向処理を追加しました...これは単純なものに使用できます

public class LoadingOverlay{

    var overlayView = UIView()
    var activityIndicator = UIActivityIndicatorView()
    var bgView = UIView()

    class var shared: LoadingOverlay {
        struct Static {
            static let instance: LoadingOverlay = LoadingOverlay()
        }
        return Static.instance
    }

    public func showOverlay(view: UIView) {

        bgView.frame = view.frame
        bgView.backgroundColor = UIColor.gray
        bgView.addSubview(overlayView)
        bgView.autoresizingMask = [.flexibleLeftMargin,.flexibleTopMargin,.flexibleRightMargin,.flexibleBottomMargin,.flexibleHeight, .flexibleWidth]
        overlayView.frame = CGRect(x: 0, y: 0, width: 80, height: 80)
        overlayView.center = view.center
        overlayView.autoresizingMask = [.flexibleLeftMargin,.flexibleTopMargin,.flexibleRightMargin,.flexibleBottomMargin]
        overlayView.backgroundColor = UIColor.black
        overlayView.clipsToBounds = true
        overlayView.layer.cornerRadius = 10

        activityIndicator.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
        activityIndicator.activityIndicatorViewStyle = .whiteLarge
        activityIndicator.center = CGPoint(x: overlayView.bounds.width / 2, y: overlayView.bounds.height / 2)

        overlayView.addSubview(activityIndicator)
        view.addSubview(bgView)
        self.activityIndicator.startAnimating()

    }

    public func hideOverlayView() {
        activityIndicator.stopAnimating()
        bgView.removeFromSuperview()
    }
}

キーウィンドウに追加すると、ナビゲーションバーやタブバーにも移動できます...このようなもの

LoadingOverlay.shared.showOverlay(view: UIApplication.shared.keyWindow!)

https://src-bin.com

長いタスクを実行するときにSwift IOSアプリケーションでオーバーレイをロードする例は何ですか。 リモートサーバーからデータをロードする例。 私はグーグルで答えを見つけませんでした。

更新しました:

@Sebastian Dresslerに感謝します。これは簡単な方法です。 コードを更新し、クールに実行しました

public class LoadingOverlay{

var overlayView = UIView()
var activityIndicator = UIActivityIndicatorView()

class var shared: LoadingOverlay {
    struct Static {
        static let instance: LoadingOverlay = LoadingOverlay()
    }
    return Static.instance
}

    public func showOverlay(view: UIView) {

        overlayView.frame = CGRectMake(0, 0, 80, 80)
        overlayView.center = view.center
        overlayView.backgroundColor = UIColor(hex: 0x444444, alpha: 0.7)
        overlayView.clipsToBounds = true
        overlayView.layer.cornerRadius = 10

        activityIndicator.frame = CGRectMake(0, 0, 40, 40)
        activityIndicator.activityIndicatorViewStyle = .WhiteLarge
        activityIndicator.center = CGPointMake(overlayView.bounds.width / 2, overlayView.bounds.height / 2)

        overlayView.addSubview(activityIndicator)
        view.addSubview(overlayView)

        activityIndicator.startAnimating()
    }

    public func hideOverlayView() {
        activityIndicator.stopAnimating()
        overlayView.removeFromSuperview()
    }
}

使用してみましょう:

LoadingOverlay.shared.showOverlay(self.view)
//To to long tasks
LoadingOverlay.shared.hideOverlayView()

Answer #1

ATKitを使用します。

参照: https://aurvan.github.io/atkit-ios-release/index.html : https://aurvan.github.io/atkit-ios-release/index.html

ATProgressOverlayクラス https://aurvan.github.io/atkit-ios-release/helpbook/Classes/ATProgressOverlay.html

コード:

import ATKit

ATProgressOverlay.sharedInstance.show() // Does not show network activity indicator on status bar.

ATProgressOverlay.sharedInstance.show(isNetworkActivity: true) // Shows network activity indicator on status bar.

スクリーンショット:


Answer #2

上記の回答は読み込みビューを追加しますが、画面上のクリックイベントをブロックせず、画面の残りの部分のオーバーレイも提供しません。 次のようにして達成できます。

let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .Alert)

alert.view.tintColor = UIColor.blackColor()
let loadingIndicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(10, 5, 50, 50)) as UIActivityIndicatorView
loadingIndicator.hidesWhenStopped = true
loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
loadingIndicator.startAnimating();

alert.view.addSubview(loadingIndicator)
presentViewController(alert, animated: true, completion: nil)

Swift 3.0

let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .alert)

let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
loadingIndicator.hidesWhenStopped = true
loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
loadingIndicator.startAnimating();

alert.view.addSubview(loadingIndicator)
present(alert, animated: true, completion: nil)

Swift 4.0以降

let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .alert)

let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
loadingIndicator.hidesWhenStopped = true
loadingIndicator.style = UIActivityIndicatorView.Style.gray
loadingIndicator.startAnimating();

alert.view.addSubview(loadingIndicator)
present(alert, animated: true, completion: nil)

次のように非表示にできます。

dismiss(animated: false, completion: nil)

次のように表示されます。


Answer #3

与えられた答えに追加するために、時々コードを実行しようとすると問題が発生する場合があります。 個人的に、showOverlayが適切に呼び出されない場合がありました(シーンにセグメンテーションを試みてから、viewDidLoad中にこの関数をすぐに呼び出すため)。

私のような問題に遭遇した場合、コードの修正とアプローチの変更が推奨されます。

FIX:次のように、dispatch_async呼び出しのクロージャーとして両方のコードブロックを配置します。

dispatch_async(dispatch_get_main_queue(),
 { //code });

アプローチ:コードを呼び出すとき は、メインキュー に対して dispatch_after呼び出しを 実行して、 呼び出しを 数ミリ秒遅らせます。

推論? viewDidLoadの実行中にUIに多くのことを行うように単に要求しているだけです。

ソリューションのこの付録が役立ったら、うれしいです。

-ジョエル・ロング

PSソリューションはXCode v6.3.2で機能しました


Answer #4

私のような遅い人のために、@ Sonrobbyコードにいくつかの変更を加えました。 私が理解しているように、@ Sonrobbyはすべての showOverlay 呼び出しでアクティビティをオーバーレイに showOverlay ます。 また、一部の構成はinit関数に渡すことができ、 showOverlay メソッドの配置のみを showOverlay ます。

私のアプリはほとんど白なので、オーバーレイの背景も黒に変更します。

コードは次のとおりです。

public class LoadingOverlay{

    var overlayView : UIView!
    var activityIndicator : UIActivityIndicatorView!

    class var shared: LoadingOverlay {
        struct Static {
            static let instance: LoadingOverlay = LoadingOverlay()
        }
        return Static.instance
    }

    init(){
        self.overlayView = UIView()
        self.activityIndicator = UIActivityIndicatorView()

        overlayView.frame = CGRectMake(0, 0, 80, 80)
        overlayView.backgroundColor = UIColor(white: 0, alpha: 0.7)
        overlayView.clipsToBounds = true
        overlayView.layer.cornerRadius = 10
        overlayView.layer.zPosition = 1

        activityIndicator.frame = CGRectMake(0, 0, 40, 40)
        activityIndicator.center = CGPointMake(overlayView.bounds.width / 2, overlayView.bounds.height / 2)
        activityIndicator.activityIndicatorViewStyle = .WhiteLarge
        overlayView.addSubview(activityIndicator)
    }

    public func showOverlay(view: UIView) {
        overlayView.center = view.center
        view.addSubview(overlayView)
        activityIndicator.startAnimating()
    }

    public func hideOverlayView() {
        activityIndicator.stopAnimating()
        overlayView.removeFromSuperview()
    }
}

Answer #5

自分でオーバーレイビューを作成します。これを親ビューに追加し、タスクが完了したら削除します(追加する場合など)。

var overlay : UIView? // This should be a class variable

[ ... ]

overlay = UIView(frame: view.frame)
overlay!.backgroundColor = UIColor.blackColor()
overlay!.alpha = 0.8

view.addSubview(overlay!)

削除の場合:

overlay?.removeFromSuperview()




overlay