2012-01-02 21 views
5

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?

Odpowiedz

1

W końcu odkryłem prawdziwy charakter tego, co było przyczyną problemu. Okazuje się, że jest problem z używaniem shouldRasterize = YES w iOS 5.

W mojej aplikacji umieściłem 100+ CALayers w UIView, który miał swoją warstwę ustawioną na shouldRasterize = YES. Stworzyłem nową aplikację od podstaw i dodałem bity, dopóki nie zreplikowałem problemu. Ostatecznie okazało się, że tak jest. W systemie iOS 4 nie stanowi to problemu. W systemie iOS 5 jest. Jeśli się przekręcę, zrób polecenie "rasteryzuj", problem zniknie natychmiast.

Złożyłem zgłoszenie błędu z jabłkiem.

0

Tylko do testu, spróbuj zamienić CABasicAnimation na [UIView beginAnimation/commitAnimation].

+0

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

Powiązane problemy