高度约束动画“跳跃”

Posted

技术标签:

【中文标题】高度约束动画“跳跃”【英文标题】:Height constraint animation 'jumping' 【发布时间】:2020-04-28 19:38:36 【问题描述】:

我一直在创建自己的 UIControl 子类,用于我的调整 iDunnoU。我已经完成了 UIControl,但展开/折叠动画除外。这个动画的问题是它在展开/折叠时会向下/向上“跳跃”,而不是像我原来的模型那样平滑地展开(见下文)。

我已将代码上传到 GitHub 存储库,找到 here。将控件添加到superview的代码可以找到here,设置高度约束的代码可以找到here,动画高度约束的代码可以找到here。

【问题讨论】:

【参考方案1】:

UIView.animate() 可能有点棘手——您需要在正确的视图上调用 .layoutIfNeeded()

iDUMenuButton 类中的isExpanded / didSet 替换为:

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)
        
    

【讨论】:

谢谢!我已经被这个问题困扰了一段时间,所以我真的很高兴它被修复了!

以上是关于高度约束动画“跳跃”的主要内容,如果未能解决你的问题,请参考以下文章

高度约束动画“跳跃”

约束动画之前的跳跃图像

自定尺寸单元格高度变化导致跳跃动画

动画 UIView 大小跳跃

收缩高度约束动画问题

动画 UIImageView 高度约束空白