使用自动布局为动画准备视图

Posted

技术标签:

【中文标题】使用自动布局为动画准备视图【英文标题】:Prepare views for animations, using Autolayout 【发布时间】:2014-11-30 19:09:47 【问题描述】:

我目前正在开发一个应用程序,我想在页面上添加一个动画:视图控制器 1。在这个视图控制器 1 中,我添加了一个容器:容器 1。这个容器在视图时应该超出框架将出现并在用户操作后变为可见。

这就是我在故事板中的视图控制器 1 的样子:

因为我使用的是自动布局,所以我想在视图控制器 1 出现时使用约束来隐藏容器 1。因此,我将容器 1 的约束 Top 连接到我的视图控制器 1 类。

我的第一个问题 - 内部问题

在这个类和方法viewWillLayoutSubviews中,我把这个约束的常量改成了容器1的-height:

override func viewWillLayoutSubviews() 
        self.container1TopLayout.constant = -self.container1.frame.height
    

我还添加了一个带有其操作的按钮:showContainer

func showContainer()
        self.container1TopLayout.constant = 0
        UIView.animateWithDuration(1.0, animations:  () -> Void in
            self.newCustomServiceContainer.layoutIfNeeded()
        )
    

在这种方法中,我将常量更改为零。但是视图没有显示。

第二个问题 - 正常工作

如果在我的故事板中,我将容器 1 的位置更改为在用户点击操作按钮之前已经在框架之外。当用户点击按钮时,容器 1 正确显示;我用了同样的方法showContainer

你能告诉我,我在第一期做错了什么吗?也许我不应该在 viewWillLayoutSubviews 中设置常量?

提前谢谢你

【问题讨论】:

【参考方案1】:

就我而言,我这样做:

override func viewDidLoad()

   prepareContainer()


override func viewDidAppear(animated: Bool)

   showContainer()

【讨论】:

以上是关于使用自动布局为动画准备视图的主要内容,如果未能解决你的问题,请参考以下文章

uiscrollview的自动布局,视图层次结构没有为约束做好准备

使用NSView.layoutSubtreeIfNeeded()动画自动布局约束不适用于macOS High Sierra

使用自动布局时使用 UIDynamicAnimator 制作动画

自动布局动画保持 UILabel 居中

如何使用自动布局动画视图更改视图层次结构?

在使用自动布局下动画/移动视图