使用自动布局时,在init上的子视图中查看控制器动画?

时间:2018-01-16 00:42:29

标签: ios swift

我有一个以编程方式制作的视图控制器,其子视图使用约束定位。当我使用导航控制器将此视图控制器推入视图时禁用动画...

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() {

       //  

    }

}

5 个答案:

答案 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()