2015-09-05 20 views
15

Buduję małą aplikację na zegarek Apple. Mam w sobie Grupę i Etykietę. Co próbuję zrobić, to:Apple Watch - powolna animacja obrazu po raz pierwszy

  • ożywiony obraz tła grupy
  • blaknięcie w etykiecie po animacji obrazu kończy

Mój kod wygląda w zasadzie tak:

 group.setBackgroundImageNamed("show_back-"); 
     group.startAnimatingWithImagesInRange(NSMakeRange(0, 39), duration: 1.5, repeatCount: 1); 
     let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1.5 * Double(NSEC_PER_SEC))) 
     dispatch_after(delayTime, dispatch_get_main_queue()) {() -> Void in 
      self.animateWithDuration(1) {() -> Void in 
       self.label.setAlpha(1) 
      }; 
     }; 

Problem polega na tym, że po uruchomieniu tej sekwencji po raz pierwszy animacja obrazu wydaje się działać wolniej niż 1,5 sekundy, ponieważ etykieta zaczyna blaknąć wcześniej niż obrazy przestają się zmieniać. Jeśli zostanie to ponownie uruchomione, gdy aplikacja jest uruchomiona, wszystko działa zgodnie z oczekiwaniami. Sądzę, że ma to coś wspólnego z ładowaniem obrazów lub czymś.

Jak mogę sprawić, by działał on konsekwentnie? Nie mogłem znaleźć żadnego wywołania zwrotnego na końcu animacji sekwencji obrazów, aby subskrybować.

EDIT Innym problemem Zauważyłam: Mam inny przypadek, gdy BG jest animowana z bloku dispatch_after, a kiedy pozostawić aplikację naciskając koronkę i powrócić przez dwukrotne dotknięcie go, albo blok dispatch_after nie jest wywoływane lub animacja tła nie jest poprawnie renderowana przy pierwszym wywołaniu (myślę, że druga, ponieważ próbowałem dodać punkt przerwania do bloku wysyłki i był on wyzwalany za każdym razem, gdy testowałem). Używam funkcji watchOS2, więc może jest ona związana ze stanem wersji beta systemu operacyjnego?

+0

Czy korzystasz z symulatora? – needshelp

+3

@needshelp nie, testuję na prawdziwym urządzeniu; na symulatorze wszystko działa idealnie. – alchemiss

+0

Jaki rozmiar mają twoje zdjęcia? – Swinny89

Odpowiedz

0

spróbować zrobić

group.setBackgroundImageNamed("show_back-"); 

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1.5 * Double(NSEC_PER_SEC))) 

dispatch_after(delayTime, dispatch_get_main_queue()) {() -> Void in 
     self.animateWithDuration(1) {() -> Void in 
      group.startAnimatingWithImagesInRange(NSMakeRange(0, 39), duration: 1.5, repeatCount: 1); 
      self.label.setAlpha(1) 
     }; 
    }; 

Nie jestem do końca pewien, co robisz, ale także spróbować zrobić animateWithDuration (0) lub (1,5)

0

wpadłem na tej samej kwestii, jak ty.

Dzieje się tak, ponieważ podczas pierwszej próby oglądanie filmu zajmuje czas. Również Apple nie dają nam żadnej metody „pre load”, więc wpadłem trochę pracy wokół niego: Po wyświetleniu mój kontroler będzie:

func willActivate() 

Gram sekwencji animacji raz w bieżniku tle w ten sposób, gdy mój użytkownik kliknie, obrazy są już załadowane.

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,  0)) { [weak self] in 
      if let uSelf = self { 
       uSelf.statusAnimationImage.setImageNamed("my image name") 
       uSelf.statusAnimationImage.startAnimatingWithImagesInRange(NSMakeRange(0, 359), duration: 0.5, repeatCount: 1) 
      } 
     } 

To był najlepszy sposób, w jaki znalazłem rozwiązanie tego problemu i działa on dla mnie.

Powiązane problemy