答案是,您并不打算进一步控制检查栏。文档中什么都没有,因为,好吧,什么都没有。苹果的说法,使用它或不使用它。
但是,如果您深入研究一下,您会发现检查器栏是一个非常有趣的控件。它不显示为文本视图的一部分,而是(私下)嵌入在“窗口视图”本身中。当我说“窗口视图”时,我指的是内容视图的超级视图。
如果您列出该“窗口视图”的子视图:
NSLog(@"%@", [self.testTextView.window.contentView superview].subviews);
你最终得到:
2012-08-02 15:59:30.145 Example[16702:303] (
"<_NSThemeCloseWidget: 0x100523dc0>", // the close button
"<_NSThemeWidget: 0x100525ce0>", // the minimize button?
"<_NSThemeWidget: 0x100524e90>", // the maximize button?
"<NSView: 0x100512ad0>", // the content view
"<__NSInspectorBarView: 0x100529d50>", // the inspector view
"(<NSToolbarView: 0x10054e650>: FD2E0533-AB18-4E7E-905A-AC816CB80A26)" // the toolbar
)
如您所见,AppKit
将检查器栏与其他顶级窗口控件置于同一级别。现在这进入了私有 API 的领域,但简单地修补“窗口视图”不应该让任何应用程序被拒绝。
您可以尝试__NSInspectorBarView
从此处获取对 的参考。似乎它总是紧跟在内容视图之后的子视图,所以这样的事情可能会起作用:
NSArray *topLevelViews = [self.testTextView.window.contentView superview].subviews;
NSUInteger indexOfContentView = [topLevelViews indexOfObject:self.testTextView.window.contentView];
if (indexOfContentView + 1 < topLevelViews.count) {
NSView *inspectorBar = [topLevelViews objectAtIndex:indexOfContentView + 1];
NSLog(@"%@", inspectorBar);
}
NSLog(@"%@", topLevelViews);
如果 Apple 更改顶级视图的顺序,这会立即中断,因此对于生产应用程序可能不是一个好主意。另一个想法是:
NSView *inspectorBarView = nil;
for (NSView *topLevelView in topLevelViews) {
if ([topLevelView isKindOfClass:NSClassFromString(@"__NSInspectorBarView")]) {
inspectorBarView = topLevelView;
}
}
NSLog(@"%@", inspectorBarView);
我不知道使用是否NSClassFromString()
会通过 App Store 审查指南,但是,因为它再次依赖于私有 API。
话虽如此,一旦您获得对检查栏视图的引用,事情仍然不能很好地工作。您可以尝试在底部重新定位它:
if (inspectorBarView) {
NSRect newFrame = inspectorBarView.frame;
newFrame.origin = NSZeroPoint;
[inspectorBarView setAutoresizingMask:NSViewMaxYMargin | NSViewMaxXMargin];
[inspectorBarView setFrame:newFrame];
}
但是你最终会得到一个错误绘制的工具栏,所以需要做更多的工作:
我的想法是尝试将内容视图的高度向上移动以覆盖灰色的剩余区域(每次调整窗口大小时都必须这样做,也许修补自动调整大小的蒙版可能会更容易)并自定义绘制底部检查器栏的背景。
编辑
哦,您也应该为此提交功能请求。bugreport.apple.com