我遇到了Autolayout和子类UIButton的问题。在我的UIButton子类中,我重写isEnabled以在启用按钮时添加颜色动画。见下文。
// Within my subclassed button:
override var isEnabled:Bool {
didSet {
UIChanges.colorButton(buttonToFade: self)
}
}
// colorButton to be called from UIChanges:
static func colorButton(buttonToFade:UIView) {
let colorAnimation = CABasicAnimation(keyPath: "backgroundColor")
colorAnimation.duration = 1
colorAnimation.fromValue = UIColor.black.cgColor
colorAnimation.toValue = UIColor.white.cgColor
colorAnimation.repeatCount = 10
colorAnimation.autoreverses = true
buttonToFade.layer.add(colorAnimation, forKey: nil)
}
问题是,这个动画永远不会发生。
如果启用了这个colorButton()动画,如何才能将它添加到子类按钮?
我认为这与autolayout有关,因为如果我将该函数放在layoutSubviews中,它可以正常工作。
编辑:我向View Controller添加了一个新按钮,手动将子类按钮更改为启用,以及@JD。答案工作正常(CABasicAnimation激发)。但是,如果未按下测试仪按钮,则不会触发CABasicAnimation。我试图调整的这个按钮主要在AppDelegate中启用 - 所以这可能是导致问题的原因吗?当按钮设置为启用时,未加载按钮框架? Autolayout问题?
尝试在UIView或CALayer Extension中添加动画代码,然后从自定义UIButton调用函数。
class CustomButton: UIButton {
override var isEnabled:Bool {
didSet {
if isEnabled {
setTitle("Enable", for: .normal)
layer.colorButton()
} else {
setTitle("Disable", for: .normal)
layer.removeAllAnimations()
}
}
}
}
extension CALayer {
func colorButton() {
let colorAnimation = CABasicAnimation(keyPath: "backgroundColor")
colorAnimation.duration = 1
colorAnimation.fromValue = UIColor.black.cgColor
colorAnimation.toValue = UIColor.white.cgColor
colorAnimation.repeatCount = 10
colorAnimation.autoreverses = true
add(colorAnimation, forKey: nil)
}
}