如何同时对 UIButton 的 titleLabel 的帧和 alpha 进行动画处理?



我想对UIButton titleLabel的宽度和阿尔法进行动画处理。Alpha 动画应在 1 秒后开始。
我正在尝试使用核心动画来做到这一点:

    let animSize = CAKeyframeAnimation(keyPath: "bounds")
    animSize.values = [btn1.layer.frame,CGRect(origin: btn1.layer.frame.origin, size: CGSize(width: 300, height: btn1.layer.frame.height))]
    animSize.duration = 3
    animSize.isRemovedOnCompletion = false
    animSize.fillMode = kCAFillModeForwards
    btn1.layer.add(animSize, forKey: "bounds")
    let animAlpha = CABasicAnimation(keyPath: "opacity")
    animAlpha.fromValue = 0.0
    animAlpha.toValue = 1.0
    animAlpha.timeOffset = 1.0
    animAlpha.isRemovedOnCompletion = false
    animAlpha.fillMode = kCAFillModeForwards
    btn1.titleLabel?.layer.add(animAlpha, forKey: "opacity")
当我单独运行动画时,

一切都在工作,但是当我一起运行它们时,只有第一个动画("边界"(在评估。我知道我可以用UIView.animat e做到这一点,但在这种情况下,我将失去"延迟"选项。我也尝试将这些动画放在CAAnimationGroup但没有任何变化。我想同时运行这些动画,因此我无法使用完成块。

谢谢你的任何建议。

您不会丢失带有UIView.animate的"延迟"选项。您可以使用两个动画块来实现相同的结果:

UIView.animate(withDuration: 3) {
    btn1.frame = CGRect(origin: btn1.frame.origin, size: CGSize(width: 300, height: btn1.frame.height))
}
UIView.animate(withDuration: 2, delay: 1, options: [], animations: {
    btn1.alpha = 1
}, completion: nil)

您也可以尝试使用自动布局,将按钮的宽度约束挂钩为 IBOutlet

 btn1.withCon.constant = 300 
 UIView.animate(withDuration: 3) {
    self.view.layoutIfNeeded()
}
UIView.animate(withDuration: 2, delay: 1, options: [], animations: {
    btn1.alpha = 1
}, completion: nil)

最新更新