我想让一个按钮在按下时变成一个圆,然后能够让按钮回到它的原始状态。这是我当前的动画,正如你所看到的,我已经完成了一半。
正如你所看到的,我在这里遇到了很多问题,首先,当我设置新的约束时,X约束不会将圆放置在父视图的中间,然后我最初的想法是,当我调用reset函数时,我也会传递视图的原始约束,但这并不起作用。
我的想法是,当我使用它的时候,我会放一个UIView,然后把按钮放在那个视图里面,这样我就可以操纵它的约束。如果我把一个按钮放在一个UIStackView里,情况也是这样。
这是我的代码,任何输入都很棒
extension UIButton {
func animateWhileAwaitingResponse(showLoading: Bool, originalConstraints: [NSLayoutConstraint]) {
let spinner = UIActivityIndicatorView()
let constraints = [
NSLayoutConstraint(item: self, attribute: .centerX, relatedBy: .equal, toItem: self.superview, attribute: .centerX, multiplier: 1, constant: 0),
NSLayoutConstraint(item: self, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .width, multiplier: 1, constant: 45),
NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: 45),
NSLayoutConstraint(item: self, attribute: .top, relatedBy: .equal, toItem: self.superview, attribute: .top, multiplier: 1, constant: 4),
NSLayoutConstraint(item: self, attribute: .bottom, relatedBy: .equal, toItem: self.superview, attribute: .bottom, multiplier: 1, constant: 8),
NSLayoutConstraint(item: spinner, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 1, constant: 0),
NSLayoutConstraint(item: spinner, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0),
NSLayoutConstraint(item: spinner, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: 45),
NSLayoutConstraint(item: spinner, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .width, multiplier: 1, constant: 45)
]
if showLoading {
NSLayoutConstraint.deactivate(self.constraints)
self.translatesAutoresizingMaskIntoConstraints = false
spinner.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(spinner)
self.superview?.addConstraints(constraints)
spinner.color = .white
spinner.startAnimating()
UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseInOut, animations: {
self.setTitleColor(.clear, for: .normal)
self.layer.cornerRadius = 22.5
self.layoutIfNeeded()
}, completion: nil)
} else {
UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseInOut, animations: {
NSLayoutConstraint.deactivate(self.constraints)
self.setTitleColor(.white, for: .normal)
self.superview?.addConstraints(originalConstraints)
NSLayoutConstraint.activate(originalConstraints)
self.layer.cornerRadius = 0
for subview in self.subviews where subview is UIActivityIndicatorView {
subview.removeFromSuperview()
}
self.layoutIfNeeded()
}, completion: nil)
}
}
}
4条答案
按热度按时间mu0hgdu01#
我已经更新了你的按钮扩展代码如下,这是添加和删除动画约束。
我已将以下约束添加到按钮:
此外,添加了要从super中删除的按钮宽度约束的标识符,这将从原始约束中添加运行时。
然后,我通过宽度约束的出口,以编程方式更改按钮的宽度:
内部
viewDidLoad
方法其中40是前导空格和尾随空格之和。
按钮点击
btnAnimationConstraints
是NSLayoutConstraint
数组,如下所示:因此,我只是在
viewDidAppear
方法中分配按钮的所有约束,如下所示:希望这对你有帮助。
ymdaylpp2#
我注意到您在第一个动画中设置了
self.translatesAutoresizingMaskIntoConstraints = false
,但在第二个动画中没有将其设置回true
。这可能是问题的根源:你需要在第二个动画中设置
self.translatesAutoresizingMaskIntoConstraints = true
。如果您在Interface Builder(或最初创建按钮的任何地方)中禁用
translatesAutoresizingMaskIntoConstraints
,并使用法线约束进行所有布局,可能会减少混淆。mm5n2pyu3#
我正在更新代码,以设置动态按钮高度,并根据按钮父高度管理圆圈。
button.frame.height
形成一个圆。
}
disbfnqx4#
所以我做了一些修改,它非常适合我。我在界面生成器中为按钮设置了基本约束。