21

を使用したこの簡単な同期アニメーションについて考えてみましょう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:) では、linknull ではありませんが、実行ループから削除できない場合があります。(たとえば、誰かがそれを初期化した可能性がありますlink = link:CADisplayLink()- クラッシュを試してみてください。)

第二に、(B :) 混乱しているように見えます... 確かにもっと良い (そしてもっと Swift な) 方法があります。

最後に (C :) アニメを壊したい場合は ... 落ち込んでいて、何が最善かわかりません。

そして実際には、A: と B: のコードは、クリーンアップ コールのような同じ呼び出し権である必要があります。

4

3 に答える 3