将CABasicAnimation添加到子类UIButton - 如果已启用

问题描述 投票:0回答:1

我遇到了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问题?

swift uibutton autolayout subclass cabasicanimation
1个回答
0
投票

尝试在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)
    }
}

enter image description here

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