我正在以编程方式完成UI。 (没有IB)我做了一个NSWindow,并附上了一个NSSplitView。问题是当程序启动时窗口显示时,拆分视图的第一个子视图总是会折叠。
如何强制在启动时显示拆分视图的所有子视图?
答案 0 :(得分:1)
这种问题难以证明原因,因为它需要了解闭源程序的内部知识。
因此原因未知,但在添加子视图之前将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)