美文网首页Swift 相关
Swift多事件延时计时器触发

Swift多事件延时计时器触发

作者: 怀心逝水 | 来源:发表于2018-12-16 12:23 被阅读17次

    应用场景:事件的多次触发后,事件在每隔0.25秒执行显示动画。(例如,当我们在友盟推送消息后,我们会在APP的界面上显示提示横幅。)

    还是先看效果图吧!


    TimerThread.gif

    好的,如果你有兴趣看下去的话,咋们来看看,这个demo的思路是什么。

    知识点:

    1.swift的基础知识(布局,创建控件,图层获取等)
    2.定时器的用法,当然我这里是创建线程来处理的,至于你如果想看看其他的几种定时器的用法,可以点击
    传送门
    3.实现逻辑,在主线程中消失视图动画完成之后再去执行block回调,之后根据消息数组是否为空,重复执行显示视图动画。

    部分代码解读:

    
        @IBAction func clickBtnDidTouch(_ sender: UIButton) {
            
            if msgArray.count == 0 {
                
                clickNum = 0
                index = 1
            }
            clickNum = clickNum + 1
            if msgArray.count != 0 {
                
                msgArray.append("显示信息" + String(clickNum))
            }else {
                
                msgArray.append("显示信息" + String(clickNum))
                solveMsgPushShow(index: index)
            }
        }
    
    

    可以看到在ViewController中的msgArray是储存新消息的数组,下面的solveMsgPushShow连续的点击中只会执行一次,而添加消息会一直执行的。

    
        func solveMsgPushShow(index: NSInteger) {
            
            let msg = msgArray.first
            if msg != nil {
                
                Helper.showPushInfo(msg: msg!, ofTag: index) {
                    
                    if self.msgArray.count != 0 {
                        
                        self.msgArray.removeFirst()
                    }
                    
                    if self.msgArray.count == 0 {
                        
                        return
                    }else {
                        
                        self.index = self.index + 1
                        self.solveMsgPushShow(index: self.index)
                    }
                }
            }
        }
    
    

    这个方法就是根据数组中的消息是否为空,而去执行显示和消失动画,这里的index是创建控件时,区分创建的控件的tag,从而在消除控件的时候方便的获取需要消除的控件。

            UIView.animate(withDuration: 0.3, animations: {  //显示动画
                
                label.bottomY = SCREEN_HEIGHT - 20
                button.topY = 30
            }) { (finish) in
                
                DispatchQueue.main.asyncAfter(deadline: .now() + 2.5, execute: {     // 线程延时器
                    
                    DispatchQueue.main.async {     // 获取主线程
                        
                        dismissPushInfoOfTag(index: index, completeBlock: completeBlock)
                    }
                })
            }
    
    

    显示动画,用定时器让控件在主界面上停留一段时间,之后我们需要获取主线程执行控件的消失动画

            UIView.animate(withDuration: 0.3, animations: {  //消失动画
                
                label?.topY = SCREEN_HEIGHT
                button?.bottomY = 0
            }) { (finish) in
                
                label?.removeFromSuperview()
                button?.removeFromSuperview()
                
                if completeBlock != nil {
                    
                    completeBlock!()
                }
            }
    
    

    消失动画,这里我们在消失动画执行完毕之后,去除控件,然后执行回调方法。这样我们在ViewController中获取到回调的block后再去根据msgArray是否为空执行下一次消息的显示和消失动画。

    好的,基本思路就是这些了。希望你看了之后,对你遇到的问题有些帮助!!!

    最后还是给出这个demo的GitHub地址吧

    TimerThread

    相关文章

      网友评论

        本文标题:Swift多事件延时计时器触发

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