ios - 具有自动布局和 subview 的 UIView 动画

标签 ios swift autolayout uiviewanimation

我有一个奇怪的问题,似乎很容易解决。我想我可以使用一些解决方法来实现我想要的行为,但我想知道是否有更好的方法。

我有一个名为 contentView 的 View (图中蓝色),它将使用 UIView.animation 扩展其高度,这完全没有问题并且按预期工作。

这里的问题是这个 View 有一个子组件(一个按钮),它的底部有一个自动布局约束等于 22,如下所示:

contentView with the button

这是自动布局约束:

enter image description here

如果我在没有动画的情况下调整高度大小,效果很好, View 高度变化和按钮始终是 contentView 底部的 22 点。但是,当我使用动画使此更改更加流畅和用户友好时,按钮甚至在动画开始之前就移动到结束位置。

enter image description here

我想知道如何在此处实现流畅的动画,但按钮沿其父 View 移动

处理动画的代码部分非常简单,但我会把它贴在这里:

@IBAction func openDetail(_ sender: ExpandCourseDetail) {
        let rotation = sender.getOpen() ? CGAffineTransform.identity : CGAffineTransform(rotationAngle: CGFloat.pi)
        UIView.animate(withDuration: 0.5, delay: 0.1, options: [.curveEaseInOut], animations: {
            sender.transform = rotation
        }, completion: {
            success in
            sender.setOpen(!sender.getOpen())
        })
        UIView.animate(withDuration: 1.0, delay: 0.5, options: [.curveEaseInOut], animations: {
            self.contentView.frame.size.height = sender.getOpen() ? self.contentView.frame.height - 300 : self.contentView.frame.height + 300
        }, completion: nil)
    }

附带说明一下,按钮本身有一个动画,可以将按钮旋转 180 度以向用户显示 View 正在展开。

非常感谢您的帮助。

最佳答案

使用约束非常简单,只需创建一个 superView 高度约束 IBOutlet 并更改其常量值即可。

@IBAction func btnPressed(_ sender: UIButton) {
    self.toggleButton.isSelected = !sender.isSelected

    //Animation starts here
    self.view.layoutIfNeeded()
    UIView.animate(withDuration: 0.7) {

        if self.toggleButton.isSelected {
            //transform button
            self.toggleButton.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi))

            //change your ParentView height to desired one
            self.constContentViewHeight.constant = self.view.frame.size.height - 220
            self.view.layoutIfNeeded()
        } else {

            self.toggleButton.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi*2))
            // Set height constraint to original value
            self.constContentViewHeight.constant = 250
            self.view.layoutIfNeeded()
        }
    }

}

我已经创建了一个演示,请查看。

demo

关于ios - 具有自动布局和 subview 的 UIView 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46317232/

相关文章:

iOS - 使用自动布局设置 UILabel 的最大宽度

ios - canOpenUrl 失败,但 openUrl 成功

swift - Swift中如何将String转为byte?

android - 即使应用程序未在 Cordova 中运行,如何每 5 分钟获取一次地理定位

ios - 更改 TableView 文本标签类型

ios - 检测 UITextField 何时更改而不使用键盘快速

cocoa :分割 View 的奇怪紫色约束

ios - 视觉格式自动布局中的灵活大小元素如何决定使用哪个谓词

ios - NavigationBar barTintColor 显示相同颜色的不同效果

ios - 将 iPhone 音频从蓝牙输入路由到默认输出(非蓝牙)