Objective c 更改NSView子视图顺序

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

我正在使用一个显示不同句柄的自定义控件。我希望确保所选句柄比其他句柄具有Z索引栅格

有没有办法交换视图顺序?
我找到了这个函数
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的目标。