无法从“UIStackView”中删除轴动画

Posted

技术标签:

【中文标题】无法从“UIStackView”中删除轴动画【英文标题】:Unable to remove axis animation from `UIStackView` 【发布时间】:2017-04-02 07:11:18 【问题描述】:

我有一个UIStackView 内置界面构建器,当它的超级视图从纵向旋转到横向时,它会将其axis 属性从vertical 更改为horizontal。问题是这会导致它的两个排列的子视图的动画,其中一个视图在转换到新位置时与另一个视图重叠。

在我的情况下,我只想删除那个特定的动画并立即将视图强制到它的结束位置。

我试图从我的 VC 中的 stackview 层中删除所有动画:

public override func willTransition(to newCollection: UITraitCollection,
                                    with coordinator: UIViewControllerTransitionCoordinator) 

    coordinator.animate(alongsideTransition: 
        _ in
        // The first subview is `UIStackView`           
        self.view.subviews[0].layer.removeAllAnimations()
    )

    super.willTransition(to: newCollection, with: coordinator)

axis 属性发生更改时,我观察到动画键,因为这似乎发生在过渡期间的某个地方(由界面构建器自动设置)。不幸的是,我没有运气,因为该层在 stackview 及其子视图/arrangedSubviews 上为 animationKeys 返回 nil

class StackView : UIStackView 

    override var axis: UILayoutConstraintAxis 

        didSet  /* here */ 
    

【问题讨论】:

【参考方案1】:

我认为这将具有挑战性。如果它显示的轴动画是你想要摆脱的东西,那么有一个很好的演示,它听起来像是你正在尝试做的 over here,很确定这超出了 UIStackView 设计空间。

非常确定“立即将视图强制到其结束位置”的最佳解决方案实际上是每个轴都有一个 UIStackView 并在旋转时在它们之间移动内容。

您还可以尝试在您的viewWillTransition(to:with:) 中放置一个performWithoutAnimation 块,在完成时调用updateConstraintsIfNeeded?也许那会奏效。不过,我会采用双视图的想法而不是那样!

【讨论】:

以上是关于无法从“UIStackView”中删除轴动画的主要内容,如果未能解决你的问题,请参考以下文章

自定义“添加”视图动画到 uistackview

UIStackView 隐藏视图动画

使用 isHidden 的 UIStackView 动画

在 iOS 9 上更改隐藏属性时 UIStackView 不会动画

UIStackView 中的 CABasicAnimation 不可靠?

取消隐藏 UIStackView 元素时的动画方向