更改UIImageView图像时淡化/溶解

Jos*_*ane 158 cocoa-touch objective-c uiimageview ios swift

而不是创建两个UIImageViews,简单地改变image一个视图似乎是合乎逻辑的.如果我这样做,那么两个图像之间是否有淡入淡出/交叉消解而不是即时切换?

alg*_*gal 575

使用新的基于块的UIKit动画方法可以更加简单.

假设以下代码在视图控制器中,并且您想要交叉解散的UIImageView是self.view的子视图,可通过self.imageView属性进行寻址.那你需要的只是:

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

完成.

要在Swift中实现它,就像这样:

let toImage = UIImage(named:"myname.png")
UIView.transitionWithView(self.imageView,
                          duration:5,
                          options: UIViewAnimationOptions.TransitionCrossDissolve,
                          animations: { self.imageView.image = toImage },
                          completion: nil)
Run Code Online (Sandbox Code Playgroud)

Swift 3.0

 let toImage = UIImage(named:"myname.png")
 UIView.transition(with: self.imageView,
                   duration: 0.3,
                   options: .transitionCrossDissolve,
                   animations: {
                       self.imageView.image = toImage
                   },
                   completion: nil)
Run Code Online (Sandbox Code Playgroud)

  • @ user577888只是一件小事.您应该将nil传递给空完成块.块不是函数指针(由^表示)并且像objective-c对象一样操作.如果传递NULL,编译器会将其解释为0或(void*)0.如果由于某种原因,transitionWithView的基础代码:...意外地将消息发送到完成块(例如[完成副本])而不检查其有效性,这将导致错误.因此,在将块设置为空时,应始终使用objective-c的nil. (7认同)
  • 其他答案是正确的但过时的(和/或过于冗长). (3认同)
  • 没有必要在超级视图上进行转换.我设法通过将UIImageView本身指定为目标来完成这项工作. (3认同)
  • @ Mr.T NULL和nil的值相同.两者都被定义为0,并且两者都不可能改变.因此,在任何地方使用NULL都是安全的,或者可以使用nil. (3认同)

Mir*_*les 45

编辑:下面的@algal有一个更好的解决方案.

另一种方法是使用预定义的CAAnimation过渡:

CATransition *transition = [CATransition animation];
transition.duration = 0.25;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionFade;
transition.delegate = self;
[self.view.layer addAnimation:transition forKey:nil];
view1.hidden = YES;
view2.hidden = NO;
Run Code Online (Sandbox Code Playgroud)

请参阅Apple的View Transitions示例项目:https://developer.apple.com/library/content/samplecode/ViewTransitions/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007411


Sou*_*ean 7

对于Swift 3.0.1:

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

参考:https://gist.github.com/licvido/bc22343cacfa3a8ccf88


Sri*_*aju 6

是的,你说的是绝对正确的,这就是它的方法.我写了这个方法并总是使用它来淡入我的图像.我CALayer为此付出了代价.您需要为此导入Core Animation.

+ (void)fadeInLayer:(CALayer *)l
{
    CABasicAnimation *fadeInAnimate   = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeInAnimate.duration            = 0.5;
    fadeInAnimate.repeatCount         = 1;
    fadeInAnimate.autoreverses        = NO;
    fadeInAnimate.fromValue           = [NSNumber numberWithFloat:0.0];
    fadeInAnimate.toValue             = [NSNumber numberWithFloat:1.0];
    fadeInAnimate.removedOnCompletion = YES;
    [l addAnimation:fadeInAnimate forKey:@"animateOpacity"];
    return;
}
Run Code Online (Sandbox Code Playgroud)

你可以做相反的淡出图像.它淡出后.你只需从superview(即UIImageView)中删除它.[imageView removeFromSuperview].