ios - 高度约束动画 'jumping'

标签 ios swift autolayout uicontrol

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

我已将代码上传到 GitHub 存储库,发现 here .将控件添加到superview的代码可以找到here ,设置高度约束的代码可见here ,并且可以找到用于动画高度约束的代码 here .

Mockup
iDunnoUMenuButton

最佳答案

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

更换您的 isExpanded / didSetiDUMenuButton用这个上课:

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)
        }
    }
}

关于ios - 高度约束动画 'jumping',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61488581/

相关文章:

android - 如何使用不同的屏幕分辨率

android - flutter geolocator 在 iOS 上使用时返回 null

swift - 'UnsafeMutableRawPointer' 的初始化导致悬空指针

ios - 在 Xcode 中构建时添加变量

swift - 使用 Swift、自动布局和 SnapKit 自动缩放带有 UIImageView 的 UIScrollView 内容

ios 从代码中将 uiview 的约束添加到 uiscrollview

ios - 当 SuperViews 约束更改时更新 subview 约束

ios - 无法在现有的 Xcode 项目中安装 cocoaPods

ios - swift POST 请求不向服务器发送数据

ios - getPlaceholderTemplateForComplication() 方法何时被调用?