7

I'm working at a custom control that presents different handles. I want to be sure that the selected handle has a Z-index grater then the others handles.

Is there a way to swap view order? I found this function sortSubviewsUsingFunction:context: but i can't understand whether this is the right solution.

4

4 回答 4

7

Cocoa 在 macOS 10.0 中引入了一个新的 API。
它类似于iOS,你可以传递另一个视图显示在下方或上方。

[self.view addSubview:myView positioned:NSWindowBelow relativeTo:myViewInBackground];

查看文档;根据我的经验NSWindowBelowNSWindowAbove但似乎颠倒了。

于 2015-08-09T07:21:05.807 回答
6

这很简单,您可以使用比较 2 个子视图的函数来重新排序它们。这是一个基于视图标签的简单解决方案:

[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;
        }
    }
}
于 2012-07-03T13:20:10.780 回答
-4

是的,sortSubviewsUsingFunction:context:可以做你想做的事,但是如果你只想让一个特定的视图位于(无序的)其他视图之上,那可能就有点过头了。在这种情况下,您应该bringSubviewToFront:研究UIView. 这样,您可以在 IBAction 中执行类似的操作来调出句柄:

[self.view bringSubviewToFront: handle];

假设句柄是一个/继承自 UIView 的对象。如果这不是您要查找的内容,那么请务必使用sortSubviewsUsingFunction:context:,在这种情况下,您需要更改每个子视图的各个标签属性,并进行相应的排序。

于 2012-07-03T13:19:21.467 回答
-6

正如我从您的问题中了解到的那样,您可以循环查看所有视图并将它们添加到数组中,然后您可以选择使用索引将它们添加到视图中......并且您具有以下功能。

[self.view insertSubview:view1 atIndex:2]
[self.view insertSubview:view1 aboveSubview:0]
[self.view insertSubview:view1 belowSubview:1]

然后你可以根据需要交换它的顺序..

于 2012-07-03T13:18:56.593 回答