2010-11-21 96 views

回答

6

實際上還沒有嘗試過這一點 - 有可能是更好的方法來做到這一點 - 但這應該工作:

NSView* superview = [view superview]; 
[view removeFromSuperview]; 
[superview addSubview:view]; 

這將移動「觀看」到它的兄弟姐妹的前

+0

可能效率低下,但它完成了我想要的,所以謝謝。 – Regan 2010-11-21 16:45:17

+0

改用'setSubviews:'方法可能是值得研究的。 – ArtOfWarfare 2013-08-20 23:15:57

0

兄弟姐妹認爲重疊可能很難在AppKit中正常工作 - 很長一段時間它完全不受支持。考慮讓他們成爲CALayers。作爲獎勵,您可以在iOS版本中重複使用此代碼。

0

也一定要啓用層石英渲染:

... 
NSImageView *anImage = [[NSImageView alloc] initWithFrame:NSRectMake(0,0,512,512)]; 
[anImageView setWantsLayer:YES]; 
... 

,否則,你的層不能正確渲染。

0

Pete Rossi的答案很有用,但請記住在從超級視圖中移除視圖時保留視圖。

您可以在一個NSView在一個類別補充一點:

-(void)bringSubviewToFront:(NSView*)view 
{ 
    [view retain]; 
    [view removeFromSuperview]; 
    [self addSubview:view]; 
    [view release]; 
} 
5

皮特·羅西的回答並沒有爲我工作,因爲我需要用鼠標拖動它時彈出視圖到前面。然而,沿着相同的路線以下沒有工作而不殺死鼠標:

CALayer* superlayer = [[view layer] superlayer]; 
[[view layer] removeFromSuperlayer]; 
[superlayer addSublayer:[view layer]]; 

此外,下面的放置在一個NSView子類或類別是非常方便的:

- (void) bringToFront { 
    CALayer* superlayer = [[self layer] superlayer]; 
    [[self layer] removeFromSuperlayer]; 
    [superlayer addSublayer:[self layer]]; 
} 
+0

完美!正是我所需要的,謝謝。 – 2015-03-07 04:49:36

0

這是雨燕3.0的解決方案:

extension NSView { 
    public func bringToFront() { 
     let superlayer = self.layer?.superlayer 
     self.layer?.removeFromSuperlayer() 
     superlayer?.addSublayer(self.layer!) 
    } 
}