簡體   English   中英

將NSView添加到窗口不在頂部?

[英]Adding NSView to window not on top?

我正在以編程方式添加一個子視圖,並將其添加到主Windows上下文視圖中,以掩蓋整個上下文視圖,如下所示:

loadingView = [[LoadingView alloc] initWithFrame:[mainWindow.contentView frame]];

NSLog(@"%@", [mainWindow.contentView subviews]);
[mainWindow.contentView addSubview:loadingView];
NSLog(@"%@", [mainWindow.contentView subviews]);

[mainWindow makeFirstResponder:loadingView];

NSLog's確認loadingView是在contentView子視圖中最后添加的。 我也嘗試過:

loadingView = [[LoadingView alloc] initWithFrame:[mainWindow.contentView frame]];
[mainWindow.contentView addSubview:loadingView positioned:NSWindowAbove relativeTo:nil];
[mainWindow makeFirstResponder:loadingView];

那也不起作用。 出於某種原因,窗口底部的兩個表視圖(在IB中創建)位於我添加的新視圖的頂部。 這是窗口的快照,請注意紅色部分是進度條和一些標簽應位於頂部的位置:

loadingView

還值得注意的是,該視圖的Alpha值設置為0.9,這就是為什么您可以在其后面有所看到的原因。

GW

如果將一個視圖放在另一個視圖上方,則上一個視圖中的對象將可見。 您需要做的是從窗口中刪除先前的視圖,然后添加一個新的子視圖。

嘗試使用:

//Create IBOutlet of your tableview in your .h file
IBOutlet NSTableView* yourTableView;

// Add this line where you are adding your subview to remove the tableview from superview.
[yourTableView removeFromSuperview];

// Then add your loading view as the subview
loadingView = [[LoadingView alloc] initWithFrame:[mainWindow.contentView frame]];
[mainWindow.contentView addSubview:loadingView];

然后,每當您希望您的tableView返回使用時:

[window contentView]addSubview: yourTableView];

只要您在此處使用nil,就不會得到可預測的結果。

[mainWindow.contentView addSubview:loadingView位置:NSWindowAbove relativeTo:nil];

如果尚未這樣做,請將所有其他視圖放入一個包含視圖。 將包含視圖設為窗口內容視圖的直接子視圖。 現在,使用上述方法添加子視圖,並將nil替換為對包含視圖的引用。

在OS X中,重疊的同級元素在繪制時會有一些細微差別。 在您的情況下,loadingView和兩個表視圖是同級的,因為它們都被添加為窗口內容視圖的子視圖,並且它們重疊,因此細微差別開始發揮作用。

從蘋果的文檔

出於性能方面的考慮,當同級視圖重疊時,Cocoa不會在同級視圖之間強制剪切或保證正確的無效和繪制行為。 如果要在另一個視圖前面繪制一個視圖,則應將前視圖作為后視圖的子視圖(或后代)。

我沒有確定的解決方案,但是長期閱讀這些內容將有助於提高您的理解能力。

http://www.cocoabuilder.com/archive/cocoa/327817-overlapping-sibling-views.html

有正確的方法來處理重疊的NSView兄弟姐妹嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM