iOS (Swift):使用 DispatchQueue.main.asyncAfter 制作充满活力的按钮 Flash
Posted
技术标签:
【中文标题】iOS (Swift):使用 DispatchQueue.main.asyncAfter 制作充满活力的按钮 Flash【英文标题】:iOS (Swift): Making Vibrant Button Flash with DispatchQueue.main.asyncAfter 【发布时间】:2018-12-24 12:03:31 【问题描述】:我试图通过调用flash()
给出的方法来点亮一堆充满活力的UIButton
子类实例:
func flash(delay: TimeInterval = 0.0)
DispatchQueue.main.asyncAfter(deadline: .now() + delay) [weak self] in
guard let strongSelf = self else return
let flashView = UIView(frame: strongSelf.bounds)
strongSelf.insertSubview(flashView, at: 0)
flashView.backgroundColor = strongSelf.color
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) flashView.removeFromSuperview()
使用此函数,我可以循环遍历一组按钮,触发持续 0.1 秒的闪烁效果,闪烁是由活力层改变其后面的 flashView
实例引起的。
在对DispatchQueue.main.asyncAfter
的调用中调用DispatchQueue.main.asyncAfter
是否有任何缺点?
【问题讨论】:
【参考方案1】:不,这里不需要[weak self]
,因为这个 GCD(Grand Central Dispatch)不会导致保留周期
DispatchQueue.main.asyncAfter(deadline: .now() + delay) /*[weak self] in */
查看最后一段Here
【讨论】:
谢谢.. GCD 代表什么? 尝试谷歌搜索“ios GCD”【参考方案2】:我没有发现对DispatchQueue.main.asyncAfter()
的嵌套调用有任何问题。但是,每次调用您的 flash 函数都会创建一个新的子视图并将其添加到您的视图中。这将创建一个不断增加的子视图堆栈,以在动画运行时累积(这将导致您的内存使用量缓慢增长,直到您释放按钮视图。
你应该重构你的闪烁视图,让一个实例变量变成一个单独的子视图,并改变它的颜色来导致闪烁,而不是每次都添加一个新的。
【讨论】:
谢谢。 `DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) flashView.removeFromSuperview() ` 行是否不会在 0.1 秒后删除flashView
的实例?所以子视图不会不断添加到按钮?
哦,对不起。我错过了那一点。实际上它会删除子视图。以上是关于iOS (Swift):使用 DispatchQueue.main.asyncAfter 制作充满活力的按钮 Flash的主要内容,如果未能解决你的问题,请参考以下文章