我在Interface Builder中创建了一个带有两个子视图的NSSplitView.我希望左侧视图具有固定宽度.我试图为两个子视图定义自动调整规则,但左侧子视图仍然在窗口大小调整时更改宽度(拆分视图填满窗口).可能是由NSSplitView的Autoresizes Subviews属性引起的?(我无法取消选中).我能做什么?
我有一个NSSplitView.在该拆分视图的左侧窗格中,我有一个NSTableView和一个以编程方式创建的自定义视图.我正在使用代理来确保我的两个窗格不会同时调整大小.
我这样添加自定义视图:
BWAnchoredButtonBar *anchoredButtonBar = [[[BWAnchoredButtonBar alloc] initWithFrame:[leftPane bounds]] autorelease];
[leftPane addSubview:anchoredButtonBar];
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常.当我运行我的应用程序一切正常.现在,我的问题是,当我调整拆分视图窗格时,自定义视图不会调整大小,在它与NSSplitView的分隔符之间留下一个丑陋的空白区域.
我想我想问的是,我如何以编程方式设置IB在视觉上设置的弹簧和支柱?
此外,我不能使用IB,因为Xcode 4不支持IB插件.
我试图以NSSplitView编程方式创建一个水平,并添加2个子视图.不幸的是,如果我没有问题来创建splitview,我不知道如何添加子视图.
你有任何想法吗?
我们可以改变分频器的颜色吗?Apple文档说,我们可以在NSSplitView的子类中覆盖-dividerColor,但这对我不起作用,或者我的理解不正确.我也尝试在分隔符上创建颜色层,例如:
colorLayer = [CALayer layer];
NSRect dividerFrame = NSMakeRect([[self.subviews objectAtIndex:0] frame].size.width, [[self.subviews objectAtIndex:0] frame].origin.y, [self dividerThickness], self.frame.size.height);
[colorLayer setBackgroundColor:[color coreGraphicsColorWithAlfa:1]];
[colorLayer setFrame:NSRectToCGRect(dividerFrame)];
[self.layer addSublayer:colorLayer];
Run Code Online (Sandbox Code Playgroud)
不行.
我有一个简单的垂直方向NSSplitView,当我调整窗口大小时我不会保持他的大小但是我想NSSplitView在拖动分隔两个视图的垂直条时允许手动调整大小.
编辑.这是我添加的代码,并且出于某种原因出错:左窗格(sourceView)在调整窗口大小时保持相同的大小,但右窗格具有正确的自动布局约束(在不实现下面的方法的情况下工作正常) .NSSrollView是左窗格,我不想保持在同一位置,而另一个视图可能会随窗口调整大小.
- (BOOL)splitView:(NSSplitView *)splitView shouldAdjustSizeOfSubview:(NSView *)subview
{
if ([subview class] == [NSScrollView class])
return NO;
return YES;
}
Run Code Online (Sandbox Code Playgroud)
有人知道快速解决方案吗?谢谢!
我创建了一个分割视图控制器,显示两个视图,如下所示:
当我编译它时,它给了我这个结果:

不幸的是,第一个视图不可见,我必须从窗口的左侧拖动才能看到两个视图:
首先,为什么拆分视图表现得像这样?为什么它从一开始就没有合适的尺寸?
如果我将此行添加到我的SplitViewController的viewDidLoad()函数:
splitView.adjustSubviews()
Run Code Online (Sandbox Code Playgroud)
然后两个视图出现,大小相同,但我不明白adjustSubviews()函数究竟做了什么,我无法控制其中任何一个的位置.
如何以编程方式修复它?如何调整每个视图的大小?有没有办法在界面构建器中调整它?
谢谢.
编辑:这个问题现在有50分的赏金
Finder 和 Notes 有一种我正在寻求重现的特殊行为。NSToolbar 中的“灵活空间”似乎考虑了拆分视图的尺寸。例如,第一组按钮在侧边栏的左侧与右侧对齐。第二组图标与第一列的右侧对齐。当我加宽侧边栏时,工具栏项目随之移动。
有没有可能重现这个?
使用@KenThomases 提供的解决方案,我实现了如下:
final class MainWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
window?.toolbar?.delegate = self
// Make sure that tracking is enabled when the toolbar is completed
DispatchQueue.main.async {
self.trackSplitViewForFirstFlexibleToolbarItem()
}
}
}
extension MainWindowController: NSToolbarDelegate {
func toolbarWillAddItem(_ notification: Notification) {
// Make sure that tracking is evaluated only after the item was added
DispatchQueue.main.async {
self.trackSplitViewForFirstFlexibleToolbarItem()
}
}
func toolbarDidRemoveItem(_ notification: Notification) {
trackSplitViewForFirstFlexibleToolbarItem()
}
/// - Warning: This is a …Run Code Online (Sandbox Code Playgroud) cocoa nssplitview nstoolbar nstoolbaritem nssplitviewcontroller
我正在玩NSSplitView - 现在非常成功,但这是我的问题:
我的SplitView看起来像这样:

测试项目:https://www.dropbox.com/s/amz863l11nvkdir/TestNSSplitView.zip
我已经实现- (void)splitView:(NSSplitView *)splitView resizeSubviewsWithOldSize:(NSSize)oldSize了在调整大小时将左侧和右侧子视图保持与之前相同的大小.
如果我打开包含NSSplitView的窗口,则会在控制台中显示此消息:
<NSSplitView: 0x107de1520>: the delegate <BRSchematicWindowController: 0x10ac11050> was sent -splitView:resizeSubviewsWithOldSize: and left the subview frames in an inconsistent state:
Split view bounds: {{0, 0}, {1068, 600}}
Subview frame: {{0, 0}, {182, 600}}
Subview frame: {{183, 0}, {640, 600}}
Subview frame: {{824, 0}, {243, 600}}
The outer edges of the subview frames are supposed to line up with the split view's bounds' edges. NSSplitView is working around …Run Code Online (Sandbox Code Playgroud) Xcode 8.2.1,Swift 3.0.2,macOS 10.12
我有一个NSSplitViewController有3个窗格(请注意NS;这是一个Mac应用程序).
我正在尝试将最左侧的窗格设置为始终具有固定宽度,而不是可调整大小.我尝试过以下方法:
constrainMaxCoordinate并constrainMinCoordinate没有奏效.有没有其他人最近上班?有很多关于这个主题的文章,但他们的工具集已有几年的历史了,他们的建议都没有对我有用.谢谢!
我想使用自定义NSSplitView与我NSSplitViewController。
该文件说:
要提供自定义的拆分视图,请在继承的viewDidLoad()方法中调用super之前随时设置此属性。也就是说,在拆分视图控制器的isViewLoaded属性为true之前。
我的NSSplitViewController子类称为MainVC。
我尝试-viewDidLoad在调用之前设置我的自定义拆分视图[super viewDidLoad]:
- (void)viewDidLoad {
self.splitView = [MySplitView new];
[super viewDidLoad];
// Rest of viewDidLoad...
}
Run Code Online (Sandbox Code Playgroud)
但这没用。我收到以下错误:
2017-09-02 10:35:43.527312-0700 Zee [6497:632581] ** *-[MainVC setSplitView:],/ BuildRoot / Library / Caches / com.apple.xbs / Sources / AppKit / AppKit-中的声明失败1561 / Controllers / NSSplitViewController.m:220
2017-09-02 10:35:43.527558-0700 Zee [6497:632581] MainVC:-splitView只能在加载视图之前分配
我也尝试覆盖loadView:
- (void)loadView {
self.splitView = [MySplitView new];
[super loadView];
}
Run Code Online (Sandbox Code Playgroud)
但是我得到:
2017-09-02 10:39:39.377345-0700 …