2010-11-21 99 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!) 
    } 
}