как выполнить несколько анимаций подряд на одном и том же UIImageView - PullRequest
1 голос
/ 10 августа 2011

Я хотел бы сделать две анимации, одну за другой:

[UIView beginAnimations:@"growImage" context:nil];
[UIView setAnimationDuration:0.2f];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDelegate:self];
image6.transform = CGAffineTransformMakeScale(0.9, 0.9);
[UIView commitAnimations];

[UIView beginAnimations:@"shrinkImage" context:nil];
[UIView setAnimationDuration:0.5f];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDelegate:self];
image6.transform = CGAffineTransformMakeScale(0.1, 0.1);
[UIView commitAnimations];

Я знаю, что могу сделать вторую анимацию в

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {

или установив

[UIView setAnimationDidStopSelector:@selector(shrinkImage)];

Но есть ли способ, которым я могу передать значение (в данном случае UIIMageView с именем image6), чтобы вторая анимация происходила на том же объекте, что и первый? *

СПАСИБО!

Ответы [ 2 ]

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

Если вы хотите использовать подход на основе селектора, селектор, указанный вами в setAnimationDidStopSelector, получает параметр context, который вы указали в своем вызове beginAnimations:context:.

Итак, если вы измените свой вызов beginAnimations на:

[UIView beginAnimations:@"growImage" context:image6];

затем image6 будет передано в качестве параметра контекста вашему селектору.

Более простым способом было бы использовать блоки для достижения того же:

[UIView animateWithDuration:0.2 animations:^() {
    image6.transform = CGAffineTransformMakeScale(0.9, 0.9);
}
completion:^(BOOL finished) {
    [UIView animateWithDuration:0.2 animations:^() {
        image6.transform = CGAffineTransformMakeScale(0.1, 0.1);
    }];
}];
1 голос
/ 10 августа 2011

Это пример из моего кода.Но ты получил идею.Вам нужно использовать CGAffineTransformConcat, чтобы сшить несколько анимаций вместе.Вы можете сделать это -

   [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:1];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    angle             = 0;
    scaleFactor       = 1;
    startPoint.x      = 60.0;
    startPoint.y      = 60.0;
    CGAffineTransform scaleTrans  = CGAffineTransformMakeScale(scaleFactor, scaleFactor);
    CGAffineTransform rotateTrans = CGAffineTransformMakeRotation(angle * M_PI/180);
    boxView.center    = startPoint;
    boxView.transform = CGAffineTransformConcat(scaleTrans, rotateTrans);
    [UIView commitAnimations];

В iOS4 есть Анимация одного блока , которую вы можете использовать вместо двухблочной анимации.Документация Apple гласит, что анимация в одном блоке более плавная, плюс ее легко сшивать несколько анимаций одну за другой ...

ОБНОВЛЕНИЕ: Подумав более тщательно, вы можете сделать это -

[UIView animateWithDuration:0.3 
                      delay:0 
                    options:UIViewAnimationCurveEaseOut 
                 animations:^{ /* first level of animation */
                 } 
                 completion:^(BOOL finished){
                 }
];

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

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