如何使NSView移动到所有NSView的前面

时间:2010-05-20 10:24:34

标签: cocoa nsview

我有一个超级视图,它有2个子视图。 这些子视图重叠。

每当我从菜单中选择一个视图时,相应的视图应该成为前视图并处理动作。 即它应该是最前面的子视图。

acceptsFirstResponder辞去所有工作。 但是鼠标按下事件被发送到已设置的最顶层子视图。

此致 Dhana

8 个答案:

答案 0 :(得分:37)

这是实现这一目标的另一种方式,它更加清晰简洁:

[viewToBeMadeForemost removeFromSuperview];
[self addSubview:viewToBeMadeForemost positioned:NSWindowAbove relativeTo:nil];

根据此方法的文档,当您使用relativeTo:nil时,视图会在其上方(或下方,NSWindowBelow)添加所有其中的兄弟。

答案 1 :(得分:14)

另一种方法是使用NSView的 sortSubviewsUsingFunction:context:方法根据自己的喜好重新排序兄弟视图的集合。例如,定义比较函数:

static NSComparisonResult myCustomViewAboveSiblingViewsComparator( NSView * view1, NSView * view2, void * context )
{    
    if ([view1 isKindOfClass:[MyCustomView class]])    
        return NSOrderedDescending;    
    else if ([view2 isKindOfClass:[MyCustomView class]])    
        return NSOrderedAscending;    

    return NSOrderedSame;
}

然后,当您想确保自定义视图保持在所有同级视图之上时,请将此消息发送到自定义视图的超级视图:

[[myCustomView superview] sortSubviewsUsingFunction:myCustomViewAboveSiblingViewsComparator context:NULL];

或者,您可以将此代码移至超级视图本身,并将消息 sortSubviewsUsingFunction:context:发送到 self

答案 2 :(得分:4)

我能够在不调用removeFromSuperView

的情况下使其工作
// pop to top
[self addSubview:viewToBeMadeForemost positioned:NSWindowAbove relativeTo:nil];

答案 3 :(得分:1)

下面给出的代码应该可以正常工作..

    NSMutableArray *subvies = [NSMutableArray arrayWithArray:[self subviews]];//Get all subviews..

    [viewToBeMadeForemost retain]; //Retain the view to be made top view..

    [subvies removeObject:viewToBeMadeForemost];//remove it from array

    [subvies addObject:viewToBeMadeForemost];//add as last item

    [self setSubviews:subvies];//set the new array..

答案 4 :(得分:1)

您可以通过再次添加视图来实现此目的;它不会创建它的另一个实例。

[self addSubview:viewToBeMadeForemost];

您可以在执行此代码行之前和之后记录子视图的数量。

答案 5 :(得分:1)

在模仿等效的UIView方法的Swift 4类别中使用@Dalmazio的答案可得出以下结果:

extension NSView {

    func bringSubviewToFront(_ view: NSView) {
            var theView = view
            self.sortSubviews({(viewA,viewB,rawPointer) in
                let view = rawPointer?.load(as: NSView.self)

                switch view {
                case viewA:
                    return ComparisonResult.orderedDescending
                case viewB:
                    return ComparisonResult.orderedAscending
                default:
                    return ComparisonResult.orderedSame
                }
            }, context: &theView)
    }

}

因此,将subView放在containerView的最前面

containerView.bringSubviewToFront(subView)

与删除并重新添加视图的解决方案不同,这使约束保持不变

答案 6 :(得分:0)

要将视图移动到前面,它必须放在子视图数组中的最后一个元素。这是一个Swift 3.0解决方案:

func bringChildToFrontWith(viewIdentifier: Int) {
    var subViewArray = self.subviews // Apple docs recommend copying subViews array before operating on it, as it "can be changed at any time"
    for ix in 0 ..< subViewArray.count {
        if let childView = subViewArray[ix] as? MyViewSubClass {
            if childView.myViewSubClassIdentifier == viewIdentifier {
                let topItem = subViewArray[ix];
                subViewArray.remove(at: ix)
                subViewArray.append(topItem)
                self.contentView.subviews = subViewArray
            }
        }
    }
}

答案 7 :(得分:-11)

你可以试试这个:

[viewToBeMadeFirst.window makeKeyAndOrderFront:nil];