UIImage view анимирует переход от одного изображения к следующему

#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. Большое спасибо. Это действительно подтолкнуло меня вперед.