Cocoa中的容器视图,运行时交换内容和保留大小

时间:2017-08-17 06:21:42

标签: macos cocoa nsview

我的视图控制器有一个我用作容器视图的NSView。 我拖着#34;容器视图"从库中删除了segue和嵌入式视图控制器,为superview添加了约束(视图控制器的主视图),并在视图控制器的代码中设置了容器视图的出口。

到目前为止一切顺利。

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

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

...现在,窗口无法调整大小! (它停留在子视图的初始大小)。

这样做的方法是什么?

1 个答案:

答案 0 :(得分:1)

事实证明,我需要做的就是在设置约束之前添加这一行:

    newView.translatesAutoresizingMaskIntoConstraints = false

我不清楚为什么我需要这个,因为我要添加的子视图属于从故事板创建的视图控制器(并且那些应该已经将自动调整掩码转换为约束......?);只有在以编程方式创建的视图时才需要此代码...