如何动画UIImageView中的图像变化?

don*_*ile 180 iphone animation uiimageview uiimage ios

我有一个带图像的UIImageView.现在我有一个全新的图像(图形文件),并希望在这个UIImageView中显示它.如果我只是设置

myImageView.image = newImage;
Run Code Online (Sandbox Code Playgroud)

新图像立即可见.不可动画.

我希望它能很好地淡出新图像.我想也许有更好的解决方案,而不仅仅是创建一个新的UIImageView并与动画混合?

Ilk*_*aci 364

[UIView transitionWithView:textFieldimageView
                  duration:0.2f
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                    imageView.image = newImage;
                } completion:nil];
Run Code Online (Sandbox Code Playgroud)

是另一种可能性


Vla*_*mir 254

我不确定你是否可以使用淡入淡出效果来动画UIViews,因为它似乎所有支持的视图过渡都在UIViewAnimationTransition枚举中定义.使用CoreAnimation可以实现褪色效果.此方法的示例示例:

#import <QuartzCore/QuartzCore.h>
...
imageView.image = [UIImage imageNamed:(i % 2) ? @"3.jpg" : @"4.jpg"];

CATransition *transition = [CATransition animation];
transition.duration = 1.0f;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionFade;

[imageView.layer addAnimation:transition forKey:nil];
Run Code Online (Sandbox Code Playgroud)

  • 从一个图像到另一个图像时,您的代码工作正常.你知道如何在UIImageView(animationImages属性)中使用图像的自动动画吗? (2认同)
  • 这绝对比手动交叉淡化单独的图像视图更简单.谢谢! (2认同)

Zia*_*Zia 134

用迈克尔斯科特的话说,保持简单愚蠢.这是在Swift 3Swift 4中执行此操作的简单方法:

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

  • 奇迹般有效。谢谢! (4认同)
  • 呜呜太棒了!这么久了都不知道这个该死的:) (2认同)
  • 这将更改为 1 张图像。如果我有一组图像并想用过渡动画逐一显示怎么办? (2认同)
  • 您可以使用完成块过渡到下一个。 (2认同)

Zor*_*ayr 41

以下是Swift中的一个示例,它将首先交叉解散新图像,然后添加一个有弹性的动画:

var selected: Bool {
  willSet(selected) {
    let expandTransform:CGAffineTransform = CGAffineTransformMakeScale(1.15, 1.15);
    if (!self.selected && selected) {
      UIView.transitionWithView(self.imageView,
        duration:0.1,
        options: UIViewAnimationOptions.TransitionCrossDissolve,
        animations: {
          self.imageView.image = SNStockCellSelectionAccessoryViewImage(selected)
          self.imageView.transform = expandTransform
        },
        completion: {(finished: Bool) in
          UIView.animateWithDuration(0.4,
            delay:0.0,
            usingSpringWithDamping:0.40,
            initialSpringVelocity:0.2,
            options:UIViewAnimationOptions.CurveEaseOut,
            animations: {
              self.imageView.transform = CGAffineTransformInvert(expandTransform)
            }, completion:nil)
      })
    }
  }
}

var imageView:UIImageView
Run Code Online (Sandbox Code Playgroud)

如果imageView被正确地添加到视图作为一个子视图,之间切换selected = falseselected = true应该交换图像与弹性的动画.SNStockCellSelectionAccessoryViewImage只根据当前选择状态返回不同的图像,如下所示:

private let SNStockCellSelectionAccessoryViewPlusIconSelected:UIImage = UIImage(named:"PlusIconSelected")!
private let SNStockCellSelectionAccessoryViewPlusIcon:UIImage = UIImage(named:"PlusIcon")!

private func SNStockCellSelectionAccessoryViewImage(selected:Bool) -> UIImage {
  return selected ? SNStockCellSelectionAccessoryViewPlusIconSelected : SNStockCellSelectionAccessoryViewPlusIcon
}
Run Code Online (Sandbox Code Playgroud)

下面的GIF示例有点慢,实际动画发生得更快:

                                       UIImageView弹跳动画Gif


J-D*_*zle 15

码:

var fadeAnim:CABasicAnimation = CABasicAnimation(keyPath: "contents");

fadeAnim.fromValue = firstImage;
fadeAnim.toValue   = secondImage;
fadeAnim.duration  = 0.8;         //smoothest value

imageView.layer.addAnimation(fadeAnim, forKey: "contents");

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

例:

代码中的UIImageView示例

有趣,更详细的解决方案 :( 在水龙头上切换)

    let fadeAnim:CABasicAnimation = CABasicAnimation(keyPath: "contents");

    switch imageView.image {
        case firstImage?:
            fadeAnim.fromValue = firstImage;
            fadeAnim.toValue   = secondImage;
            imageView.image    = secondImage;
        default:
            fadeAnim.fromValue = secondImage;
            fadeAnim.toValue   = firstImage;
            imageView.image    = firstImage;
    }

    fadeAnim.duration = 0.8;

    imageView.layer.addAnimation(fadeAnim, forKey: "contents");
Run Code Online (Sandbox Code Playgroud)


Li *_*Jin 14

斯威夫特 5扩展:

extension UIImageView{
    func setImage(_ image: UIImage?, animated: Bool = true) {
        let duration = animated ? 0.3 : 0.0
        UIView.transition(with: self, duration: duration, options: .transitionCrossDissolve, animations: {
            self.image = image
        }, completion: nil)
    }
}
 
Run Code Online (Sandbox Code Playgroud)


Pet*_*ger 10

试试这个:

_imageView.image = image;
[_imageView.layer addAnimation:[CATransition animation] forKey:kCATransition];
Run Code Online (Sandbox Code Playgroud)


小智 7

使用Swift 3

extension UIImageView{   
 var imageWithFade:UIImage?{
        get{
            return self.image
        }
        set{
            UIView.transition(with: self,
                              duration: 0.5, options: .transitionCrossDissolve, animations: {
                                self.image = newValue
            }, completion: nil)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

myImageView.imageWithFade = myImage
Run Code Online (Sandbox Code Playgroud)


kas*_*kad 5

CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"contents"];
fadeAnim.fromValue = (__bridge id)imageView.image.CGImage;
fadeAnim.toValue = (__bridge id)[UIImage imageNamed:@"newImage.png"].CGImage;
fadeAnim.duration = 2.0;
[imageView.layer addAnimation:fadeAnim forKey:@"contents"];
imageView.layer.contents = (__bridge id)[UIImage imageNamed:@"newImage.png"].CGImage;
Run Code Online (Sandbox Code Playgroud)


Wil*_* Hu 5

为什么不尝试这个.

NSArray *animationFrames = [NSArray arrayWithObjects:
  [UIImage imageWithName:@"image1.png"],
  [UIImage imageWithName:@"image2.png"], 
  nil];

UIImageView *animatedImageView = [[UIImageView alloc] init];
animatedImageView.animationImages = animationsFrame;
[animatedImageView setAnimationRepeatCount:1];
[animatedImageView startAnimating];
Run Code Online (Sandbox Code Playgroud)

一个快速的版本:

let animationsFrames = [UIImage(named: "image1.png"), UIImage(named: "image2.png")]
let animatedImageView = UIImageView()
animatedImageView.animationImages = animationsFrames
animatedImageView.animationRepeatCount = 1
animatedImageView.startAnimating()
Run Code Online (Sandbox Code Playgroud)


Gur*_*ngh 5

Swift 4这真是太棒了

  self.imgViewPreview.transform = CGAffineTransform(scaleX: 0, y: 0)
          UIView.animate(withDuration: 1, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0, options: .curveEaseOut, animations: {
              self.imgViewPreview.image = newImage
              self.imgViewPreview.transform = .identity
          }, completion: nil)
Run Code Online (Sandbox Code Playgroud)