我正在爲iPhone創建樂器。在我的應用程序中,當我觸摸CALayer時,會彈奏一個音符,該音符在音符的持續時間內會發生擺動。CABasicAnimation與IOS 5和RemoteIO的滯後問題
這完全在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,它沒有任何區別。如果我真的很快地按下大量的音符,整個應用程序就會暫停,然後一秒鐘左右它就會跟上它自己,突然間所有的聲音都會播放,並且動畫終於開始全部斷斷續續,然後戛然而止。
有誰知道iOS 5中的CABasicAnimation有什麼不尋常的問題嗎?有沒有其他的動畫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的變化有關嗎?這是干擾主線程還是反過來呢?
UIView動畫是否適用於CALayers?我試圖寫我自己的代碼,並嘗試使用從這裏頂部的答案:http://stackoverflow.com/questions/929364/how-to-create-iphones-wobbling-icon-effect但都具有相同的效果,似乎忽略這些函數只是運行在它通過它的代碼(因此只運行一次)中。fret.fretLayer.transform = CATransform3DMakeRotation(-0.2,0.0,1.0,2.0) 代碼。 從我發佈的鏈接的頂部答案似乎使用CGAffineTransform而不是CATransform3D,但我似乎不能將CGAffineTransform直接應用於CALayers? 有什麼想法?(ps.thanks) – chopsalot 2012-01-14 19:41:11