我正在使用提供不同句柄的自定义控件。我想确保所选的句柄具有Z-index grater,然后其他句柄处理。
有没有办法交换视图订单?我发现这个函数sortSubviewsUsingFunction:context:
但我无法理解这是否是正确的解决方案。
Cocoa在macOS 10.0中引入了一个新的API。 它与iOS类似,您可以传递另一个视图以显示在下方或上方。
[self.view addSubview:myView positioned:NSWindowBelow relativeTo:myViewInBackground];
结帐documentation;根据我的经验,NSWindowBelow
和NSWindowAbove
似乎逆转了。
它非常简单,您可以使用比较2个子视图的功能来重新排序它们。这是一个基于view标签的简单解决方案:
[mainView sortSubviewsUsingFunction:(NSComparisonResult (*)(id, id, void*))compareViews context:nil];
...
NSComparisonResult compareViews(id firstView, id secondView, void *context) {
int firstTag = [firstView tag];
int secondTag = [secondView tag];
if (firstTag == secondTag) {
return NSOrderedSame;
} else {
if (firstTag < secondTag) {
return NSOrderedAscending;
} else {
return NSOrderedDescending;
}
}
}
是的,sortSubviewsUsingFunction:context:
可以做你想要做的事情,但如果你想要的只是一个特定的视图坐在(无序的)其他人之上,它可能是矫枉过正的。在这种情况下,你应该研究bringSubviewToFront:
的UIView
方法。这样,您可以在IBAction中执行类似的操作来调出句柄:
[self.view bringSubviewToFront: handle];
假设handle是一个/ UIView继承的对象。如果这不是您想要的,那么请务必使用sortSubviewsUsingFunction:context:
,在这种情况下,您需要更改每个子视图的单个标记属性,并进行相应的排序。
据我所知,你可以循环查看所有视图并将它们添加到数组中,然后你可以选择将它们添加到带索引的视图中。你有以下功能。
[self.view insertSubview:view1 atIndex:2]
[self.view insertSubview:view1 aboveSubview:0]
[self.view insertSubview:view1 belowSubview:1]
然后你可以根据需要更换它的订单..