等待视图类
如下是一个单例类的模式,你也可以是有其init方法创建新的view给单个view使用。
public extension DispatchQueue {
private static var onceToken = [String]()
public class func once(_ token: String, _ block:@escaping () -> Void) {
objc_sync_enter(self)
defer {
objc_sync_exit(self)
}
if onceToken.contains(token) {
return
}
onceToken.append(token)
block()
}
}
final class WaitView: UIView {
static func shared() -> WaitView {//这里使用了GCD的单例类创建方法,可以使用更简便的方法
struct Singleton {
static var single = WaitView(frame: UIScreen.main.bounds)
}
DispatchQueue.once("WaitView") {
Singleton.single = shared()
}
return Singleton.single
}
//static let share = WaitView()
var endBlock: (() -> Void)?
var contentView: UIActivityIndicatorView!
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor(white: 0, alpha: 0.2)
initActivity()
}
private func initActivity() {
self.contentView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.whiteLarge)
self.contentView.frame.size = CGSize(width: 50, height: 50)
self.contentView.center = CGPoint(x: self.bounds.width / 2, y: self.bounds.height / 2)
self.addSubview(contentView)
}
override func removeFromSuperview() {
super.removeFromSuperview()
// print("wait view removed!!!")
}
required init(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
deinit {
print("wait view deinit!!!")
}
//菊花转动开始
func play()
{
UIApplication.shared.keyWindow?.addSubview(self)
self.contentView.startAnimating()
}
func playOn(_ view: UIView) {
view.addSubview(self)
self.contentView.startAnimating()
}
func playOn(_ viewController: UIViewController) {
viewController.view.addSubview(self)
self.contentView.startAnimating()
}
//菊花转动结束
func stop()
{
if Wait.isExist() {
self.contentView.stopAnimating()
self.removeFromSuperview()
self.endBlock?()
}
}
func stoped() {
self.contentView.stopAnimating()
self.removeFromSuperview()
self.endBlock?()
}
}
最后加上一个类,方便于使用该单例类
public class Wait {
public class func startAfter(_ time: TimeInterval) {
DispatchQueue.main.asyncAfter(deadline: .now() + time, execute: {
Wait.start()
})
}
public class func start() {
WaitView.shared().play()
}
public class func startDismiss(_ time: TimeInterval) {
WaitView.shared().play()
DispatchQueue.main.asyncAfter(deadline: .now() + time, execute: {
WaitView.shared().stop()
})
}
public class func stop() {
WaitView.shared().stop()
}
public class func stop(_ endBlcok: (() -> Void)?) {
WaitView.shared().stop()
WaitView.shared().endBlock = {
endBlcok?()
}
}
public class func isExist() -> Bool {
if let views = UIApplication.shared.keyWindow?.subviews {
for view in views {
if view.isKind(of: WaitView.self) {
return true
}
}
}
return false
}
}