如何使用Core Animation在iPhone上的2个图像之间交叉淡入淡出

wil*_*lc2 44 iphone core-animation

我这样做是为了学习如何使用iPhone上的Core Animation动画属性(不学习如何交叉淡化图像本身).

在SO上阅读类似的问题让我相信它可以通过动画UIImageView .contents属性来完成,如下所示:

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"];
Run Code Online (Sandbox Code Playgroud)

我是否弄错了细节或者这是不可能的.

更新:上面的代码生成一个空白的UIImageView.当我更改此行时:

self.imageView.layer.contents = image2.CGImage;
Run Code Online (Sandbox Code Playgroud)

...我现在可以看到图像,但它不会淡入,只会立即出现.

Gle*_*Low 78

你快到了.

CABasicAnimation *crossFade = [CABasicAnimation animationWithKeyPath:@"contents"];
crossFade.duration = 5.0;
crossFade.fromValue = image1.CGImage;
crossFade.toValue = image2.CGImage;
[self.imageView.layer addAnimation:crossFade forKey:@"animateContents"];
Run Code Online (Sandbox Code Playgroud)

请注意,动画独立于UIImageView的实际值/内容.所以你需要

self.imageView.image = image2;
Run Code Online (Sandbox Code Playgroud)

...设置图像的最终结果.

  • .fromValue和.toValue期望指向Objective-C对象的指针,而不是像CGImageRef那样指向CFType的指针.因此你可以这样做:crossFade.fromValue =(id)(image1.CGImage); crossFade.toValue =(id)(image2.CGImage); (2认同)

mal*_*974 62

我在某个地方发现了它 - 效果很好.

迅速

UIView.transition(with: imageView, duration: 0.33, options: .transitionCrossDissolve, animations: {
      imageView.image = image
}, completion: nil)
Run Code Online (Sandbox Code Playgroud)

Objc

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


amo*_*sel 20

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.add(animation, forKey: "ImageFade")
        self.image = image
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 两个图像的比较可能非常昂贵,我不建议将两个图像转换为PNG,只是为了比较它们是否相同. (3认同)