美文网首页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多事件延时计时器触发

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

  • 防抖和节流

    防止在一段时间内,频繁调用,在一定延时后调用,下次触发,则清楚计时器,重新延时//防抖functiondeboun...

  • 一个例子 - 看懂js中防抖和节流的实现

    防抖 事件触发后延时一段时间执行,在这期间事件又触发,则取消之前事件执行,继续延时一段时间后才执行一般用在输入框输...

  • 区分单击和双击事件

    原理:利用定时器,不让单击的事件立即触发,而是延时一会触发,在这过程中如果出发了双击事件,那么就清除单击事件 va...

  • JS debounce(防抖) 和 throttle(节流)

    防抖 防抖,即如果短时间内大量触发同一事件,都会重置计时器,等到事件不触发了,再等待规定的时间,才会执行函数。* ...

  • UntiyC#编程:Coroutine协同程序

    1.从需求出发 延时是游戏编程中最常见的需求之一,角色的移动控制需要延时,事件触发需要延时。有鉴于此,很多的游戏引...

  • animator

    Any State:当前执行的状态 动画事件触发: 用计时器触发 配置文件:读写txt1.动画名字2.动画的路径3...

  • 防抖和节流

    防抖 事件被触发后,先清空定时器,在设定的延时到了后,再执行动作。 使用场景: resize/scroll 事件 ...

  • swift4.0 cell重用导致ReactiveCocoa(R

    swift4.0 cell重用导致ReactiveCocoa(RAC) cell上Button点击事件多次触发问题...

  • ESP32玩转MicroPython(三) 延时、计时 和GPI

    一. 延时和计时 使用time模块: 这些延时是阻塞式延时, 后续程序需要等待其完成 二. 计时器 ESP32端...

网友评论

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

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