如何同时为 UIButton 的 titleLabel 的框架和 alpha 设置动画?
Posted
技术标签:
【中文标题】如何同时为 UIButton 的 titleLabel 的框架和 alpha 设置动画?【英文标题】:How can I animate the frame and alpha of a UIButton's titleLabel simultaneously? 【发布时间】:2018-01-16 17:39:23 【问题描述】:我想为我的UIButton
的titleLabel
的宽度和alpha 设置动画。 alpha 动画应在 1 秒后开始。
我正在尝试使用 Core Animation:
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
中,但没有任何改变。我想同时运行这些动画,因此我不能使用完成块。
感谢您的建议。
【问题讨论】:
【参考方案1】: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)
【讨论】:
【参考方案2】:您也可以通过将按钮的宽度约束挂钩为 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)
【讨论】:
以上是关于如何同时为 UIButton 的 titleLabel 的框架和 alpha 设置动画?的主要内容,如果未能解决你的问题,请参考以下文章
如何在保持图像纵横比的同时调整 UIButton 中的图像大小?
在 UIButton 上同时显示图像和标题 - Swift 3
如何在按住手指的同时从使用一个 UIButton 切换到另一个?