2011-01-04 3 views
1

У меня есть контроллер, который добавляет в качестве подзадач пользовательский класс UIView под названием Circle. Назовем конкретный экземпляр Circle, «круг».Как проверить, закончится ли анимация, если анимационный блок равен

У меня есть метод в Circle, animateExpand, который расширяет круг, оживляя вид.

В следующем коде (который живет в контроллере) Я хочу alloc и init круг, добавить его в NSMutableArray circleArray, анимировать расширение, и в конце расширения, я хочу, чтобы удалить объект из массив. Моя попытка:

Circle *circle = [[Circle alloc] init]; 
[circleArray addObject:circle]; 
[circle animateExpand]; 
[circleArray removeObjectIdenticalTo:circle]; 
[circle release]; 

Проблема заключается в том [circleArray removeObjectIdenticalTo:circle]; вызывается до анимации отделки. Предположительно, потому что анимация выполняется на отдельной ветке. Я не могу выполнить удаление в completion:^(BOOL finished){ }, потому что класс Circle не знает о circleArray.

Любые решения были бы полезны, спасибо!

ответ

4

Try:

Circle *circle = [[Circle alloc] init]; 
if (circle) { 
    [circleArray addObject: circle]; 

    [UIView 
     animateWithDuration: 1.0 // or whatever 
     animations:^{ 
      // the animations in -animateExpand "belong to" this outer animation block 
      [circle animateExpand]; 
     } 
     completion:^(BOOL finished) { 
      [circleArray removeObjectIdenticalTo: circle]; 
     }]; 

    [circle release]; 
} 
+0

примечание: этот большой материал блока - только iOS4.x! –

+0

Я вижу, что это сработает. За исключением случаев, когда я делаю это, я мог бы переместить весь код анимации в контроллер ... – bogardon

+0

Материал 'circleArray' не является частью интерфейса класса« Circle », поэтому (как вы сказали в своем вопросе) нет никакого способа, чтобы последний знал о первом. Вы можете изменить 'Circle', чтобы принять аргумент блока, который затем переходит к его внутреннему вызову' animateWithDuration: animations: completion: ', но это общее решение для того, что вы хотите сделать. :) –

0

Если я не ошибаюсь, нет никакого способа просто остановить текущий вид анимации. Однако, если новая анимация применяется к представлению, она остановит текущий запуск. В этом случае, прежде чем удалять свой круг, вы можете начать очень короткий цикл анимации (скажем, 0,1 сек), что мало что делает. А затем выполните удаление.

Смежные вопросы