swift - 如何在ios程序开发中正确使用activity indicator(菊花等待图标)?
高洛峰
高洛峰 2017-04-18 09:42:22
0
2
698

我想达到的效果是这样的:
点击按钮

图片ImageView处的占位图消失

图片处开始显示菊花动画图标

旋转五秒中

菊花图标停止并消失

显示新的图片

部分代码如下:

class ViewController: UIViewController {
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
    @IBAction func clickButton(_ sender: UIButton) {
        imageView.image = nil
        activityIndicator.startAnimating()
        sleep(5)
        activityIndicator.stopAnimating()
        imageView.image = UIImage(named: "cat")
    }
}

页面设计

实际效果是点击按钮之后,什么都没有发生,五秒钟之后换成了新的图片。
请问正确的写法应该是怎样的?

我的全部源码在这里:https://github.com/Stanley-Ti...
编程环境是Xcode8 Swift3

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(2)
Ty80

給你兩個思路吧,不一定是最好的,但願對你有用吧。首先sleep(5)是寫在主執行緒中,那麼實際上菊花是已經開始動畫了,不過當執行到sleep(5)的時候主執行緒休眠了,runloop不接收觸控事件也不更新UI介面,所以你看不到菊花的動畫效果,當主線程5秒後被喚醒,直接執行了stopAnimating,然後展示新圖片。可以用GCD提供的afterAPI:

imageView.image = nil
activityIndicator.startAnimating()
let delay = DispatchTime.now() + DispatchTimeInterval.seconds(5)
DispatchQueue.main.asyncAfter(deadline: delay) {
        activityIndicator.stopAnimating()
        imageView.image = UIImage(named: "cat")
}

如果還想繼續用sleep那可以開闢一個子線程,不過比較麻煩:

DispatchQueue.global().async {
    DispatchQueue.main.async {
        imageView.image = nil
        activityIndicator.startAnimating()
    }
    sleep(5)
    DispatchQueue.main.async {
        activityIndicator.stopAnimating()
        imageView.image = UIImage(named: "cat")
    }
}
巴扎黑

直覺,sleep(5)有問題。
sleep會讓CPU停止處理操作。這樣,在它使能時,UI不能更新,也就什麼都沒有發生了。

使用dispatch_after()來取代sleep()處理延遲。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!