Ios Swift:启动和停止自定义类内活动指示器的动画

Ios Swift:启动和停止自定义类内活动指示器的动画,ios,swift,uiactivityindicatorview,Ios,Swift,Uiactivityindicatorview,我想在自定义类中放置一个活动指示器,以便可以从任何视图控制器启动/停止它 以下代码在启动活动指示器但不停止时起作用,我如何才能做到这一点 static func activityIndicatorFunction(view: UIView, targetVC: UIViewController, animate: Bool) { var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

我想在自定义类中放置一个活动指示器,以便可以从任何视图控制器启动/停止它

以下代码在启动活动指示器但不停止时起作用,我如何才能做到这一点

static func activityIndicatorFunction(view: UIView, targetVC: UIViewController, animate: Bool) {

    var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

    if animate == false {
        activityIndicator.stopAnimating()
        UIApplication.shared.endIgnoringInteractionEvents()
    } else {
        activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        activityIndicator.backgroundColor = UIColor(red:0.16, green:0.17, blue:0.21, alpha:1)
        activityIndicator.layer.cornerRadius = 6
        activityIndicator.center = targetVC.view.center
        activityIndicator.hidesWhenStopped = true
        activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.whiteLarge
        view.addSubview(activityIndicator)
        activityIndicator.startAnimating()
        //UIApplication.shared.beginIgnoringInteractionEvents()
    }
}
启动活动指示器的示例,如果要停止,则animate参数将为false

Utils.activityIndicatorFunction(view: view, targetVC: self, animate: true)

我建议将它们实现为两个独立的方法,并将它们添加到
UIViewController
的扩展中,如下所示:

UIViewController扩展名:

extension UIViewController {
    func showActivityIndicator() {
        let activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        activityIndicator.backgroundColor = UIColor(red:0.16, green:0.17, blue:0.21, alpha:1)
        activityIndicator.layer.cornerRadius = 6
        activityIndicator.center = view.center
        activityIndicator.hidesWhenStopped = true
        activityIndicator.activityIndicatorViewStyle = .WhiteLarge
        activityIndicator.startAnimating()
        //UIApplication.shared.beginIgnoringInteractionEvents()

        activityIndicator.tag = 100 // 100 for example

        // before adding it, you need to check if it is already has been added:
        for subview in view.subviews {
            if subview.tag == 100 {
                print("already added")
                return
            }
        }

        view.addSubview(activityIndicator)
    }

    func hideActivityIndicator() {
        let activityIndicator = view.viewWithTag(100) as? UIActivityIndicatorView
        activityIndicator?.stopAnimating()

        // I think you forgot to remove it?
        activityIndicator?.removeFromSuperview()

        //UIApplication.shared.endIgnoringInteractionEvents()
    }
}
我假设您希望始终将
activityIndicator
显示/隐藏到
ViewController.view
,如果它不是,您可能需要让它成为
UIView
的activityIndicator,而不是
UIViewController

用法:

static func showActivityIndicator(view: UIView, targetVC: UIViewController) {

    var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

    activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    activityIndicator.backgroundColor = UIColor(red:0.16, green:0.17, blue:0.21, alpha:1)
    activityIndicator.layer.cornerRadius = 6
    activityIndicator.center = targetVC.view.center
    activityIndicator.hidesWhenStopped = true
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.whiteLarge
    activityIndicator.tag = 1
    view.addSubview(activityIndicator)
    activityIndicator.startAnimating()
    UIApplication.shared.beginIgnoringInteractionEvents()
}

static func hideActivityIndicator(view: UIView) {
    let activityIndicator = view.viewWithTag(1) as? UIActivityIndicatorView
    activityIndicator?.stopAnimating()
    activityIndicator?.removeFromSuperview()
    UIApplication.shared.endIgnoringInteractionEvents()
}
Utils.showActivityIndicator(view: view, targetVC: self)
Utils.hideActivityIndicator(view: view)
例如,考虑到你有两个iBACTS,第一个显示活动指示符,另一个隐藏它,它们应该是:

@IBAction func show(sender: AnyObject) {
    showActivityIndicator()
}

@IBAction func hide(sender: AnyObject) {
    hideActivityIndicator()
}

这是协议扩展的完美候选。我最近自己做的

首先在一个文件中创建协议,比如activityindicatorresenter.swift 创建协议扩展名(在同一个文件中…或不同的文件中) 然后,任何视图控制器都可以符合该协议
我发现最好只为活动指示器设置一个“标记”,然后在停止动画时引用该标记,使用一个函数隐藏,一个函数显示,正如Ahmad建议的那样。Ahmad F和Guillermo的答案似乎也不错

在my Utils.swift文件中显示/隐藏函数:

static func showActivityIndicator(view: UIView, targetVC: UIViewController) {

    var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

    activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    activityIndicator.backgroundColor = UIColor(red:0.16, green:0.17, blue:0.21, alpha:1)
    activityIndicator.layer.cornerRadius = 6
    activityIndicator.center = targetVC.view.center
    activityIndicator.hidesWhenStopped = true
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.whiteLarge
    activityIndicator.tag = 1
    view.addSubview(activityIndicator)
    activityIndicator.startAnimating()
    UIApplication.shared.beginIgnoringInteractionEvents()
}

static func hideActivityIndicator(view: UIView) {
    let activityIndicator = view.viewWithTag(1) as? UIActivityIndicatorView
    activityIndicator?.stopAnimating()
    activityIndicator?.removeFromSuperview()
    UIApplication.shared.endIgnoringInteractionEvents()
}
Utils.showActivityIndicator(view: view, targetVC: self)
Utils.hideActivityIndicator(view: view)
调用显示函数:

static func showActivityIndicator(view: UIView, targetVC: UIViewController) {

    var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

    activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    activityIndicator.backgroundColor = UIColor(red:0.16, green:0.17, blue:0.21, alpha:1)
    activityIndicator.layer.cornerRadius = 6
    activityIndicator.center = targetVC.view.center
    activityIndicator.hidesWhenStopped = true
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.whiteLarge
    activityIndicator.tag = 1
    view.addSubview(activityIndicator)
    activityIndicator.startAnimating()
    UIApplication.shared.beginIgnoringInteractionEvents()
}

static func hideActivityIndicator(view: UIView) {
    let activityIndicator = view.viewWithTag(1) as? UIActivityIndicatorView
    activityIndicator?.stopAnimating()
    activityIndicator?.removeFromSuperview()
    UIApplication.shared.endIgnoringInteractionEvents()
}
Utils.showActivityIndicator(view: view, targetVC: self)
Utils.hideActivityIndicator(view: view)
调用隐藏函数:

static func showActivityIndicator(view: UIView, targetVC: UIViewController) {

    var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

    activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    activityIndicator.backgroundColor = UIColor(red:0.16, green:0.17, blue:0.21, alpha:1)
    activityIndicator.layer.cornerRadius = 6
    activityIndicator.center = targetVC.view.center
    activityIndicator.hidesWhenStopped = true
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.whiteLarge
    activityIndicator.tag = 1
    view.addSubview(activityIndicator)
    activityIndicator.startAnimating()
    UIApplication.shared.beginIgnoringInteractionEvents()
}

static func hideActivityIndicator(view: UIView) {
    let activityIndicator = view.viewWithTag(1) as? UIActivityIndicatorView
    activityIndicator?.stopAnimating()
    activityIndicator?.removeFromSuperview()
    UIApplication.shared.endIgnoringInteractionEvents()
}
Utils.showActivityIndicator(view: view, targetVC: self)
Utils.hideActivityIndicator(view: view)

如何使用三元运算符显示或隐藏指示器?比如x=条件?true:false,但是在本例中,使用startAnimating()和stopAnimating()@DaniSpringer,您可以将这两种方法组合在一起,这需要一个
Bool
参数来显示/隐藏指示器,因此
组合方法(myCondition?true:false)
。啊,我明白了。在您回复之前,我一直在玩它,最后做了类似的事情:我将三元检查的结果分配给一个变量(不确定是否有该变量的名称),以确定是否调用其中一个变量。但那是干净的!谢谢