在iOS中运行长时间任务时加载“覆盖”

什么是在做长时间任务时,在Swift IOS应用程序中加载重叠的例子。 从远程服务器加载数据的示例 我GOOGLE了,但没有find任何答案。

更新:

感谢@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() 

只需创build一个叠加视图,将其添加到父视图中,并在完成任务后将其删除,例如添加它:

 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() 

上面的回答添加了一个加载视图,但是它不会阻止屏幕上的点击事件,也不会为屏幕的其余部分提供覆盖。您可以通过以下方式来实现:

 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) 

你可以隐藏它,如下所示:

 dismissViewControllerAnimated(false, completion: nil) 

它将显示如下: 在这里输入图像说明

对于像我这样迟到的人,我对@Sonrobby代码做了一些修改。 据我所知,@Sonrobby将活动添加到每个showOverlay调用上的覆盖。 而一些configuration可以传递给init函数,只让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() } } 

要添加给出的答案,如果您有时试图运行代码,可能会遇到问题。 就个人而言,有一个showOverlay没有正确调用的场合(因为我试图进入一个场景,然后在viewDidLoad期间立即调用这个函数)。

如果遇到类似于我的问题,代码有一个修复方法,我推荐的方法有所改变。

FIX:将两个代码块作为闭包放置到dispatch_async调用,如下所示:

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

方法:调用您的代码时,执行一次dispatch_after调用主队列,以将呼叫延迟几毫秒。

推理? 你只是要求UI在viewDidLoad中做太多。

如果这个解决scheme的附录有帮助,我会很高兴。

– 长龙

PS解决scheme为XCode v6.3.2工作

Swift 3。

我在下面的答案中使用了@ Lucho的代码,我改变了覆盖背景颜色来清除并添加了一个微调器的颜色。

 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 = CGRect(0, 0, 80, 80) overlayView.backgroundColor = .clear overlayView.clipsToBounds = true overlayView.layer.cornerRadius = 10 overlayView.layer.zPosition = 1 activityIndicator.frame = CGRect(0, 0, 40, 40) activityIndicator.center = CGPoint(overlayView.bounds.width / 2, overlayView.bounds.height / 2) activityIndicator.activityIndicatorViewStyle = .whiteLarge activityIndicator.color = .gray overlayView.addSubview(activityIndicator) } public func showOverlay(view: UIView) { overlayView.center = view.center view.addSubview(overlayView) activityIndicator.startAnimating() } public func hideOverlayView() { activityIndicator.stopAnimating() overlayView.removeFromSuperview() } } 

我已经创build了一个协议来呈现自己的视图控制器作为覆盖。 用法很简单:

 class ViewController: UIViewController, OverlayHost { @IBAction func showOverlayButtonPressed() { showOverlay(type: YourOverlayViewController.self, fromStoryboardWithName: "Main") } } 

结果:

Swift OverlayViewController

源代码: https : //github.com/agordeev/OverlayViewController

相关文章: https : //andreygordeev.com/2017/04/18/overlay-view-controller-protocols-swift/

模糊背景+活动指标,Swift 3的例子

 extension UIView{ func showBlurLoader(){ let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark) let blurEffectView = UIVisualEffectView(effect: blurEffect) blurEffectView.frame = self.bounds blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge) activityIndicator.frame = CGRect(x: 0, y: 0, width: 50, height: 50) activityIndicator.startAnimating() blurEffectView.contentView.addSubview(activityIndicator) activityIndicator.center = blurEffectView.contentView.center self.addSubview(blurEffectView) } func removeBluerLoader(){ _ = self.subviews.map { if let blurEffectView = $0 as? UIVisualEffectView{ _ = blurEffectView.subviews.map({ $0.removeFromSuperview() }) $0.removeFromSuperview() } } } } 

演示

更新@sonrobby答案,通过resize掩码添加了背景视图和方向处理…这可以用于简单的东西

 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() } } 

如果你把它添加到keywindow,它可以通过你的导航和标签栏也是这样的

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