13

NSToolbarItemXcode ステータス ビューに似たビューを使用する があります。現在、ラベルはありませんが、アイテム ラベルが通常描画される領域に描画する方法がわかりません。Xcodeステータスビューと同じように、ビューをその領域に拡張したいと思います。のピクセルの一番下の部分がNSToolbar範囲外であることはわかっていますが、他のアプリケーションがラベル領域に描画されるのを見てきました。何か案は?

編集:明確にするために、これは私がXcodeで参照しているステータスビューです:

Xcode のビューと同じように、ビューの境界がツールバーのラベル領域を超えて拡張されるようにします。

4

6 に答える 6

5

Xcode ステータス ビューは、に挿入されNSToolbarItemたカスタムではありません。NSViewNSToolbar

于 2011-05-31T21:30:30.047 に答える
4

ログインすれば

    NSLog(@" %@", [[self.window.contentView superview] subviews]);

あなたは得るでしょう ここに画像の説明を入力

NSToolbarView はサブビューの自動サイズ変更を行わないため、中央に配置する際に問題が発生します。全画面表示の場合、[self.window.contentView superview]ツールバービューは含まれません。

ツールバーの中央に必要なビューを[self.window.contentView superview]フルスクリーンではないときに追加して、適切に配置できます。自動サイズ変更され、中央に配置されます。フルスクリーンに切り替える[self.window.contentView superview]と、それを削除して中央の NSToolbarView に追加し、ツールバーに留まり、ステータスバーを表示するとツールバーとともに下に移動します。

サブビューを反復するか、プライベートメソッドを使用して、ツールバービューを取得できます

[[self.window toolbar] performSelector:@selector(_toolbarView)];

更新: デバッガーをもう少し掘り下げたところ、これが Xcode の機能であることがわかりました。少なくとも全画面表示ではありません。

    thealch3m1st$ sudo lldb 
(lldb) process attach -p 11478
Process 11478 stopped
Executable module set to "/Applications/Xcode.app/Contents/MacOS/Xcode".
Architecture set to: x86_64.
(lldb) po [NSApplication sharedApplication]
(id) $0 = 0x000000040013f5e0 <IDEApplication: 0x40013f5e0>
(lldb) po [$0 mainWindow]
(id) $1 = 0x0000000000000000 <nil>
(lldb) po [$0 windows]
(id) $2 = 0x0000000408278460 <__NSArrayM 0x408278460>(
<IDEWelcomeWindow: 0x40141c1e0>,
<IDEWorkspaceWindow: 0x401ef2780>,
<NSComboBoxWindow: 0x402019be0>,
<NSWindow: 0x4022adc60>,
<IDEOrganizerWindow: 0x402951b20>
)
(lldb) po [$0 windows]
(id) $3 = 0x0000000408820300 <__NSArrayM 0x408820300>(
<IDEWelcomeWindow: 0x40141c1e0>,
<IDEWorkspaceWindow: 0x401ef2780>,
<NSComboBoxWindow: 0x402019be0>,
<NSWindow: 0x4022adc60>,
<IDEOrganizerWindow: 0x402951b20>
)

(lldb) [$3 objectAtIndex:1]
error: '[$3' is not a valid command.
(lldb) po [$3 objectAtIndex:1]
(id) $4 = 0x0000000401ef2780 <IDEWorkspaceWindow: 0x401ef2780>
(lldb) po [$4 contentView]
(id) $5 = 0x0000000401ef0920 <NSView: 0x401ef0920>
(lldb) po [$5 superview]
(id) $6 = 0x0000000401ef2e20 <NSThemeFrame: 0x401ef2e20>
(lldb) po [$6 subviews]
(id) $7 = 0x0000000401ef3800 <__NSArrayM 0x401ef3800>(
<_NSThemeCloseWidget: 0x401ef3120>,
<_NSThemeWidget: 0x401ef3b80>,
<_NSThemeWidget: 0x401ef40e0>,
<NSView: 0x401ef0920>,
<IDEActivityView: 0x4020cd700>,
<_NSThemeFullScreenButton: 0x402017b20>,
(<NSToolbarView: 0x4020192e0>: Xcode.IDEKit.ToolbarDefinition.Workspace),
<DVTDualProxyWindowTitleView: 0x40225e0a0>,
<NSThemeDocumentButton: 0x402698020>
)

(lldb) po [$7 objectAtIndex:4]
(id) $8 = 0x00000004020cd700 <IDEActivityView: 0x4020cd700>
(lldb) [$8 setHidden:YES]
error: '[$8' is not a valid command.
(lldb) po [$8 setHidden:YES]
(id) $9 = 0x0000000000000000 <nil>
(lldb) continue
Process 11478 resuming
(lldb) 

ここに画像の説明を入力

そして、アクティビティビューはなくなりました:)

ただし、全画面表示中。NSToolbarView に追加するのではなく、NSToolbarView のスーパービューである NSNextStepFrame に追加します。全画面表示の場合、ツールバーはウィンドウの contentview スーパービューに含まれません。フルスクリーンの動作とスペースに関係があると思います。

于 2012-07-29T21:20:09.420 に答える
1

Xcode ステータス ビューは、実際にはツールバーの上に浮かぶ別のウィンドウです。(これは簡単にテストできます: ⇧⌘4 を押してスペースを押し、ウィンドウのスクリーンショットを撮り、マウスをその上に置きます。)

于 2011-07-05T17:18:28.407 に答える
0

ラベル領域に拡張された iTunes-XCode-LCD はNSToolbarItem. NSToolbarではないため、サブビューをインスタンスNSViewに追加することはできません。ただし、インスタンスのプロパティ パスをNSToolbar介してアクセスできるウィンドウ フレームにカスタム ビューを直接追加できます。contentView.superviewNSWindow

つまり、NSWindowController の独自のサブクラスを作成し、次のようなコードを 'windowDidLoad' メソッドに入れます。

- (void)windowDidLoad
{  
[super windowDidLoad];

NSImage *image = [NSImage imageNamed:@"lcd"];
NSRect lcdFrameRect = NSMakeRect(self.window.frame.size.width / 2 - image.size.width/2, self.window.frame.size.height - image.size.height - 20, 

                                 image.size.width, image.size.height);
NSImageView *lcdView = [[NSImageView alloc] initWithFrame: lcdFrameRect];
[lcdView setImage: image];
lcdView.autoresizingMask = NSViewMinYMargin | NSViewMinXMargin | NSViewMaxXMargin;

NSView * contentView = self.window.contentView;
[contentView.superview addSubview: lcdView];
}

フルスクリーンではフレーム ウィンドウが描画されないため、このコードは Lion のフルスクリーン モードでは機能しません。これを修正するには、メイン ウィンドウの子であるフローティング ウィンドウでビューを移動します (NSWindow の addChildWindow:ordered: メソッドを確認してください)。

于 2012-02-20T14:36:15.783 に答える