Подтвердить что ты не робот

Как перефразировать 2 изображения на iPhone с помощью Core Animation

Я делаю это, чтобы узнать, как работать с анимированными свойствами Core Animation на iPhone (не узнать, как перекрестно сфотографировать изображения, как таковые).

Чтение подобных вопросов на SO приводит меня к мысли, что это можно сделать, анимируя свойство .contents уровня UIImageView , например:

UIImage *image1 = [UIImage imageNamed:@"someImage1.png"];
UIImage *image2 = [UIImage imageNamed:@"someImage2.png"];

self.imageView.image = image1;
[self.view addSubview:self.imageView];

CABasicAnimation *crossFade = [CABasicAnimation animationWithKeyPath:@"contents"];
crossFade.duration = 5.0;
self.imageView.layer.contents = image2;
[self.imageView.layer addAnimation:crossFade forKey:@"animateContents"];

Я получил деталь неправильно или это невозможно.

Обновление: приведенный выше код создает пустой UIImageView. Когда я меняю эту строку:

self.imageView.layer.contents = image2.CGImage;

... Теперь я вижу изображение, но оно не исчезает, оно просто появляется мгновенно.

4b9b3361

Ответ 1

Ты был почти там.

CABasicAnimation *crossFade = [CABasicAnimation animationWithKeyPath:@"contents"];
crossFade.duration = 5.0;
crossFade.fromValue = image1.CGImage;
crossFade.toValue = image2.CGImage;
[self.imageView.layer addAnimation:crossFade forKey:@"animateContents"];

Обратите внимание, что анимация не зависит от фактических значений/содержимого UIImageView. Поэтому вам нужно

self.imageView.image = image2;

..., чтобы установить окончательный результат для вашего изображения.

Ответ 2

Я нашел это где-то - он отлично работает.

UIImage * toImage = [UIImage imageNamed:@"image.png"];
[UIView transitionWithView:self.view
                  duration:0.33f
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                    self.imageview.image = toImage;
                } completion:NULL];

Ответ 3

extension UIImageView
{
    func mySetImage(image:UIImage)
    {
        guard let currentImage = self.image where currentImage != image else { return }
        let animation = CATransition()
        animation.duration = 0.3
        animation.type = kCATransitionFade
        layer.addAnimation(animation, forKey: "ImageFade")
        self.image = image
    }
}

Ответ 4

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.navigationController.navigationBarHidden=false;
UIImage *img=[UIImage imageNamed:@"images.jpeg"];
imgview=[[UIImageView alloc]init];
imgview.frame=CGRectMake(30,90, img.size.width, img.size.height);
[self.view addSubview:imgview];
[self animateImages];
}
- (void)animateImages
{
static int count = 0;
NSArray *animationImages = @[[UIImage imageNamed:@"images.jpeg"], [UIImage imageNamed:@"images (1).jpeg"]];
UIImage *image = [animationImages objectAtIndex:(count % [animationImages count])];

[UIView transitionWithView:imgview
                  duration:2.0f // animation duration
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                    imgview.image = image;
                } completion:^(BOOL finished) {
                    [self animateImages];
                    count++;
                }];

}

Ответ 5

Решение в быстрой

let image1:UIImage = UIImage(named: "someImage1")!;
let image2:UIImage = UIImage(named: "someImage2")!;
let crossFade:CABasicAnimation = CABasicAnimation(keyPath: "contents");
crossFade.duration = 5.0;
crossFade.fromValue = image1.CGImage;
crossFade.toValue = image2.CGImage;
imageView.layer.addAnimation(crossFade, forKey:"animateContents");

Ответ 6

Мое предложение состояло в том, чтобы просто использовать два UIImageView поверх друг друга. На вершине есть изображение1, а внизу - изображение2:

- (void) crossfade {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:.5];
    imageView1.alpha = !imageView1.alpha;
    [UIView commitAnimations];
}

Это будет исчезать между двумя изображениями, когда вы его вызываете. Если вы хотите просто сделать одно затухание и удалить первое изображение после завершения:

- (void) crossfade {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:.5];
    [UIView setAnimationDelegate:imageView1];
    [UIView setAnimationDidStopSelector:@selector(removeFromSuperview)];
    imageView1.alpha = 0
    [UIView commitAnimations];
}

Edit:

Если вы ищете причину, по которой ваш код не работает, это потому, что вы просто устанавливаете свойство для нового изображения, а затем добавляете бесполезную анимацию. CABasicAnimation имеет параметры fromValue и toValue, которые необходимо установить, затем добавьте эту анимацию к слою, и она должна сделать анимацию. Не устанавливайте содержимое вручную.