Проблеми със забавяне на CABasicAnimation с IOS 5 и RemoteIO

Създавам музикален инструмент за iPhone. В моето приложение, когато докосна CALayer, се възпроизвежда бележка и слоят се мърда по време на бележката.

Всичко това работеше перфектно на iOS 4.1, но току-що надстроих до iOS 5.0.1 и имах големи проблеми със забавянето, ако натисна няколко бележки последователно. След много болка го стесних до следния код за анимация на мърдане за CALayer, който е докоснат.

// 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"];

Ако блокирам последния ред, където анимацията е добавена към слоя, цялото забавяне изчезва веднага. Имам чувството, че главната нишка е блокирана по някакъв начин или не работи в главната нишка, но се опитах да извикам функцията с performSelectorOnMainThread:withObject:waitUntilDone:NO и нямаше значение. Ако натисна много бележки наистина бързо, цялото приложение спира, а след това секунда или повече по-късно сякаш наваксва само себе си и изведнъж целият звук се възпроизвежда и анимацията накрая започва накъсана и задавена след това.

Някой знае ли за необичайни проблеми с CABasicAnimation в iOS 5? Има ли някакви алтернативни приложни програмни интерфейси (API) за анимация, които бих могъл да опитам, които също биха могли да анимират CALayers за неуточнена продължителност при повторение? Някой има ли някакви предложения или предположения как да се коригира/от какво може да произтича проблема?

РЕДАКТИРАНЕ: Реших, че определено няма нищо общо с природата на анимацията. Замених кода за мърдане с код, който просто избледнява цвета по този начин, но все още получавам същия ефект на забавяне, като бележките са бавни за възпроизвеждане.

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;

Подозирате, че може да е нещо общо с промяна в CoreAudio/RemoteIO може би? И това пречи на основната нишка или обратното?


person chopsalot    schedule 02.01.2012    source източник


Отговори (2)


Най-накрая разработих истинската природа на това, което причинява проблема. Оказва се, че има проблем с използването на shouldRasterize = YES в iOS 5.

В приложението си вграждам 100+ CALayers в UIView, чийто слой е зададен на shouldRasterize = YES. Създадох ново приложение от самото начало и добавих части, докато репликирам проблема. В крайна сметка се оказа това. В iOS 4 това не е проблем. В iOS 5 е така. Ако изключа shouldRasterize проблемът изчезва веднага.

Изпратихте доклад за грешка с apple.

person chopsalot    schedule 03.02.2012

Само за тест, опитайте да замените CABasicAnimation с [UIView beginAnimation/commitAnimation].

person Alex    schedule 13.01.2012
comment
UIView анимациите работят ли на CALayers? Опитах се да напиша собствен код и също се опитах да използвам горния отговор от тук: stackoverflow.com/questions/929364/, но и двете имат един и същ ефект на привидно игнориране на функциите и просто изпълнение на fret.fretLayer.transform = CATransform3DMakeRotation(-0.2, 0.0 ,1.0 ,2.0) код, докато преминава през него (така че го изпълнява само веднъж). Този най-висок отговор от връзката, която публикувах, изглежда използва CGAffineTransform вместо CATransform3D, но изглежда не мога да приложа CGAffineTransform директно към CALayers? Някакви идеи? (ps.благодаря) - person chopsalot; 14.01.2012