macos - Cocoa 中的容器 View ,在运行时交换内容并保留大小

标签 macos cocoa nsview

我的 View Controller 有一个 NSView,我将其用作容器 View 。 我从库中拖动了“容器 View ”,删除了 segue 和嵌入式 View Controller ,向 super View ( View Controller 的主视图)添加了约束,并在 View Controller 的代码中设置了容器 View 的导出。

到目前为止一切顺利。

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

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

    containerView.addSubview(viewController.view)
}

这是可行的,但是一旦我调整窗口大小, subview 显然会保持其原始大小(我没有设置任何约束)。

如果我添加必要的约束:

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

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

如何做到这一点?

最佳答案

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

    newView.translatesAutoresizingMaskIntoConstraints = false

我不清楚为什么我需要这个,因为我想要添加的 subview 属于从 Storyboard创建的 View Controller (并且这些应该已经>不将自动调整大小掩码转换为约束...?);仅当以编程方式创建的 View 需要此代码...

关于macos - Cocoa 中的容器 View ,在运行时交换内容并保留大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45727897/

相关文章:

objective-c - 从未调用过 CoreAudio AudioQueue 回调函数,没有报错

objective-c - 核心情节: how to remove CPTGraph padding?

xcode - 如何为 Mac OS 编写互联网帐户插件?

objective-c - NSMenuItem 的自定义 View

cocoa - needsDisplay 触发无限 drawRect 循环

swift - 根据最大的 subview 使用自动布局调整 super View 的大小

swift - 如何刷新弹出窗口

ios - CGPattern 绘制不是从所需的点开始

macos - Git instaweb : The browser is not available

xcode - 切换到另一个自定义 View