如何在CATransition中改变视图淡化的颜色

问题描述 投票:2回答:2

我正在实现一个自定义的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)

一切都按照预期的方式运行,但正在被替换的视图会发生什么是有趣的。它会逐渐消失为黑色,这会在我的新视图完全动画化之前产生令人讨厌的黑色闪光。

如下图所示,我的新视图越接近完全动画,旧视图变得越暗。在视图完全转换之前,它会达到全黑。

enter image description here

ios swift animation presentviewcontroller
2个回答
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)


}

0
投票

由于CATransition的默认功能,它正在讨价还价。您需要更改窗口的颜色以避免这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.