我一直在创建自己的UIControl子类以用于调整iDunnoU。除扩展/折叠动画外,我已经完成了UIControl。此动画的问题在于,展开/折叠时,它会“跳下” /上跳,而不是像我的原始模型一样平滑散开(请参阅下文)。
我已将代码上传到GitHub存储库,找到here。可以找到用于将控件添加到超级视图的代码here,可以找到用于设置高度约束的代码here,可以找到用于对高度约束进行动画处理的代码here。
[UIView.animate()
可能有点棘手-您需要在正确的视图上调用.layoutIfNeeded()
。
用此替换isExpanded / didSet
类中的iDUMenuButton
:
var isExpanded = false {
didSet {
if isExpanded != oldValue {
if isExpanded {
becomeFirstResponder()
let haptics = UIImpactFeedbackGenerator(style: .rigid)
haptics.impactOccurred()
}
guard let sv = self.superview else {
// shouldn't happen, but let's be thorough
fatalError("Self must have a superview!!!")
}
// not needed
//self.layoutIfNeeded()
UIView.animate(withDuration: 0.3) {
self.heightConstraint.isActive = !self.isExpanded
// call .layoutIfNeeded() on self's superview
//self.layoutIfNeeded()
sv.layoutIfNeeded()
self.layer.shadowOpacity = self.isExpanded ? 1 : 0
self.buttons.forEach { $0.setBadgeHidden(hidden: !self.isExpanded, animated: true) }
}
delegate?.menuButton(self, isExpandedDidUpdate: isExpanded)
}
}
}