#iphone #objective-c #animation #uiimageview #uiimage
#iPhone #objective-c #Анимация #uiimageview #uiimage
Вопрос:
Я хочу плавно анимировать изображение в UIImageView, чтобы оно превратилось в следующее в течение одной секунды, как это делает UIModalTransitionStyleCrossDissolve.
В настоящее время у меня есть UIImageView *, называемый «ImageView», и функция, которая называется «imageForState», которая возвращает мне UIImage * для правильного изображения.
Итак, что я хочу сделать, это плавно анимировать изображение A в изображение B, если оно есть.
В настоящее время моя функция такова:
- (UIImage *) imageForState{
NSLog(@"state: %d", [save state]);
switch ([save state]) {
case 0:
case 1:
return [UIImage imageNamed:@"Sakuya_Debug.PNG"];
case 2:
return [UIImage imageNamed:@"Sakuya_2_Debug.PNG"];
default:
return NULL;
//Never called
}
}
-(void) tap{
[imageView setAnimationImages:[NSArray arrayWithObjects:[imageView image], [self imageForState], nil]];
imageView.animationDuration = 2.0;
[imageView startAnimating];
save.state ;
}
Моя проблема в том, что 1.) анимация продолжается вечно (когда я устанавливаю ImageView.animationRepeatCount равным 1, я снова возвращаюсь к первому изображению) и б.) анимация не гладкая; точно так же, как я бы использовал «setImage»;
Что я делаю не так?
Ответ №1:
Я предлагаю сделать это с помощью двух ImageViews и блока анимации. В следующем примере я предполагаю два квадратных изображения с размером 100 пикселей. Если вы добавляете два ImageViews в качестве подвидов, убедитесь, что imageB добавлен после imageA, чтобы он закрывал его.
Инициализируйте ImageViews:
UIImageView *imageA = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Sakuya_Debug.PNG"]];
UIImageView *imageB = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Sakuya_2_Debug.PNG"]];
// hide the second image
imageB.alpha = 0.0;
// put the image with the same size at same position
imageA.frame = CGRectMake(0.0, 0.0, 100.0, 100.0);
imageB.frame = imageA.frame;
Метод наложения:
- (void)crossDissolveImageAtoB
{
[UIView animateWithDuration:1.0
animations:^{
imageB.alpha = 1.0;
}
completion:^(BOOL finished){
// do something after the animation finished,
// maybe releasing imageA if it's not used anymore...
}];
}
Комментарии:
1. Большое спасибо. Это действительно подтолкнуло меня вперед.