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的主要内容,如果未能解决你的问题,请参考以下文章

iOS:面向 iOS 9 时使用 Swift 4

iOS开发中OC和swift的对比

“无效的 Swift 支持”在 Xamarin.iOS 中使用本机 Swift 库

如何使用 swift 在 IOS 地图上叠加图像

使用swift语言进行IOS应用开发

iOS使用swift创建View开发