animateWithDuration: искажает плавное увеличение индикатора выполнения.

В одном из моих представлений мне нужно анимировать свойство кадра UIImageView, и при этом я хочу показать индикатор выполнения (UIProgressView) в заголовке панели навигации. Проблема заключается в том, что если я прокомментирую следующие блоки анимации, индикатор выполнения обновляется, как и ожидалось, плавно. С другой стороны, из-за следующей анимации индикатор выполнения останавливается в нескольких местах и ​​снова увеличивается.

//add message bubble
[UIView animateWithDuration:0.3
                      delay:0
                    options:UIViewAnimationOptionAllowUserInteraction
                  animations:^
 {
     animationBubbleImageView.alpha = 1;
 }
                 completion:^(BOOL finished)
 {
     [self removeAutoCorrectionAndHighlight];
     [UIView animateWithDuration:0.3
                           delay:0
                         options:UIViewAnimationOptionAllowUserInteraction
                      animations:^
      {
          CGRect bubbleFrame = CGRectMake(animationBubbleImageView.frame.origin.x,
                                          animationBubbleImageView.frame.origin.y,
                                          bubbleSize.width,
                                          bubbleSize.height);

          [animationBubbleImageView setFrame:bubbleFrame];
          messageLabel.alpha = 1;
      }
                      completion:^(BOOL finished)
      {
          [self sendSubviewToBack:textView];
          [self.delegate moveBubbleToTableCell];
      }];
 }];

блоки анимации не блокируют основной поток, но что может быть причиной негладкого отображения прогресса?

ОБНОВЛЕНИЕ: то, чего я хочу добиться, — это анимация пузыря MessagesApp в IOS. Пока напечатанное сообщение становится пузырьком и летит на свое место, индикатор выполнения должен медленно увеличиваться.

Если я попытаюсь сделать то же самое без анимации, индикатор прогресса будет увеличиваться нормально.


person Ilker Baltaci    schedule 28.01.2013    source источник
comment
Просто дикая догадка, причина может заключаться в том, что вы обновляете пользовательский интерфейс не из основного потока.   -  person Cynichniy Bandera    schedule 05.02.2013
comment
Еще одно дикое предположение, но проверяли ли вы, что ни один из ваших кодов в трех методах, которые вы вызываете из этого кода, не блокирует основной поток?   -  person jhilgert00    schedule 06.02.2013
comment
И просто пытаюсь исключить все здесь, но я обычно использую настоящие числа с плавающей запятой в своем коде анимации, то есть 0.0f, а не 0.   -  person jhilgert00    schedule 06.02.2013
comment
Что вы делаете в методах, реализацию которых мы не видим? Можете ли вы попробовать закомментировать методы один за другим и посмотреть, станет ли анимация снова гладкой после удаления определенных строк?   -  person Nate    schedule 08.02.2013
comment
Кроме того, если вы экспериментируете, я бы посмотрел, поможет ли удаление параметра UIViewAnimationOptionAllowUserInteraction или увеличение продолжительности анимации (0,3).   -  person Nate    schedule 08.02.2013


Ответы (2)


Попробуйте поместить анимацию индикатора выполнения в ту же анимацию, что и пузырьковую анимацию. Или поместите их всех в анимационную группу.

person Dad    schedule 07.02.2013
comment
На самом деле это невозможно в этом случае, потому что анимация разделена на две части. Первая часть - это создание пузырька, и индикатор выполнения должен начать увеличиваться там. Когда пузырь готов, он запускает вторую анимацию по методу делегата. .Если бы у меня был весь код в одном классе, он хотел бы, как вы посоветовали - person Ilker Baltaci; 13.02.2013

Вы пробовали инструменты, чтобы увидеть, что происходит?

Дикая догадка: вы также можете проверить, не перекрываются ли два представления случайно.

Если возможно, вы также можете попытаться сгруппировать анимации, как предложил «Папа».

Лучший, Акос

person Ákos    schedule 12.02.2013