在我的自定义表格视图单元格中,我有4个带动画的按钮(如下所示)。问题是当我使用UIButton
时,动画没有按照我的意愿动画。但是当我使用UIView
时,它的工作方式与我想要的完全一样。
代码完全相同,只是使用不同类型UIView
的差异。
此动画使用 UIButton
:
此动画使用 UIView
为了使事情变得更清楚,我在代码中唯一替换的是:
// Test with Buttons
let button1 = Button() // Subclass of UIButton
let button2 = Button()
// Test with UIViews
let button1 = UIView()
let button2 = UIView()
问题:
有人可以告诉我为什么UIButton
与普通UIView
相比表现不同?
最初我认为不发布代码,我可以让问题更容易阅读,因为两个测试都使用完全相同的代码(“元素”除外(元素为UIView
或UIButton
),并认为问题可能在于“元素”之间的区别。我现在意识到这是我的错误。
我的代码:
class CustomView: UIView {
private var base: [NSLayoutConstraint] = []
private var open: [NSLayoutConstraint] = []
var buttons: [UIView] = []
private var active = false
override init(frame: CGRect) {
super.init(frame: frame)
let button1 = CustomButton(frame: CGRectZero, color: UIColor.yellowColor().CGColor)
let button2 = CustomButton(frame: CGRectZero, color: UIColor.redColor().CGColor)
// let button1 = UIView(); button1.backgroundColor = UIColor.yellowColor()
// let button2 = UIView(); button2.backgroundColor = UIColor.redColor()
let views = ["button1": button1, "button2": button2]
buttons = [button1, button2]
buttons.enumerate().forEach {
$0.element.translatesAutoresizingMaskIntoConstraints = false
addSubview($0.element)
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[button\($0.index + 1)]|", options: [], metrics: nil, views: views))
base += [NSLayoutConstraint(item: $0.element, attribute: .Width , relatedBy: .Equal, toItem: buttons.first!, attribute: .Width , multiplier: 1, constant: 0)]
}
open += [NSLayoutConstraint(item: buttons.last!, attribute: .Width, relatedBy: .Equal, toItem: buttons.first!, attribute: .Width, multiplier: 0.33, constant: 0)]
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[button1]-0.5-[button2]|", options: [], metrics: nil, views: views))
addConstraints(base)
backgroundColor = .blackColor()
clipsToBounds = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func changeState() {
removeConstraints(active ? open : base); addConstraints(active ? base : open)
active = !active
UIView.animateWithDuration(0.5, animations: { self.layoutIfNeeded() })
}
}
解决方案:
发布代码并意外更改按钮的背景颜色后,我注意到它的行为相应。这让我意识到我在按钮中使用CAShapeLayer
导致第一个动画中出现的行为。现在我知道要修复什么。如果此帖子应该被关闭或删除,请告诉我。然后我会删除答案。感谢那些试图帮助的人!
答案 0 :(得分:0)
如果没有你提供更多详细信息,我唯一能做的就是猜测你正在目睹的行为归结为按钮不那么紧张"弹性"而不是观点,因为他们有一个自然的"尺寸由其内容(标题和/或图像)决定,自动布局非常喜欢强制执行自然尺寸(正如您从IB的警告中看到的那样)。
如果您需要更多帮助,请提供更多详细信息。你真的在使用自动布局吗?有什么限制?你在做什么动画?等