gpt4 book ai didi

objective-c - NSTextView 的定位检查器栏

转载 作者:太空狗 更新时间:2023-10-30 03:58:55 25 4
gpt4 key购买 nike

为 TextView 启用“检查栏”很容易,这样屏幕顶部就会出现一个带有各种格式按钮的栏。 (虽然我有一些困惑,直到我学会确保我在 ScrollView 中选择 TextView ,而不是 ScrollView 本身)。我可以以编程方式使用 [textView setUsesInspectorBar:YES] 或转到属性检查器并选中“使用”部分中的“检查器栏”框。

我的问题是,如何进一步控制检查器栏?我在 XCode 文档或网上找不到有关它的信息。我希望能够将它放置在屏幕上的不同位置。能够选择栏中的特定控件也很棒。

最佳答案

答案是,您并不打算进一步控制检查器栏。文档中没有任何内容,因为,嗯,什么也没有。 Apple 的说法,使用它或不使用它。

但是,如果您深入研究一下,您会发现检查器栏是一个非常有趣的控件。它不显示为 TextView 的一部分,而是(私下)嵌入“窗口 View ”本身。当我说“窗口 View ”时,我指的是内容 View 的父 View 。

如果您列出该“窗口 View ”的 subview :

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 将检查器栏置于与其他顶级窗口控件相同的级别。现在这已经进入了私有(private) API 领域,但简单地修改“窗口 View ”不应该让任何应用程序被拒绝。


您可以尝试从此处获取对__NSInspectorBarView 的引用。它似乎总是在内容 View 之后的 subview ,所以这样的事情可能会起作用:

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 更改顶级 View 的顺序,这会立即中断,因此对于生产应用程序来说这可能不是一个好主意。另一个想法是:

NSView *inspectorBarView = nil;
for (NSView *topLevelView in topLevelViews) {
if ([topLevelView isKindOfClass:NSClassFromString(@"__NSInspectorBarView")]) {
inspectorBarView = topLevelView;
}
}
NSLog(@"%@", inspectorBarView);

我不知道 NSClassFromString() 的使用是否会通过 App Store 审查指南,但是,因为它再次依赖于私有(private) API。


话虽这么说,但一旦您获得对检查器栏 View 的引用,事情仍然无法正常工作。您可以尝试将其重新定位在底部:

if (inspectorBarView) {
NSRect newFrame = inspectorBarView.frame;
newFrame.origin = NSZeroPoint;
[inspectorBarView setAutoresizingMask:NSViewMaxYMargin | NSViewMaxXMargin];
[inspectorBarView setFrame:newFrame];
}

但是你最终会得到一个错误绘制的工具栏,所以在那里需要做更多的工作:

enter image description here

我的想法是尝试将内容 View 的高度向上移动以覆盖灰色的剩余区域(每次调整窗口大小时都必须这样做,也许修改自动调整大小的蒙版可能会更容易)和为底部的检查栏自定义绘制背景。

编辑

哦,你也应该为此提交一个功能请求。 bugreport.apple.com

关于objective-c - NSTextView 的定位检查器栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11785350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com