2013-04-03 15 views
6

CABasicAnimation ile animasyonlu bazı animasyon öğeleri (tam olarak 2) olan bir YüklemeLayeri sınıfı uyguladık. Şimdi, bu yükleme ekranı görünümü tüm uygulama boyunca devam ediyor. Görünümü gizlemek tüm animasyonları durdurur mu? Ya da şunu tekrar söyleyeyim: Endişelenmem gereken ya da potansiyel olarak gecikmelere neden olabilecek çok fazla bellek var mı? -pauseLayer: ve -resumeLayer: yöntemlerini kullanmayı denedim ancak uygulamamdaki çoklu okuma nedeniyle bazı sorunlara neden oldular. Bu nedenle, her zaman çalışan animasyonları ile yükleme ekranını gizlemek ve göstermek yeterli midir?Yükleme için CABasicAnimation ekranını duraklatıp devam ettirin mi?

cevap

9

https://developer.apple.com/library/content/qa/qa1673/_index.html

görünümü gizli ise
-(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; 
} 
+0

ilerleyeceğine Uygulama ama seninki çalışıyor, teşekkürler! –

+0

Tamam, hayır, aslında tam olarak aynı uygulamaya sahibim. Ama şimdi neden zaman zaman çalışmayı durdurduğunu biliyorum. Uygulama arka plana girdiğinde ve yeniden başlattığımda, animasyonlar tekrar çalışmayacaktı. Buna neyin sebep olabileceği hakkında bir fikrin var mı? –

+1

animasyonları temizlemeyi ve bunları açıklamayı deneyin didBeomceActive – Nico

0

(görünmez ya da hiç arayüzünde), sonra render ağacın parçası değildir.

Ancak, bu katmanın görünümünde yerleşik olan görünüm denetleyicisi arabirimi kapattığında (viewDidDisappear) neden animasyonu durdurmuyor? Sadece katmanı removeAllAnimations'a söyle. Ardından, animasyonu viewWillAppear içinde yeniden oluşturun.

2

İşte Nico's yanıtının hızlı 3 sürümüdür.

Umut yardımcı olur!

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 
} 
0

herhangi değişkene hızını değiştirmek için Nico cevabını genişletme:

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 
    } 
} 

kullanın bu yaklaşım, etkileşimli katman animasyon hızını değiştirmek için istekli iseniz. Eğer Tamamen katmanı durdurmak istiyorsanız, animasyonlar bitirmek için speed=0.0 ile bu yöntemi kullanarak aslında yaklaşık 11 gün alacak olsa, Nico cevabı kullanmalıdır ve 1 saat animasyon ben oldukça benzer vardı yaklaşık 0.0036

İlgili konular