Objective c 更改NSView子视图顺序
我正在使用一个显示不同句柄的自定义控件。我希望确保所选句柄比其他句柄具有Z索引栅格 有没有办法交换视图顺序?Objective c 更改NSView子视图顺序,objective-c,cocoa,nsview,subviews,Objective C,Cocoa,Nsview,Subviews,我正在使用一个显示不同句柄的自定义控件。我希望确保所选句柄比其他句柄具有Z索引栅格 有没有办法交换视图顺序? 我找到了这个函数sortSubviewsUsingFunction:context:,但我不知道这是否是正确的解决方案 我从您的问题中了解到,您可以循环所有视图并将它们添加到数组中,然后您可以选择使用索引将它们添加到视图中。。您有以下功能 [self.view insertSubview:view1 atIndex:2] [self.view insertSubview:view1 ab
我找到了这个函数
sortSubviewsUsingFunction:context:
,但我不知道这是否是正确的解决方案 我从您的问题中了解到,您可以循环所有视图并将它们添加到数组中,然后您可以选择使用索引将它们添加到视图中。。您有以下功能
[self.view insertSubview:view1 atIndex:2]
[self.view insertSubview:view1 aboveSubview:0]
[self.view insertSubview:view1 belowSubview:1]
然后,您可以根据需要交换它的顺序。是的,
sortSubviewsUsingFunction:context:
可以做您想做的事情,但是如果您只想让一个特定视图位于(无序的)其他视图之上,这可能会有些过分。在这种情况下,您应该查看UIView
的bringSubviewToFront:
方法。这样,您可以在IBAction中执行以下操作以打开句柄:
[self.view bringSubviewToFront: handle];
假设句柄是从UIView继承的对象。如果这不是您想要的,那么请务必使用
sortSubviewsUsingFunction:context:
,在这种情况下,您需要更改每个子视图的单个标记属性,并相应地进行排序。非常简单,您可以使用一个比较两个子视图的函数来重新排序它们。下面是一个基于视图标记的简单解决方案:
[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;
}
}
}
[mainView SortSubViewUsingFunction:(NSComparisonResult(*)(id,id,void*))CompareView上下文:nil];
...
NSComparisonResult CompareView(id firstView、id secondView、void*context){
int firstTag=[firstView标记];
int secondTag=[secondView tag];
if(firstTag==secondTag){
返回指定名称;
}否则{
如果(第一个标签<第二个标签){
回报率下降;
}否则{
退而求其次;
}
}
}
Cocoa在macOS 10.0中引入了一种新的API。它类似于iOS,您可以传递另一个视图以显示在下方或上方
[self.view addSubview:myView positioned:NSWindowBelow relativeTo:myViewInBackground];
结帐;根据我的经验,下面的
nswindow
和上面的nswindow
似乎是相反的 你可以在所有子视图中循环并获取它们,你可以在视图中插入每个索引…我正在处理OSX非iOS。。。但是+1,因为我可以搜索类似的函数。啊,在这种情况下,这看起来有点粗糙,但是你可以添加一个类别来执行以下操作:谢谢,我需要了解这个解决方案在性能方面是否比SortSubviewsusingFunctions更好没有问题!我不能权威地说它会更快,但我的想法是肯定的。这取决于sortSubviewUsingFunction:context:的内部结构,我无法对此进行评论。然而,我认为它的工作原理是这样的:1)操作子视图指针的内部数组,然后2)重新绘制UI。当然,我们的步骤1会更快,因为它不像排序那样遍历所有子视图。对于步骤2,它可能更快或相等,因为实现要么重新绘制所有(我们的更快),要么只重新绘制更改(相等),如果性能对你的应用程序来说真的很关键,你可能会想对不同的方法进行基准测试——很抱歉,我无法理解compareViews函数的原型。它是否混合使用了Objective-c和c?Objective-c是c的超集,因此这是客观的CLOOK,就像OP询问的NSView
s这只适用于UIView
s您不需要在父视图之前使用子视图。添加子视图(子视图,索引)进行交换吗?经过一些测试后,使用NSView类中的SortSubviewUsingFunction不是更合适吗。只需再次添加视图就可以了。不需要删除。文档说它从10.0开始就存在,而不是10.10。因此也适用于低于10.10的目标。