替换视图时可可窗口的大小翻倍

Posted

技术标签:

【中文标题】替换视图时可可窗口的大小翻倍【英文标题】:Cocoa window doubles in size when replacing view 【发布时间】:2017-04-15 17:00:05 【问题描述】:

我试图在运行时用不同的视图替换一个视图(及其 ViewController)。现在,当我这样做时,旧视图会从窗口中消失,但新视图不会出现,并且窗口会变成原来宽度的两倍。 如果我切换到全屏,我可以在应用程序窗口的左下角看到非常小的新视图。

有人知道为什么会这样吗?我已经尝试了好几个小时,但我似乎找不到发生这种情况的原因。

为了替换视图(以及它的 ViewController),我使用以下代码:

func exchangeDiashowViewController(for newDiashowViewController: NSViewController) 
    if let oldDiashowViewControllerAsStateObserver = self.diashowViewController as? DiashowStateObserver 
        DiashowManager.sharedInstance.remove(stateObserver: oldDiashowViewControllerAsStateObserver)
    
    if let oldDiashowViewControllerAsSpeedObserver = self.diashowViewController as? DiashowSpeedObserver 
        DiashowManager.sharedInstance.remove(speedObserver: oldDiashowViewControllerAsSpeedObserver)
    

    if let newDiashowViewControllerAsStateObserver = newDiashowViewController as? DiashowStateObserver 
        DiashowManager.sharedInstance.add(stateObserver: newDiashowViewControllerAsStateObserver)
    
    if let newDiashowViewControllerAsSpeedObserver = newDiashowViewController as? DiashowSpeedObserver 
        DiashowManager.sharedInstance.add(speedObserver: newDiashowViewControllerAsSpeedObserver)
    

    self.view.replaceSubview(self.diashowViewController.view, with: newDiashowViewController.view)
    self.diashowViewController.removeFromParentViewController()
    self.addChildViewController(newDiashowViewController)

    self.diashowViewController = newDiashowViewController

    let centerHorizontallyConstraint = NSLayoutConstraint(item: self.diashowViewController.view, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1.0, constant: 0.0)
    let centerVerticallyConstraint = NSLayoutConstraint(item: self.diashowViewController.view, attribute: .centerY, relatedBy: .equal, toItem: self.view, attribute: .centerY, multiplier: 1.0, constant: 0.0)
    let widthConstraint = NSLayoutConstraint(item: self.diashowViewController.view, attribute: .width, relatedBy: .equal, toItem: self.view, attribute: .width, multiplier: 1.0, constant: 0.0)
    let heightConstraint = NSLayoutConstraint(item: self.diashowViewController.view, attribute: .height, relatedBy: .equal, toItem: self.view, attribute: .height, multiplier: 1.0, constant: 0.0)

    self.view.addConstraints([centerHorizontallyConstraint, centerVerticallyConstraint, widthConstraint, heightConstraint])

我真的希望有人有一个想法。提前非常感谢!

【问题讨论】:

【参考方案1】:

看来self.view.replaceSubview() 是问题所在。

我使用

让一切正常
self.diashowViewController.view.removeFromSuperview()
self.view.addSubview(newDiashowViewController.view)

改为。

【讨论】:

以上是关于替换视图时可可窗口的大小翻倍的主要内容,如果未能解决你的问题,请参考以下文章

在可可触摸中以编程方式将视图位置设置为右上角

在可可中使用绑定时未反映在视图中的更改

显示来自 Xib 的自定义视图

Cocoa 查看自动缩放内容

在 mfc vs2010 运行时替换拆分器窗口中的视图

可重用的.xib + 可可类组件,如何在情节提要中自动调整大小和样式?