在处理这个问题时,我注意到CATransition
中CATransitionType
的fade
可能不工作或损坏。其余的CATransitionType
:moveIn
、push
、reveal
工作正常。
我正在使用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.animate
和alpha
来改变不透明度。
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)
}
}
但是,CATransitionType
型fade
坏了吗?还是我做错了什么?
您必须做一些事情来更改层。。。
例如,要淡出/淡入,我们可以这样做:
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)
}
}