Objective c 如何强制NSSplitView的所有子视图在启动时可见?

Objective c 如何强制NSSplitView的所有子视图在启动时可见?,objective-c,macos,cocoa,nssplitview,Objective C,Macos,Cocoa,Nssplitview,我完全以编程的方式制作UI。(没有IB)我制作了一个NSWindow,并附加了一个NSSplitView。问题是,当程序启动时窗口出现时,拆分视图的第一个子视图总是会折叠 如何在启动时强制显示分割视图的所有子视图?这种问题很难证明原因,因为它需要了解封闭源代码程序的内部结构 所以原因未知,但在添加子视图之前,当我将NSSplitView的初始大小设置为非零值时,会显示子视图 NSSplitView* v = [[NSSplitView alloc] init]; NSView* v2

我完全以编程的方式制作UI。(没有IB)我制作了一个NSWindow,并附加了一个NSSplitView。问题是,当程序启动时窗口出现时,拆分视图的第一个子视图总是会折叠


如何在启动时强制显示分割视图的所有子视图?

这种问题很难证明原因,因为它需要了解封闭源代码程序的内部结构

所以原因未知,但在添加子视图之前,当我将
NSSplitView
的初始大小设置为非零值时,会显示子视图

NSSplitView* v  = [[NSSplitView alloc] init];
NSView*      v2 = [[NSView alloc] init];
v.frame  = NSRectFromCGRect(CGRectMake(0,0,100,100));  // Added this line.
v2.frame = NSRectFromCGRect(CGRectMake(0,0,50,100));  // Added this line.
[v addSubview:v2];  // And then, add subview. 
我猜
NSSplitView
根据其当前可用大小有一些内部子视图布局行为。据我观察,

  • 将子视图添加到零大小的
    NSSplitView
    无法正常工作
更新 从OSX10.10开始,Cocoa引入了一个新类
NSSplitViewController
,它工作得很好。我强烈建议使用这个。它完全基于自动布局,因此需要使用自动布局约束来设置大小

我写了一篇文章,下面是复制的代码片段

    func make1() -> NSViewController {
        let vc1     =   NSViewController()
        vc1.view    =   NSView()
        vc1.view.wantsLayer =   true
        vc1.view.layer!.backgroundColor =   NSColor.blueColor().CGColor
        return  vc1
    }
    func setup1(vc1:NSViewController) {
        /// Layout constraints must be installed after the view is added to a view hierarchy.
        split1.view.addConstraint(NSLayoutConstraint(item: vc1.view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: 20))
        split1.view.addConstraint(NSLayoutConstraint(item: vc1.view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.LessThanOrEqual, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: 300))
    }

    split1.addSplitViewItem(NSSplitViewItem(viewController: make1()))
    split1.addSplitViewItem(NSSplitViewItem(viewController: make1()))
    split1.addSplitViewItem(NSSplitViewItem(viewController: make1()))

    setup1(split1.splitViewItems[0].viewController)
    setup1(split1.splitViewItems[1].viewController)
    setup1(split1.splitViewItems[2].viewController)

这种问题很难证明原因,因为它需要了解封闭源代码程序的内部结构

所以原因未知,但在添加子视图之前,当我将
NSSplitView
的初始大小设置为非零值时,会显示子视图

NSSplitView* v  = [[NSSplitView alloc] init];
NSView*      v2 = [[NSView alloc] init];
v.frame  = NSRectFromCGRect(CGRectMake(0,0,100,100));  // Added this line.
v2.frame = NSRectFromCGRect(CGRectMake(0,0,50,100));  // Added this line.
[v addSubview:v2];  // And then, add subview. 
我猜
NSSplitView
根据其当前可用大小有一些内部子视图布局行为。据我观察,

  • 将子视图添加到零大小的
    NSSplitView
    无法正常工作
更新 从OSX10.10开始,Cocoa引入了一个新类
NSSplitViewController
,它工作得很好。我强烈建议使用这个。它完全基于自动布局,因此需要使用自动布局约束来设置大小

我写了一篇文章,下面是复制的代码片段

    func make1() -> NSViewController {
        let vc1     =   NSViewController()
        vc1.view    =   NSView()
        vc1.view.wantsLayer =   true
        vc1.view.layer!.backgroundColor =   NSColor.blueColor().CGColor
        return  vc1
    }
    func setup1(vc1:NSViewController) {
        /// Layout constraints must be installed after the view is added to a view hierarchy.
        split1.view.addConstraint(NSLayoutConstraint(item: vc1.view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: 20))
        split1.view.addConstraint(NSLayoutConstraint(item: vc1.view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.LessThanOrEqual, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: 300))
    }

    split1.addSplitViewItem(NSSplitViewItem(viewController: make1()))
    split1.addSplitViewItem(NSSplitViewItem(viewController: make1()))
    split1.addSplitViewItem(NSSplitViewItem(viewController: make1()))

    setup1(split1.splitViewItems[0].viewController)
    setup1(split1.splitViewItems[1].viewController)
    setup1(split1.splitViewItems[2].viewController)

... 这应该是答案吗?这看起来像是一个评论,但我相信凭借12k的声誉,你会知道评论和回答之间的区别。@BoltClock谢谢你的关注。我更新了我的答案,使之有意义。(所以看起来不再像是非解决方案)如果这仍然有点不合适,请告诉我原因。因为这意味着我不知道为什么,而且我总是想遵守社区礼仪。@ClintonWard嗯,我还需要两天时间来接受我自己的答案。而且,我仍然希望有人能给出比我更好的答案。。。。这应该是答案吗?这看起来像是一个评论,但我相信凭借12k的声誉,你会知道评论和回答之间的区别。@BoltClock谢谢你的关注。我更新了我的答案,使之有意义。(所以看起来不再像是非解决方案)如果这仍然有点不合适,请告诉我原因。因为这意味着我不知道为什么,而且我总是想遵守社区礼仪。@ClintonWard嗯,我还需要两天时间来接受我自己的答案。而且,我仍然希望有人能给出比我更好的答案。