应用场景:事件的多次触发后,事件在每隔0.25秒执行显示动画。(例如,当我们在友盟推送消息后,我们会在APP的界面上显示提示横幅。)
还是先看效果图吧!
好的,如果你有兴趣看下去的话,咋们来看看,这个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地址吧