2009-10-03 4 views
1

Я хотел бы иметь вложенную анимацию для моего представления.UIView iPhone SDK вложенные анимации

У меня есть один анимационный селектор стоп который вызывается просто отлично:

[UIView setAnimationDidStopSelector:@selector(growAnimationDidStop1:finished:context:)]; 

Однако внутри этого селектора я хочу сделать больше анимации и когда сделали еще один селектор будет называться:

- (void)growAnimationDidStop1:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
... 
    [UIView setAnimationDidStopSelector:@selector(growAnimationDidStop2:finished:context:)]; 
... 

    [UIView commitAnimations]; 
} 

Проблема в том, что growAnimationDidStop2 никогда не вызывается. Почему это?

ответ

1

Упс, сам это ответил. Я должен был начать новый контекст анимации в методе первой остановки

3

Вы также можете сделать это с помощью blocks, и Apple теперь рекомендует это. Рассмотрим следующий, как псевдо-код:

[UIView animateWithDuration:0.3 
         delay:0.0 
         options:UIViewAnimationCurveEaseInOut 
        animations:^{ 
        [self doAnimationOne]; 
        } completion:^(BOOL finished){ 
        [UIView animateWithDuration:0.4 
              delay:0.0 
             options:UIViewAnimationCurveEaseInOut 
             animations:^{ 
             [self doAnimationNine]; 
             } 
             completion:^(BOOL finished) { 
             [UIView animateWithDuration:0.3 
                   delay:0.0 
                  options:UIViewAnimationCurveEaseInOut 
                 animations:^{ 
                  [self doAnimationFive]; 
                 } 
                 completion:^(BOOL finished) {}]; 
             }]; 
        }]; 

Это также хорошая практика для анимации, чтобы быть «социальной», например сделать:

BOOL userInteractionEnabled = [self isUserInteractionEnabled]; 
[self setUserInteractionEnabled:NO]; 

BOOL animationsEnabled = [UIView areAnimationsEnabled]; 
[UIView setAnimationsEnabled:YES]; 

перед началом анимации, а затем в окончательном завершении блок do:

[UIView setAnimationsEnabled:animationsEnabled]; 
[self setUserInteractionEnabled:userInteractionEnabled]; 
+3

Просто хотел, чтобы добавить комментарий. [UIView animateWithDuration] автоматически отключает взаимодействие пользователя во время анимации. Чтобы включить взаимодействие во время анимации, вам необходимо передать UIViewAnimationOptionAllowUserInteraction в качестве параметров анимации. –

1

Лучший способ сделать несколько анимаций в последовательности - это очередь блоков.

Посмотрите, как чистый результат:

NSMutableArray* animationBlocks = [NSMutableArray new]; 

typedef void(^animationBlock)(BOOL); 

// getNextAnimation 
// removes the first block in the queue and returns it 
animationBlock (^getNextAnimation)() = ^{ 
    animationBlock block = (animationBlock)[animationBlocks firstObject]; 
    if (block){ 
     [animationBlocks removeObjectAtIndex:0]; 
     return block; 
    }else{ 
     return ^(BOOL finished){}; 
    } 
}; 

//add a block to our queue 
[animationBlocks addObject:^(BOOL finished){; 
    [UIView animateWithDuration:1.0 animations:^{ 
     //...animation code... 
    } completion: getNextAnimation()]; 
}]; 

//add a block to our queue 
[animationBlocks addObject:^(BOOL finished){; 
    [UIView animateWithDuration:1.0 animations:^{ 
     //...animation code... 
    } completion: getNextAnimation()]; 
}]; 

//add a block to our queue 
[animationBlocks addObject:^(BOOL finished){; 
    NSLog(@"Multi-step Animation Complete!"); 
}]; 

// execute the first block in the queue 
getNextAnimation()(YES); 

Взято из: http://xibxor.com/objective-c/uiview-animation-without-nested-hell/

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