动画 UIView 的子视图在动画期间不保持约束

Posted

技术标签:

【中文标题】动画 UIView 的子视图在动画期间不保持约束【英文标题】:Subviews of animated UIView not keeping their constraints during animation 【发布时间】:2015-10-18 17:11:20 【问题描述】:

我正在为自定义 UIView 设置动画以展开,如下图所示(红色视图)。 单击打开/关闭按钮时,我希望左侧图标垂直保持在其超级视图的中心。如下图,当我点击按钮时,图标会在动画完成后弹出到它应该在的位置。 按钮也是如此,但它不像点击它会暂时隐藏那样明显。

我还希望 UILabel 在两者之间为其大小设置动画,而不是在您单击“关闭”时立即弹出到最小高度。

在情节提要中,我已将图标和按钮设置为与超级视图对齐中心,这对我来说似乎是实现我想要的正确方法。我会假设当我为超级视图设置动画时,子视图将在动画期间保持居中,但它们会立即移动到正确的点,但在动画完成之后。

我的动画代码:

UIView.animateWithDuration(0.4, animations:  () -> Void in

    var rect = self.frame; //The current frame, to change
    let oldHeight = self.frame.size.height as CGFloat

    let newSize = self.sizeForBanner() //Get the CGSize for the big banner.

    if(self.isBig) //Animate to big size
    
        //Put the new height and origin for the large version of the view
        rect.size.height = newSize.height;
        rect.origin.y -= (rect.size.height - oldHeight)

    else //Animate to small size

        //Put the new height and origin for the small version of the view

        rect.size.height = self.minimalHeight;
        rect.origin.y += oldHeight-rect.size.height
    

        //Set the new variables
        self.frame = rect;

    )  (Bool) -> Void in
        //Completion

当超级视图动画时,我如何/如何更改以使图标和按钮保持居中?..

【问题讨论】:

你解决了吗?我也面临同样的问题... @AviTsadok 是的,我想是的!我现在没有代码,但我可以稍后检查,并将其写为答案。我认为这与启用view.clipsToBounds(或它的名称)和其他一些变量有关。并确保您的约束井井有条 @AviTsadok 实际上,我没有那个代码了。我们最终使用了稍微不同的设计,但这并不是因为这个问题。我相当确定我设法通过稍微改变约束和改变一些值来完成这项工作,比如clipsToBounds 等。我记得当我意识到我必须在 superview 中将clipsToBounds 设置为true 而不是实际视图(或相反,或者..某物)。哪个对象具有这些属性很重要,这与我的想法相反。祝你好运,对不起:) 我通过取消选中位于“剪辑子视图”下方的“自动调整子视图”来解决它。有需要的可以试试看。 【参考方案1】:

您需要启用Clip Subviews。这是默认情况下对 UIView 禁用的值。

如果您通过 Interface Builder 创建了视图,请转到 Attributes Inspector 并选中 Clip Subviews 复选框:

如果您通过代码创建视图,则使用:

view.clipsToBounds = true

【讨论】:

以上是关于动画 UIView 的子视图在动画期间不保持约束的主要内容,如果未能解决你的问题,请参考以下文章

为“幻灯片”iOS UIView 设置动画,但关联的子视图不移动

通过其约束为 UIView(包含带约束的子组件)设置动画

动画约束导致不同的初始位置

如何使用自动布局在 UIScrollView 中为视图高度设置动画?

动画 UIView 框架不尊重约束?

UIView 动画块不是动画视图的子视图