OS X版本的bringSubviewToFront:?

10

我需要在 iPhone 上复制 bringSubviewToFront: 函数的功能,但我是在 Mac 上编程。这该怎么做?

6个回答

9
我还没有真正尝试过这个方法,可能有更好的方法,但是这个应该是可行的:
NSView* superview = [view superview];  
[view removeFromSuperview];  
[superview addSubview:view];  

这将把“view”移动到其同级元素的前面。

可能不太高效,但它实现了我想要的功能,所以谢谢。 - Regan
或许值得研究一下使用setSubviews:方法。 - ArtOfWarfare

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

我来寻找这个问题的解决方案,除了我的主机视图没有层支持导致的小问题外,这个方法非常有效。感谢您的分享。 - Matt Mower

1

另外请确保启用了石英渲染器的层:

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

否则,您的图层将无法正确渲染。

1
Pete Rossi的答案是可行的,但请记得在从superview中移除视图时保留视图。
您可以将此添加到NSView类别中:
-(void)bringSubviewToFront:(NSView*)view
{
    [view retain];
    [view removeFromSuperview];  
    [self addSubview:view];  
    [view release];
}

0

在AppKit中,重叠的兄弟视图可能很难正常工作——长时间以来完全不支持。考虑将它们改为CALayers。作为奖励,您可以在iOS版本中重用此代码。


0

这是Swift 3.0的解决方案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接