DispathAfterTask : https://www.jianshu.com/p/37d0a29946b7
import UIKit
public class XlbNoticeView: UIView {
var hiddenNoticeTask:DispathAfterTask?
var mainWidth:CGFloat = 0
var noticeSize:CGSize = CGSize.init(width: 0, height: 0)
private lazy var labelTitle:UILabel = {
let label = UILabel.init()
label.textAlignment = .center
label.backgroundColor = .clear
label.font = FONT(13)
label.numberOfLines = 0
label.adjustsFontSizeToFitWidth = true
label.textColor = Hexadecimal(0xFFFFFF, 1)
return label
}()
private func setupLayers() {
NSObject.cancelPreviousPerformRequests(withTarget: self)
addSubview(labelTitle)
}
override public func layoutSubviews() {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1, execute: {
self.alpha = 1
if self.mainWidth != (self.superview?.XlbWidth ?? 0) {
self.center = self.superview?.center ?? CGPoint.init(x: 0, y: 0)
self.mainWidth = self.superview?.XlbWidth ?? 0
}
})
}
override public init(frame: CGRect) {
super.init(frame:frame)
// if UIDevice.current.model != "iPhone" {
NotificationCenter.default.addObserver(self, selector: #selector(layoutSubviews), name: UIApplication.didChangeStatusBarOrientationNotification, object: nil)
// }
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public class func show(superview:UIView, notice:String, _ complete : @escaping(_ isComplete:Bool) -> () = { isComplete in },_ account:AccountContext? = nil){
DispatchQueue.main.async {
if notice.count == 0 {
complete(false)
return
}
if let oldView = loadingNoticeForView(superview) {
oldView.dismiss()
}
let view = XlbNoticeView.init(frame: XlbRect(0, 0, 0, 0))
view.setupLayers()
view.alpha = 0
view.currenContext = account
view.layer.cornerRadius = 10
view.layer.masksToBounds = true
view.backgroundColor = Hexadecimal(0x555555,1)
superview.addSubview(view)
superview.bringSubviewToFront(view)
let size = notice.sizeOfTextWithMaxSize(ADAPTATION_WIDTH(200),4,FONT(13))
view.XlbWidth = size.width + 30
view.XlbHeight = size.height + 20
view.noticeSize = size
view.setNoticeText(notice)
view.hiddenNoticeTask = DispathAfter(2, task: {() in
if view.superview != nil {
complete(true)
} else {
complete(false)
}
view.dismiss()
})
}
}
public class func showWindow(notice:String, _ complete : @escaping(_ isComplete:Bool) -> () = { isComplete in },_ account:AccountContext? = nil) {
DispatchQueue.main.async {
if notice.count == 0 {
complete(false)
return
}
if let oldView = UIApplication.shared.keyWindow?.rootViewController?.view.viewWithTag(1255) {
let view = oldView as! XlbNoticeView
view.dismiss()
}
let view = XlbNoticeView.init(frame: XlbRect(0, 0, 0, 0))
view.setupLayers()
view.alpha = 0
view.tag = 1255
view.currenContext = account
view.layer.cornerRadius = 10
view.layer.masksToBounds = true
view.backgroundColor = Hexadecimal(0x555555,1)
let size = notice.sizeOfTextWithMaxSize(ADAPTATION_WIDTH(200),4,FONT(13))
view.XlbWidth = size.width + 30
view.XlbHeight = size.height + 20
view.noticeSize = size
view.setNoticeText(notice)
UIApplication.shared.keyWindow?.rootViewController?.view.addSubview(view)
view.hiddenNoticeTask = DispathAfter(2, task: {() in
complete(true)
view.dismiss()
})
}
}
private func setNoticeText(_ notice:String) {
labelTitle.frame = XlbRect(12.5, 0, noticeSize.width + 5, noticeSize.height + 20)
labelTitle.attributedText = Xlb.getAttributedStringWithString(notice, 4)
labelTitle.textAlignment = .center
}
private func dismiss() {
DispathAfterCancel(hiddenNoticeTask)
self.removeFromSuperview()
}
deinit {
NotificationCenter.default.removeObserver(self)
DispathAfterCancel(hiddenNoticeTask)
}
}
private func loadingNoticeForView(_ superView:UIView) -> XlbNoticeView? {
let subViews:[UIView] = superView.subviews
for view in subViews.reversed().enumerated() {
if view.element.isKind(of: XlbNoticeView.self) {
return (view.element as! XlbNoticeView)
}
}
return nil
}
网友评论