在 Cocoa App Swift [Mac OS] 中显示在 containerView 内的 NSViewController 不会与 Container 的边界对齐

Posted

技术标签:

【中文标题】在 Cocoa App Swift [Mac OS] 中显示在 containerView 内的 NSViewController 不会与 Container 的边界对齐【英文标题】:NSViewController displayed inside a containerView doesn't align itself to the bounds of the Container in Cocoa App Swift [Mac OS ] 【发布时间】:2019-05-13 06:10:05 【问题描述】:

带有容器视图的NSViewcontroller的代码

@IBOutlet weak var cv: NSView!
override func viewDidLoad() 
    super.viewDidLoad()
      let vc2 = storyboard?.instantiateController(withIdentifier: "vc2") as! VC2
    addChild(vc2)
    vc2.view.frame=cv.bounds
    cv.addSubview(vc2.view)
    cv.wantsLayer=true
    cv.layer?.backgroundColor=NSColor.red.cgColor


要在容器视图中显示的 NSViewController 的代码

   override func viewDidLoad() 
    super.viewDidLoad()
    self.view.wantsLayer=true
    self.view.layer?.backgroundColor=NSColor.white.cgColor


我添加了白色层以更好地描述我的问题

我已经在情节提要中正确设置了容器视图的约束,并检查了容器视图是否占据了整个 ViewController。

为什么我的 viewController 只设置为容器视图的一部分而不是全部?

ContainerView 边界控制台图像

您的简历和完整窗口的初始大小为 480*270。那时,您的 vc2 大小也是正确的。但后来我调整了你的整个窗口的大小。 cv 会调整大小,但 vc2 不会。

【问题讨论】:

什么是容器视图边界?可以用一些红色为容器视图着色以更好地可视化吗? 尝试一次viewdid出现 @kerry 改成红色以便更好理解,请立即查看 @Anbu.Karthik 为什么 viewdidappear 兄弟它显示正确 好的,这就是我从您的评论中了解到的。您的简历和完整窗口的初始大小为 480*270。那时,您的 vc2 大小也是正确的。但是随后您调整了整个窗口的大小。您的 cv 调整大小,但不是您的 vc2。对吗? 【参考方案1】:

问题在于,当您使用约束时,它们会随着布局的变化而调整大小。但是在 vc2 中,您在一开始就给它一个恒定的大小。这就是为什么即使您调整窗口大小,它也不会调整大小。尝试以编程方式将约束分配给 vc2.view 以将其附加到其父视图 (cv)。这将确保 vc2.view 将使用 cv 调整大小。

确保在cv.addSubview(vc2.view)之后分配约束。

查看this library,它将在创建约束时删除大量样板代码。

【讨论】:

【参考方案2】:

如果您希望在调整 NSViewController(MainViewController) 的大小时调整容器视图的大小,则只需将容器视图添加到主 NSViewcontroller,如屏幕截图所示

为您的容器视图提供以下 AutoLayout 约束: Leading , tralling ,Top , Bottom 约束到超级视图

最后将你的 vc2 连接到容器视图就可以了。

现在,当您调整 MainViewcontroller 的大小时,您的容器视图会自动调整大小。无需在 MainViewController 中为容器视图编写代码。

【讨论】:

我需要以编程方式将视图控制器嵌入到容器视图中,而不是使用情节提要。

以上是关于在 Cocoa App Swift [Mac OS] 中显示在 containerView 内的 NSViewController 不会与 Container 的边界对齐的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cocoa 和 CGDisplayCreateImageForRect 在 Mac OS X 中截取区域截图?

在 Swift、Cocoa、Mac OSX 中将 EXIF 数据设置为 NSImage

我如何在 Mac OS X 上判断我是不是安装了 Carbon 或 Cocoa 版本的 Qt?

如何修改 Mac OS X Cocoa 布局约束

Mac OS X 上的 Cocoa Websocket 服务器

MAC OS X API知识摘抄