在可可中的容器视图,在运行时交换内容并保留大小

问题描述:

我的视图控制器有一个NSView,我用它作为容器视图。 我从库中拖动了“容器视图”,删除了Segue和嵌入视图控制器,向超视图(视图控制器的主视图)添加了约束,并在视图控制器的代码中为容器视图设置了一个出口。在可可中的容器视图,在运行时交换内容并保留大小

到目前为止这么好。

我希望将容器视图的内容与运行时确定的几个不同视图控制器的主视图交换。我已经成功地这样做,有这样的代码:

func swapContainerViewContents(with viewController: NSViewController) { 
    self.containerView.subviews.foreach({ subview in 
     subview.removeFromSuperview() 
    }) 

    containerView.addSubview(viewController.view) 
} 

这工作,但只要我调整窗口的大小,子视图明显停留在原来的大小(我没有设置任何限制) 。

相反,如果我添加了必要的约束:

let newView = viewController.view 

containerView.addSubview(newView) 

newView.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true 
newView.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true 
newView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true 
newView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true 

...现在,窗口不能调整大小! (它被卡在子视图的初始大小)。

这样做的方法是什么?

事实证明,所有我需要做的是建立约束我之前加入这一行:

newView.translatesAutoresizingMaskIntoConstraints = false 

这是我不明白为什么我应该需要这个,因为子视图我想添加属于从故事板创建的视图控制器(和那些应该已经不是翻译自动调整大小的面具成约束......?);此代码应该只需要以编程方式创建的视图...