我在界面构建器中有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及其子视图/ arrangementsSubviews上返回nil
animationKeys
。
class StackView : UIStackView {
override var axis: UILayoutConstraintAxis {
didSet { /* here */ }
}
}
答案 0 :(得分:0)
我认为这将具有挑战性。有一个很好的演示,如果它显示的轴动画是你想要摆脱的,你可以尝试做over here的声音,非常确定它在UIStackView
设计空间之外。
非常确定“立即将视图强制移动到最终位置”的最佳解决方案实际上是每个轴都有一个UIStackView,并在旋转时在它们之间移动内容。
您还可以尝试在完成时调用performWithoutAnimation
的{{1}}中添加viewWillTransition(to:with:)
块?也许这会奏效。我会采用双视图而不是那个!