OS X版本的bringSubviewToFront:?

时间:2010-11-21 03:34:55

标签: objective-c cocoa macos

我需要在iPhone上复制bringSubviewToFront的功能:但是我在Mac上编程。怎么办呢?

6 个答案:

答案 0 :(得分:7)

实际上没有尝试过 - 而且可能有更好的方法 - 但这应该有效:

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

这会将“视图”移动到其兄弟姐妹的前面

答案 1 :(得分:6)

Pete Rossi的回答对我不起作用,因为当用鼠标拖动视图时我需要将视图弹出到前面。但是,沿着相同的路线,下面的工作没有杀死鼠标:

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]];
}

答案 2 :(得分:0)

重叠的兄弟视图很难在AppKit中正常工作 - 它在很长一段时间内完全不受支持。考虑改为使用CALayers。作为奖励,您可以在iOS版本中重复使用此代码。

答案 3 :(得分:0)

还要确保启用石英渲染图层:

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

否则,您的图层无法正确呈现。

答案 4 :(得分:0)

Pete Rossi的回答是可行的,但是当你从超级视图中删除时,请记得保留视图。

您可以在NSView上的类别中添加:

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

答案 5 :(得分:0)

这是Swift 3.0解决方案:

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