2015-11-30 13 views
5

Ho un'immagine, ho animarlo con questo codice, in viewDidAppear:Come per mettere in pausa e riprendere l'UIView.animateWithDuration

UIView.animateWithDuration(10.5, delay:0.0, options: [], animations:{ 
self.myImage.transform = CGAffineTransformMakeTranslation(0.0, 200) 
}, completion: nil) 

voglio mettere in pausa l'animazione Quando si tocca myPauseButton, e riprendere l'animazione se io toccalo di nuovo.

risposta

16

2 funzioni per mettere in pausa e riprendere l'animazione, prendo da here e convertire in Swift.

func pauseLayer(layer: CALayer) { 
    let pausedTime: CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) 
    layer.speed = 0.0 
    layer.timeOffset = pausedTime 
} 

func resumeLayer(layer: CALayer) { 
    let pausedTime: CFTimeInterval = layer.timeOffset 
    layer.speed = 1.0 
    layer.timeOffset = 0.0 
    layer.beginTime = 0.0 
    let timeSincePause: CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) - pausedTime 
    layer.beginTime = timeSincePause 
} 

Ho un pulsante per sospendere o riprendere l'animazione che viene siglato a viewDidLoad:

var pause = false 
override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    UIView.animateWithDuration(10.5, delay:0.0, options: [], animations:{ 

     self.image.transform = CGAffineTransformMakeTranslation(0.0, 200) 
     }, completion: nil) 
} 

@IBAction func changeState() { 
    let layer = image.layer 
    pause = !pause 
    if pause { 
     pauseLayer(layer) 
    } else { 
     resumeLayer(layer) 
    } 
} 
+0

Grazie mille. Funziona perfettamente! –

+0

Semplice, elegante, perfetto, grazie! – user4806509

+0

Grazie, questo mi ha aiutato molto! Tuttavia, quando il livello viene messo in pausa e la vista viene ruotata, l'app si blocca. Come posso evitare questo? – froggomad

5

ecco Swift 3 versione di tale risposta + sono passato quelli funzione per un'estensione

extension CALayer { 
    func pause() { 
     let pausedTime: CFTimeInterval = self.convertTime(CACurrentMediaTime(), from: nil) 
     self.speed = 0.0 
     self.timeOffset = pausedTime 
    } 

    func resume() { 
     let pausedTime: CFTimeInterval = self.timeOffset 
     self.speed = 1.0 
     self.timeOffset = 0.0 
     self.beginTime = 0.0 
     let timeSincePause: CFTimeInterval = self.convertTime(CACurrentMediaTime(), from: nil) - pausedTime 
     self.beginTime = timeSincePause 
    } 
} 
Problemi correlati