Swift:更改初始Frame时如何实现两张图片的交叉溶解动画?
看起来你遇到的问题是因为Frame的修改没和图片过渡动画同步——你之前的代码只在动画闭包里切换了图片,Frame的更改是在动画外部做的,所以Frame瞬间就变了,而图片还在过渡,才会出现初始图保持原尺寸、新图直接用新Frame的情况。
给你两个可行的解决方案:
方案1:用UIView.transition同步更新Frame和图片
直接把Frame修改和图片切换放在同一个动画闭包里,这样两者会同步执行动画:
// 替换成你的imageView实例、目标Frame和目标图片 UIView.transition(with: self.imageView, duration: 10.0, options: [.transitionCrossDissolve, .allowUserInteraction], animations: { self.imageView.frame = newFrame self.imageView.image = newImage }, completion: nil)
这样Frame会平滑过渡到新尺寸,同时图片交叉溶解,整个过程完全同步。
方案2:用CATransition实现更灵活的控制
如果需要更精细的动画参数调整,可以用CATransition,注意要把Frame和图片的修改放在添加动画之后,并且禁用UIKit的隐式动画避免冲突:
let transition = CATransition() transition.duration = 10.0 transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) transition.type = kCATransitionFade // 把过渡动画添加到imageView的layer上 self.imageView.layer.add(transition, forKey: "imageFadeTransition") // 禁用隐式动画,同时修改Frame和图片 UIView.performWithoutAnimation { self.imageView.frame = newFrame self.imageView.image = newImage }
小提示
别忘了检查你的UIImageView的contentMode设置,比如选择.scaleAspectFit或者.scaleToFill,这样图片会自动适配新的Frame尺寸,避免出现拉伸、留白等显示异常。
内容的提问来源于stack exchange,提问作者PAK
相关产品推荐
相关产品推荐

