如何在 CATransition 中更改视图淡入淡出的颜色

Posted

技术标签:

【中文标题】如何在 CATransition 中更改视图淡入淡出的颜色【英文标题】:How to change color of view fade in CATransition 【发布时间】:2015-11-01 06:04:55 【问题描述】:

我正在实现一个自定义 CATransition,因此我可以从左侧或右侧而不是底部呈现 ViewController,但我遇到了一个有趣的问题,即 CATransition 的作用。

这是我的代码:

let transition:CATransition = CATransition()
transition.duration = 2

transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault)
transition.type = kCATransitionMoveIn
transition.subtype = kCATransitionFromLeft
self.view.window?.layer.addAnimation(transition, forKey: nil)

对于正在呈现的视图,一切都按预期工作,但被替换的视图发生了什么是有趣的。它慢慢变黑,在我的新视图完全动画化之前产生了令人讨厌的黑色闪光。

如下图所示,我的新视图越接近完全动画化,旧视图就越暗。它在视图完全过渡之前达到全黑。

【问题讨论】:

为什么要为 Window 设置动画?为什么不对 self.View.Layer 设置动画。 【参考方案1】:

您可以直接传输view.layer并更改窗口颜色。

 @IBAction func test(_ sender: Any)

let transition:CATransition = CATransition()
transition.duration = 2

transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.default)
transition.type = CATransitionType.moveIn
transition.subtype = CATransitionSubtype.fromLeft

self.view.window?.backgroundColor = UIColor.red
self.view.layer.add(transition, forKey: nil)


如果您希望颜色不闪烁,只需将两个目标颜色设置为相同的值即可:

    let transition:CATransition = CATransition()
    transition.duration = 2

    transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.default)
    transition.type = CATransitionType.moveIn
    transition.subtype = CATransitionSubtype.fromLeft

    self.view.window?.backgroundColor = UIColor.green
    self.view.layer.backgroundColor = UIColor.green.cgColor
    self.view.layer.add(transition, forKey: nil)


您甚至可以添加自定义动画来获得所需的颜色过渡。

    @IBAction func test(_ sender: Any)

    let transition:CATransition = CATransition()
    transition.duration = 2

    transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.default)
    transition.type = CATransitionType.moveIn
    transition.subtype = CATransitionSubtype.fromLeft

 let colorAnimation = CABasicAnimation.init(keyPath: "backgroundColor")
 colorAnimation.duration = 1.5
 colorAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.default)
colorAnimation.toValue = UIColor.black.cgColor
colorAnimation.fromValue = UIColor.red.cgColor



 self.view.window?.backgroundColor = UIColor.red
self.view.layer.backgroundColor = UIColor.white.cgColor
self.view.window?.layer.add(colorAnimation , forKey: nil)
self.view.layer.add(transition, forKey: nil)



【讨论】:

【参考方案2】:

由于 CATransition 的默认功能,它正在发生。你需要改变窗口的颜色来避免这种情况。

【讨论】:

以上是关于如何在 CATransition 中更改视图淡入淡出的颜色的主要内容,如果未能解决你的问题,请参考以下文章

使用 CATransition 同时动画两个子视图的过渡

是否可以禁用 CATransition 的背景淡入淡出?

在 iOS 中使用过滤器的 CATransition

在设备方向更改时交叉淡入某些 UIView

CATransition 提前推送过渡替换内容

SwiftUI - 使用淡入淡出动画更改文本