Tworzę instrument muzyczny dla iPhone'a. W mojej aplikacji po dotknięciu CALayera gra nuta, a warstwa porusza się przez cały czas trwania notatki.Problemy z opóźnieniem CABasicAnimation z IOS 5 i RemoteIO
Wszystko działało idealnie na iOS 4.1, jednak po uaktualnieniu do systemu iOS 5.0.1 doświadczyłem poważnych problemów z opóźnieniem, jeśli naciskałem kilka kolejnych nut. Po dużym bólu zawęziłem go do następującego kodu animacji dla dotkniętego CALayera.
// here is an example wiggle
CABasicAnimation *wiggle = [CABasicAnimation animationWithKeyPath:@"transform"];
wiggle.duration = 0.1;
//wiggle.repeatCount = 1e100f;
wiggle.repeatCount = 100;
wiggle.autoreverses = YES;
wiggle.toValue = [NSValue valueWithCATransform3D:CATransform3DRotate(fret.fretLayer.transform,0.2, 0.0 ,1.0 ,2.0)]; //angle, x , y , z
wiggle.fromValue = [NSValue valueWithCATransform3D:CATransform3DRotate(fret.fretLayer.transform,-0.2, 0.0 ,1.0 ,2.0)]; //angle, x , y , z
// doing the wiggle
[note.noteLayer addAnimation:wiggle forKey:@"wiggle"];
Jeśli zablokuję ostatnią linię, w której dodano animację do warstwy, wszystkie opóźnienia znikają natychmiast. Wygląda na to, że wątek główny jest w jakiś sposób blokowany lub nie działa w głównym wątku, ale próbowałem wywołać funkcję z performSelectorOnMainThread: withObject: waitUntilDone: NO i nie robiło to żadnej różnicy. Jeśli bardzo szybko wciskam mnóstwo notatek, cała aplikacja się zatrzyma, a potem, mniej więcej, później jej dźwięk przypomina o sobie i nagle wszystkie dźwięki zostają odtworzone, a animacja w końcu zaczyna się zacieśniać i dławi się po tym.
Czy ktoś wie o niezwykłych problemach z CABasicAnimation w iOS 5? Czy istnieją jakieś alternatywne interfejsy API animacji, które mogłem wypróbować, które również mogą animować CALayers na czas nieokreślony w trybie wielokrotnym? Ktoś ma jakieś sugestie lub podpowiedzi, jak naprawić/na czym może polegać problem?
EDYCJA: Zdecydowałem, że zdecydowanie nie ma to nic wspólnego z naturą animacji. Zastąpiłem ten kod kodem, który po prostu zanikł w kolorze, ale wciąż mam ten sam efekt opóźnienia, a notatki są opóźnione w grze.
CABasicAnimation *wiggle = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
wiggle.duration = 2;
wiggle.toValue = (id)[UIColor whiteColor].CGColor ;
wiggle.fromValue = (id)[UIColor colorWithRed:0.1 green:0.2 blue:0.8 alpha:0.4].CGColor;
Podejrzewasz, że może to mieć coś wspólnego ze zmianą w CoreAudio/RemoteIO? A to ingeruje w główny wątek lub na odwrót?
Czy animacje UIView działają na CALayers? Próbowałem napisać własny kod, a także próbowałem użyć najwyższej odpowiedzi stąd: http://stackoverflow.com/questions/929364/how-to-create-iphones-wobbling-icon-effect, ale oba mają ten sam efekt pozornego ignorowania funkcje i po prostu uruchamiają kod fürlot.fretLayer.transform = CATransform3DMakeRotation (-0,2, 0.0, 1.0, 2.0) , gdy przechodzi nad nim (dzięki czemu działa tylko raz). Ta najwyższa odpowiedź z opublikowanego linku wydaje się używać CGAffineTransform zamiast CATransform3D, ale nie mogę zastosować CGAffineTransform bezpośrednio do CALayers? Jakieś pomysły? (Ps.thanks) – chopsalot