我在界面构建器中构建了一个 UIStackView
,当它的 axis
属性从 vertical
更改为 horizontal
super View 从纵向旋转为横向。问题是,这会导致两个排列的 subview 的动画,其中一个 View 在过渡到新位置时与另一个 View 重叠。
就我而言,我只想删除特定的动画并立即强制 View 到达其结束位置。
我尝试从 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 及其 subview /arrangedSubviews 上的 animationKeys
返回 nil
。
class StackView : UIStackView {
override var axis: UILayoutConstraintAxis {
didSet { /* here */ }
}
}
最佳答案
我认为这将具有挑战性。有一个很好的演示,说明您正在尝试做什么 over here如果它显示的轴动画是您想要摆脱的内容,那么很确定它超出了 UIStackView
设计空间。
非常确定“立即强制 View 到其最终位置”的最佳解决方案实际上是为每个轴提供一个 UIStackView 并在旋转时在它们之间移动内容。
您还可以尝试在 viewWillTransition(to:with:)
中放置一个 performWithoutAnimation
block ,在完成时调用 updateConstraintsIfNeeded
?也许那会起作用。不过,我会选择双 View 的想法,而不是那样!
关于swift - 无法从 `UIStackView` 中删除轴动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43165601/