我有一个以编程方式制作的视图控制器,其子视图使用约束定位。当我使用导航控制器将此视图控制器推入视图时禁用动画...
let viewController = InventoryViewController()
navigationController?.pushViewController(viewController, animated: false)
...视图控制器不会简单地出现在屏幕上,其子视图(具有约束的子视图)向外扩展并进入视图。没有给出约束的子视图只是按预期显示在屏幕上。很明显,自动布局将动画呈现在视图中。如何禁用此动画并将子视图显示在屏幕上?
class InventoryViewController: UIViewController {
override func loadView() {
view = UIView()
view.frame = UIScreen.main.bounds
view.backgroundColor = UIColor.white
addButton()
}
func addButton() {
let button = UIButton()
button.backgroundColor = UIColor.black
button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)
button.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16).isActive = true
button.topAnchor.constraint(equalTo: view.topAnchor, constant: 36).isActive = true
button.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -32).isActive = true
button.heightAnchor.constraint(equalToConstant: 48).isActive = true
}
@objc func buttonAction() {
//
}
}
答案 0 :(得分:4)
推送视图控制器是导致其视图加载的原因。您可以尝试在推送之前强制加载和布局:
let viewController = InventoryViewController()
viewController.view.layoutIfNeeded()
navigationController?.pushViewController(viewController, animated: false)
答案 1 :(得分:3)
loadView()
不是配置子视图的好地方,它应该仅用于将视图放在视图层次结构中,这可能就是您查看动画的原因。
尝试在viewDidLoad()
方法上设置子视图。
请查看官方文档中的讨论部分:https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview
答案 2 :(得分:1)
在viewDidLayoutSubviews
之后从super.viewDidLayoutSubviews
致电您的方法。并且不会看到动画。由于这背后的原因是使用Autolayout,因此在autolayout引擎开始计算时会设置视图的框架。
当autolayout引擎完成计算视图的框架
答案 3 :(得分:1)
使用 UIView.setAnimationsEnabled(假)
答案 4 :(得分:-1)
您在添加的视图上使用layoutIfNeeded(),以立即强制布局/重绘。
在viewDidLoad中执行此操作,或在设置约束后立即尝试。
或尝试:
layoutSubviews()
setNeedsLayout()
layoutSubviews()