を使用したこの簡単な同期アニメーションについて考えてみましょうCADisplayLink
。
var link:CADisplayLink?
var startTime:Double = 0.0
let animTime:Double = 0.2
let animMaxVal:CGFloat = 0.4
private func yourAnim()
{
if ( link != nil )
{
link!.paused = true
//A:
link!.removeFromRunLoop(
NSRunLoop.mainRunLoop(), forMode:NSDefaultRunLoopMode)
link = nil
}
link = CADisplayLink(target: self, selector: #selector(doorStep) )
startTime = CACurrentMediaTime()
link!.addToRunLoop(
NSRunLoop.currentRunLoop(), forMode:NSDefaultRunLoopMode)
}
func doorStep()
{
let elapsed = CACurrentMediaTime() - startTime
var ping = elapsed
if (elapsed > (animTime / 2.0)) {ping = animTime - elapsed}
let frac = ping / (animTime / 2.0)
yourAnimFunction(CGFloat(frac) * animMaxVal)
if (elapsed > animTime)
{
//B:
link!.paused = true
link!.removeFromRunLoop(
NSRunLoop.mainRunLoop(), forMode:NSDefaultRunLoopMode)
link = nil
yourAnimFunction(0.0)
}
}
func killAnimation()
{
// for example if the cell disappears or is reused
//C:
????!!!!
}
色々と問題があるようです。
(A:) では、link
null ではありませんが、実行ループから削除できない場合があります。(たとえば、誰かがそれを初期化した可能性がありますlink = link:CADisplayLink()
- クラッシュを試してみてください。)
第二に、(B :) 混乱しているように見えます... 確かにもっと良い (そしてもっと Swift な) 方法があります。
最後に (C :) アニメを壊したい場合は ... 落ち込んでいて、何が最善かわかりません。
そして実際には、A: と B: のコードは、クリーンアップ コールのような同じ呼び出し権である必要があります。