Ho implementato una classe LoadingLayer con alcuni elementi di animazione (2 per la precisione) animati con CABasicAnimation
. Ora, questa schermata di caricamento persiste in tutta l'intera applicazione. Nascondere la vista ferma tutte le animazioni? Oppure lasciami riformulare che: c'è molta memoria che devo essere preoccupata o che potrebbe potenzialmente causare ritardi? Ho provato ad utilizzare i metodi -pauseLayer:
e -resumeLayer:
ma hanno causato alcuni problemi dovuti al multithreading nella mia applicazione. È quindi giusto nascondere solo e mostrare la schermata di caricamento con le sue animazioni in esecuzione tutto il tempo?Mettere in pausa e riprendere CABasicAnimazione per la schermata di caricamento?
risposta
https://developer.apple.com/library/content/qa/qa1673/_index.html
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}
Se la vista è nascosto (invisibile o non nell'interfaccia a tutti), allora non fa parte della struttura di rendering.
Ma perché non interrompere semplicemente l'animazione quando il controller di visualizzazione nella cui vista questo livello è incorporato lascia l'interfaccia (viewDidDisappear
)? Dì semplicemente al livello removeAllAnimations
. Quindi creare nuovamente l'animazione, se lo si desidera, in viewWillAppear
?
Ecco la versione 3 rapida della risposta Nico's.
La speranza aiuta!
fileprivate func pauseLayer(layer: CALayer) {
let pausedTime = layer.convertTime(CACurrentMediaTime(), from: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
}
fileprivate func resumeLayer(layer: CALayer) {
let pausedTime = layer.timeOffset
layer.speed = 1.0
layer.timeOffset = 0.0
layer.beginTime = 0.0
let timeSincePause = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime
layer.beginTime = timeSincePause
}
Estendere Nico 's risposta per modificare la velocità di qualsiasi variabile:
extension CALayer {
func udpate(speed newSpeed: Float) {
let newSpeed = newSpeed == 0 ? 1e-6 : newSpeed
let triggerTime = self.convertTime(CACurrentMediaTime(), from: nil)
let offset = self.timeOffset
let begin = self.beginTime
let speed = self.speed
self.beginTime = (triggerTime - offset)/Double(speed) + begin
self.timeOffset = triggerTime
self.speed = newSpeed
}
}
utilizzare questo approccio, se siete disposti a cambiare velocità di animazione strato in modo interattivo. Se si desidera interrompere completamente lo strato, è necessario utilizzare la risposta di Nico, anche se con questo metodo con speed=0.0
avrà effettivamente circa 11 giorni per le animazioni per finire, e in 1 ora di animazione progredirete su 0.0036
- 1. Come per mettere in pausa e riprendere l'UIView.animateWithDuration
- 2. Come mettere in pausa/riprendere AVPlayer precarico
- 3. come mettere in pausa/riprendere una discussione
- 4. Come mettere in pausa e quindi riprendere una discussione?
- 5. Come mettere in pausa e riprendere un TimerTask/Timer
- 6. come faccio a mettere in pausa e riprendere un timer?
- 7. Come mettere in pausa/riprendere i download in iPhone (iOS)
- 8. Mettere in pausa, riprendere, annullare l'operazione di caricamento utilizzando NSURLSession UploadTask
- 9. C'è un modo elegante per mettere in pausa e riprendere qualsiasi altra goroutine in golang?
- 10. Come aggiungere mettere in pausa e riprendere la funzione, mentre ricodifica video nel Android
- 11. Mettere in pausa un processo?
- 12. Come per mettere in pausa il suono quando l'uso SpriteKit
- 13. Come posso consentire a un download di mettere in pausa/riprendere?
- 14. Come mettere in pausa/riprendere tutti i thread in un ExecutorService in Java?
- 15. JavaFX2: Posso mettere in pausa un'operazione/servizio in background?
- 16. Come riprendere schermo (schermata GNU)
- 17. Impossibile mettere in pausa SKEmitterNode in iOS9
- 18. Come posso mettere in pausa tutte le animazioni jQuery?
- 19. Implementare la pausa/riprendere nel download del file
- 20. Come mettere in pausa il timer handler.postDelayed() su Android
- 21. Come mettere in pausa un NSTimer?
- 22. come mettere in pausa la console in linguaggio F #
- 23. Ottieni percorso file completo utente per riprendere Caricamento file
- 24. È possibile mettere in pausa un'immagine .gif?
- 25. Impossibile mettere in pausa nano nel terminale
- 26. C# Come mettere in pausa un timer?
- 27. Come mettere in pausa durante l'animazione/transizione
- 28. ExoPlayer e avviare/mettere in pausa/comandi seekTo
- 29. Come mettere in pausa usando DownloadManager?
- 30. Come mettere in pausa un Threading.Timer per completare una funzione
ho avuto una bella simile implementazione ma i tuoi lavori, grazie! –
Ok, no, in realtà ho avuto la stessa identica implementazione. Ma ora so perché ha smesso di funzionare di volta in volta. Ogni volta che l'applicazione va in background e la rilancio, le animazioni non riprenderanno più. Qualche idea di cosa potrebbe causare questo ? –
prova a cancellare le animazioni e leggerle su didBeomceActive – Nico