CATransition类型的渐变似乎已损坏



在处理这个问题时,我注意到CATransitionCATransitionTypefade可能不工作或损坏。其余的CATransitionType:moveInpushreveal工作正常。

我正在使用iPhone 13,iOS 16.0。

转换代码:

extension CALayer {
func makeFadeTransition() {
let transition = CATransition()
transition.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
transition.duration = 0.5
transition.type = .fade
self.add(transition, forKey: nil)
}
}

用法:

self.customView.layer.makeFadeTransition()

我知道我们可以改用UIView.animatealpha来改变不透明度。

UIView.animate(withDuration: 0.15, animations: {
self.customView.alpha = 0.0
})

或使用CABasicAnimation:

extension CALayer {
func makeFadeTransition() {
let transition = CABasicAnimation(keyPath: "opacity")
transition.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
transition.duration = 0.5
transition.fromValue = 1.0
transition.toValue = 0.0
self.add(transition, forKey: nil)
}
}

但是,CATransitionTypefade坏了吗?还是我做错了什么?

您必须做一些事情来更改层。。。

例如,要淡出/淡入,我们可以这样做:

extension CALayer {
func makeFadeTransition() {
let transition = CATransition()
transition.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
// let's use duration of 2.5 to make it more obvious
transition.duration = 2.5
transition.type = .fade

// change the layer... opacity, backgroundColor, frame, etc

// fade transition doesn't like opacity of 0.0, so we'll use 0.01
self.opacity = self.opacity == 1.0 ? 0.01 : 1.0

// or, for example,
// "shrink" the layer by 20-points
//self.frame = self.frame.insetBy(dx: 20.0, dy: 20.0)

self.add(transition, forKey: nil)

}
}

最新更新