Дискурсивная анимация UIAlertView при непрерывной анимации? - PullRequest
0 голосов
/ 11 августа 2011

Я пытаюсь написать небольшое приложение, где на главном экране я оживляю летающий «пузырь».Эта анимация должна быть непрерывной.(Я снова использую пузырьки, которые вылетают из экрана) Я слышал, что анимации должны запускаться в основном потоке, как и каждая операция, которая изменяет пользовательский интерфейс.Это правда?Когда я пытаюсь показать 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);
}

1 Ответ

2 голосов
/ 11 августа 2011

Это похоже на проблему с памятью. Медленная анимация UIAlertView - верный признак этого.Похоже, то, как вы генерируете пузыри, вызывает проблему.Вы упомянули, что вы держите два массива пузырьков.Вы никогда не скажете, если ограничите количество пузырьков, которые могут быть в любом массиве одновременно.Вы также не упоминаете, когда вы убираете эти пузыри.Звучит как память "черная дыра".Я бы рекомендовал установить максимальное количество пузырьков, которые вы можете показать на экране одновременно.

Кроме того, вы упомянули пользовательский вид оповещения.Если вы изменяете UIAlertView, вы столкнетесь с проблемами, поскольку это официально не поддерживается.Кроме того, я видел, что анимация UIAlertView стала медленной, когда не хватает памяти.Если вы решите проблемы с памятью своими пузырями, вы, вероятно, решите и это тоже.

Наконец, несколько советов.Создание анимированной игры в UIKit, вероятно, не очень хорошая идея.NSTimers не так точны, как многие хотели бы думать.UIImages относительно дороги в загрузке.Известно, что в худшем случае касание движущихся кнопок ненадежно, а в лучшем случае хакерское.Я предлагаю изучить игровые рамки, такие как Cocos2d-iphone .

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...