美文网首页
NoticeView(swift版 )

NoticeView(swift版 )

作者: 吃货_X | 来源:发表于2020-08-28 11:19 被阅读0次

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
}

相关文章

网友评论

      本文标题:NoticeView(swift版 )

      本文链接:https://www.haomeiwen.com/subject/tztlsktx.html