不需要动画的 addArrangedSubview

14

我向 TZStackView(基本上与UIStackView相同,但具备旧版本的回退功能)添加视图的代码如下:

stackView.addArrangedSubview(subview)

stackViewsubview都是动态大小的(自动布局),并且可以调整自己的大小。但是,这种调整是通过动画实现的(我认为是由于addArrangedSubview引起的,如果我将其作为子视图添加并设置约束,则不会发生这种情况)。有没有一种方法可以停用这些动画?


你尝试过使用UIView的performWithoutAnimation:块吗? - titaniumdecoy
抱歉,我看到了performWithAnimation,但我甚至不知道performWithoutAnimation的存在,但不幸的是它并不起作用。 - Daniel
它确实有效。请将其写为答案,以便我可以接受它;)非常感谢,我一整天都在寻找有效的东西:) - Daniel
@simpleBob,最终我就是这样做的,而且它起作用了!如果没有看到你的帖子,我不会解决它。谢谢! - yeesterbunny
@Daniel,你在代码块中加入了 stackView.layoutIfNeeded() 或者你的 stack view 的 superview layoutIfNeeded() 吗?我的一个子视图仍在动画中。 - Clay Ellis
显示剩余5条评论
2个回答

28

禁用动画时向UIStackView添加排列视图在iOS 9中无法正常工作。

解决方案是将添加操作与布局分开执行:

// Add all views first.

for view in views {
    stackView.addArrangedSubview(view)
}

// Now force the layout in one hit, sans animation.

UIView.performWithoutAnimation {
    stackView.setNeedsLayout()
    stackView.layoutIfNeeded()
}

在iOS 9.3和Xcode 8.3.2上进行了测试。尚未在iOS 10或11上进行测试。


来自 @mrfonda 的消息:已在iOS11,Xcode 9.0 (9A235)上进行了测试 - Daniel
升级到iOS11后,我的应用程序开始动画。这段代码帮助我防止了不必要的动画。Xcode 9.0.1(9A1004) - neoneye
stackView.addArrangedSubview(button01) stackView.insertArrangedSubview(button02, at: 0)UIView.performWithoutAnimation { self.view.layoutIfNeeded() }在iOS 11和12中测试通过,对我有用。 - Jasmin
对于2023年...情况再次发生了变化,我发现在某些情况下,performWithoutAnimation“确实起作用” - 也就是说,将所有插入操作都包裹在一个performWithoutAnimation中。 - undefined

12

UIView performWithoutAnimation:会在没有动画的情况下执行其块参数:

UIView.performWithoutAnimation {
    stackView.addArrangedSubview(subview)
}

2
这在Xcode 8.3.2和iOS 9.3中不起作用。无论您在何处添加“performWithoutAnimation”调用,仍会发生某些动画。它只是改变了动画的性质。我认为这是一个错误和错误特性的API。请查看新答案以获取iOS 9中的解决方案。 - Womble
@Womble,如果你还在的话,“情况再次发生变化,我发现在某些情况下,performWithoutAnimation确实有效” - 也就是说,将所有插入操作都包裹在一个performWithoutAnimation中。另外,我为你出色的回答发送了一份赏金,谢谢!:) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接