Блокировка завершения анимации UIView запускается, когда начинается другая анимация - PullRequest
4 голосов
/ 28 октября 2010

Я использую API блочной базы для своих анимаций на iOS.

Одна анимация имеет блок завершения, и этот блок вызывается в конце анимации, хорошо.

Однако, эта анимация может запускаться несколько раз, когда пользователь прокручивает (анимация на UITableViewCell). Когда это происходит, блок завершения вызывается несколько раз. Параметр finished блока всегда равен YES.

Так как анимация на самом деле не закончена (имела место другая анимация), я думал, что параметр finished будет НЕТ, но это не так.

Я что-то пропустил? Как я могу избежать многократного вызова блока завершения?

Ответы [ 3 ]

5 голосов
/ 02 ноября 2010

Блок завершения вызывается несколько раз просто потому, что в вашем случае ваша анимация запускается несколько раз.Происходит то, что iOS вызывает ваш блок анимации каждый раз, когда об этом говорится, вероятно, в отдельном потоке.Затем для каждой анимации он отслеживает свое завершение и после завершения вызывает соответствующий блок завершения.В общем, вы видите, что ваш блок завершения срабатывает несколько раз, по одному на каждый вызов вашей анимации.Обратите внимание, что логическое значение, связанное с блоком завершения, является специфическим для этого блока завершения, оно никак не относится к другой анимации.

Напомним, то, что вы испытываете, - это просто эффект параллелизма.Если это не ваше предполагаемое поведение, то вам нужно соответствующим образом изменить свой код.Если вы хотите, чтобы ваши анимации запускались по одному, вы можете использовать NSLock (NSConditionLock для расширенного управления с использованием связанной условной переменной) или, если вы предпочитаете, мьютекс и библиотеку Posthreads Posix напрямую, чтобы создать критический раздел для выполнения.взаимоисключающим способом.

2 голосов
/ 03 ноября 2010

Не уверен, когда вы запускаете анимации и не зацикливаетесь ли они (например, вращатель UIActivityView или что-то в этом роде) - похоже, это каждый пиксель, который просматривает таблица?

В любом случае, возможно, вы могли бы использовать методы делегата UIScrollView и указать каждой ячейке запускать анимацию на scrollViewWillBeginDragging: и указать каждой ячейке остановиться на scrollViewDidEndDragging:

Вы можете установить логическое значение isAnimating для вашего UITableViewCell и, если анимация уже выполняется, ничего не делать.

if (isAnimating) {
     // ... do nothing
} else {
     // Start your animation
}

Или придерживайтесь того, что у вас есть сейчас, и используйте логическое значение, но запускайте анимацию, только если она не анимируется. Затем в параметре finished просто установите isAnimating на NO.

if (isAnimating) {
         // ... do nothing
    } else {
         [UIView animateWithDuration:0.3f
                          animations:^{
                                     // animations...
                                     isAnimating = YES;
                                     }
                          completion:^{
                                     isAnimating = NO;
                                     }
          ];    
}
0 голосов
/ 08 ноября 2010

Я решил эту проблему, посмотрев, релевантен ли блок завершения в начале этого блока.

Параметр finished сейчас неактуален.Я общался с Apple, и мне сказали, что это исправлено в iOS 4.2.

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