我正在完全以编程方式制作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永远无法正常工作。


更新资料

从OS X 10.10开始,Cocoa引入了新的类NSSplitViewController,并且运行良好。我强烈建议使用此功能。它是完全基于自动布局的,因此您需要使用自动布局约束来设置尺寸。

我写了working example project,这是复制的代码片段。

    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)

关于objective-c - 如何强制NSSplitView的所有 subview 在启动时可见?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16696948/

10-08 23:39