答案是,您不应该进一步控制检查栏。文档中什么都没有,因为,好吧,什么都没有。苹果的说法,用它还是不用它。
然而,如果你深入研究一下,你会发现inspector bar是一个非常有趣的控件。它不显示为文本视图的一部分,而是(私下)嵌入在“窗口视图”本身中。当我说“窗口视图”时,我指的是内容视图的超级视图。
如果你列出那个“窗口视图”的子视图:
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