我有一个超级视图,它有两个子视图。这些子视图是重叠的。
每当我从菜单中选择一个视图时,相应的视图应该成为前视图并处理操作。也就是说,它应该是最前面的子视图。
acceptsFirstResponder辞职,一切都很好。但是鼠标按下事件被发送到设置的最顶层的子视图。
问候你,Dhana
发布于 2010-05-22 09:53:41
下面是另一种更清晰、更简洁的实现方法:
[viewToBeMadeForemost removeFromSuperview];
[self addSubview:viewToBeMadeForemost positioned:NSWindowAbove relativeTo:nil];根据此方法的文档,当您使用relativeTo:nil时,视图将添加到(或使用NSWindowBelow)其所有同级视图的上方(或下方)。
发布于 2011-12-21 21:09:22
另一种方法是使用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;
}然后,当您希望确保您的自定义视图高于所有同级视图时,请将此消息发送到自定义视图的superview:
[[myCustomView superview] sortSubviewsUsingFunction:myCustomViewAboveSiblingViewsComparator context:NULL];或者,您可以将此代码移动到superview本身,并将消息sortSubviewsUsingFunction:context:发送到self。
发布于 2019-01-22 22:40:00
在模仿等价UIView方法的SWIFT4类别中使用@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)
}
}因此,要在containerView中将subView带到最前面
containerView.bringSubviewToFront(subView)与删除并重新添加视图的解决方案不同,这会保持约束不变
https://stackoverflow.com/questions/2872840
复制相似问题