アクティビティインジケータのアニメーションを開始し、1秒後に停止したい。
だから誰も私がそれを行う方法を知っていますか?
class stuff {
@IBOutlet weak var indicator: UIActivityIndicatorView!
func iGotTriggeredBySomething {
indicator.startAimating()
//delay?
indicator.stopAnimating()
}
}
回答ありがとうございます。
dispatch_after()
は、アクションを遅延させる標準的な方法です。
_indicator.startAnimating()
let delay = 4.5 * Double(NSEC_PER_SEC)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue()) {
indicator.stopAnimating()
}
_
参照: dispatch_after-GCD in swift?
Swift 3.0の更新
_indicator.startAnimating()
let delay = Int(4.5 * Double(1000))
DispatchQueue.main.after(when: .now() + .milliseconds(delay)) {
indicator.stopAnimating()
}
_
ただし、Swift 3.0)の精神では、DispatchQueue
を拡張する方がより良い解決策になると思います。
_extension DispatchQueue {
func delay(_ timeInterval: TimeInterval, execute work: () -> Void) {
let milliseconds = Int(timeInterval * Double(1000))
after(when: .now() + .milliseconds(milliseconds), execute: work)
}
}
_
これにより、非常に素晴らしい
_indicator.startAnimating()
DispatchQueue.main.delay(4.5) {
indicator.stopAnimating()
}
_
更新2
Xcode 8.0ベータ版を掘り下げてみると、public func +(time: DispatchTime, seconds: Double) -> DispatchTime
が見つかりました。だから、これは有効だと思う…
_indicator.startAnimating()
DispatchQueue.main.after(when: .now() + 4.5) {
indicator.stopAnimating()
}
_
すでにこのクリーンなもののためにDispatchQueue
を拡張する必要はないと思います。
-
Swift 3.1の更新
Swift 3.1。のための新しい構文があります。彼らは物事を変えるのが好きです。
_indicator.startAnimating()
DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
indicator.stopAnimating()
}
_
更新されたSwift 3構文では、これは
DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
indicator.stopAnimating()
}
Swift 3.1およびGrand Central Dispatchを使用してこれを行うための、よりクリーンで表現力豊かなコードを次に示します。
Swift 3.1:
_indicator.startAnimating()
// Runs after 1 second on the main queue.
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1) ) {
indicator.stopAnimating()
}
_
また、.seconds(Int)
、.microseconds(Int)
、および.nanoseconds(Int)
を時間に使用できます。
IOS 10の新機能 タイマーにはブロック初期化子があります メインスレッドで実行されます。また、タイマーへの参照を取得してキャンセルしたり、事後に再スケジュールしたりできるため、わずかに柔軟性があります。
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) {_ in
}