Richtige Handhabung / Aufräumen / etc CADisplayLink im Swift-benutzerdefinierte animation?

Betrachten Sie dieses trivial-sync-animation mit 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:
    ????!!!!
    }

Scheint es verschiedene Probleme.

Unter (A:), obwohl link ist nicht null, kann es nicht möglich sein, entfernen Sie es von einer Schlinge. (Zum Beispiel, die jemand haben kann, initialisiert es mit link = link:CADisplayLink() - probieren Sie es für einen crash.)

Zweitens auf (B:) es scheint ein Durcheinander ... sicherlich gibt es bessere (und mehr Swift) Weg, und was ist, wenn es null-auch wenn die Zeit gerade abgelaufen ist?

Schließlich in (C:) wenn Sie wollen, brechen die anim ... habe ich depressiv und habe keine Ahnung was am besten ist.

Und wirklich den code auf A: und B: sollte das gleiche call-Recht, eine Art clean-up-call.

InformationsquelleAutor Fattie | 2016-06-30
Schreibe einen Kommentar