Я пытаюсь написать небольшое приложение, где на главном экране я оживляю летающий «пузырь».Эта анимация должна быть непрерывной.(Я снова использую пузырьки, которые вылетают из экрана) Я слышал, что анимации должны запускаться в основном потоке, как и каждая операция, которая изменяет пользовательский интерфейс.Это правда?Когда я пытаюсь показать UIAlertView на этом экране, его анимация становится очень дискурсивной из-за непрерывной пузырьковой анимации.(это пользовательский просмотр предупреждений с индикатором). Это устройство iPhone 4, поэтому я не думаю, что показывать нормальный UIAlertView должно быть проблемой.
И я хотел бы спросить, использую ли я правильный метод для анимации пузырей.Итак, прежде всего, я использую NSTimer, который вызывает метод startAnimation
каждые 0,01 секунды (я запускаю его в методе viewDidAppear:
контроллера).В методе startAnimation
сначала я генерирую пузырьки со случайными координатами x и y (чтобы увидеть пузырьки на экране сразу после появления), и я генерирую пузырьки внизу со случайными координатами x и y = 460.В методе startAnimation я запускаю счетчик (называемый кадрами), а когда значение этого счетчика равно 35, я снова вызываю метод создания пузырьков.
Проблема:
Я сохраняю сгенерированные пузыри в массиве, а «пропавшие» пузыри (которые находятся вне экрана) в другом массиве.Сначала я пытаюсь повторно использовать пузыри в массиве исчезнувших пузырьков, затем, если массив исчерпан, я генерирую новые пузыри.Пока эта операция обрабатывается, непрерывная анимация останавливается, а затем продолжается.Перерыв составляет около одной секунды, но это очень тревожно.Кто-нибудь может помочь в этой проблеме?Спасибо за совет, madik
- (void)viewDidAppear {
.
timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(startAnimation) userInfo:nil repeats:YES];
.
}
- (void)startAnimation {
self.current = [NSDate timeIntervalSinceReferenceDate];
double diff = (self.start - self.current);
if ( diff < 0 ) {
diff = (-1) * diff;
}
self.start = self.current;
frames++;
if ( shouldMoveBubbles ) {
[mug moveBubbles:diff];
}
if ( frames == 35 ) {
DebugLog(@"################################################################");
DebugLog(@"####################### FRAME = 35 ###########################");
DebugLog(@"################################################################");
[mug createNewBubbleOnTheBottomOfView:self.view];
frames = 0;
}
}
В классе Mug:
- (void)moveBubbles:(double)millisElapsed {
for (Bubble *bubble in bubbles) {
int bubbleSpeed = bubble.speed;
float deltaX = (float)(bubbleSpeed * -degrees_sinus * millisElapsed * 100);
float deltaY = (float)(bubbleSpeed * -degrees_cosinus * millisElapsed);
DebugLog(@"movebubbles x: %f, y:%f, speed: %d, sin:%f, cos:%f", deltaX, deltaY, bubbleSpeed, degrees_sinus, degrees_cosinus);
[bubble moveBubbleX:deltaX Y:deltaY];
}
}
И в классе Bubble:
- (void)moveBubbleX:(float)deltaX Y:(float)deltaY {
self.bubbleImage.center = CGPointMake(self.bubbleImage.center.x + deltaX, self.bubbleImage.center.y + deltaY);
}