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)
。啊,我明白了。在您回复之前,我一直在玩它,最后做了类似的事情:我将三元检查的结果分配给一个变量(不确定是否有该变量的名称),以确定是否调用其中一个变量。但那是干净的!谢谢