我有一个超级视图,它有两个子视图。这些子视图是重叠的。
每当我从菜单中选择一个视图时,相应的视图应该成为前景视图并处理操作。 也就是说,它应该是最前面的子视图。
acceptsFirstResponder
放弃所有工作都很好。但是鼠标按下事件被发送到了设置的最上面的子视图。
敬礼, Dhana
我有一个超级视图,它有两个子视图。这些子视图是重叠的。
每当我从菜单中选择一个视图时,相应的视图应该成为前景视图并处理操作。 也就是说,它应该是最前面的子视图。
acceptsFirstResponder
放弃所有工作都很好。但是鼠标按下事件被发送到了设置的最上面的子视图。
敬礼, Dhana
这里有另一种更清晰简洁的方法来完成这个任务:
[viewToBeMadeForemost removeFromSuperview];
[self addSubview:viewToBeMadeForemost positioned:NSWindowAbove relativeTo:nil];
根据这个方法的文档,当你使用 relativeTo:nil
时,视图会添加在所有同级视图的上面(或下面,使用 NSWindowBelow
)。使用@Dalmazio的答案在一个模仿等效UIView方法的Swift 4类别中,结果如下:
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)
与移除和重新添加视图的解决方案不同,这种方法会保持约束条件不变。
另一种方法是使用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];
或者,您可以将此代码移动到父视图本身,并向 self 发送消息 sortSubviewsUsingFunction:context:。
我能够使这项工作正常运行,而无需调用removeFromSuperView函数。
// pop to top
[self addSubview:viewToBeMadeForemost positioned:NSWindowAbove relativeTo:nil];
[self addSubview:viewToBeMadeForemost];
给出的代码应该可以正常工作。
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..
[viewToBeMadeFirst.window makeKeyAndOrderFront:nil];