更改NSView子视图顺序

时间:2012-07-03 13:09:25

标签: objective-c cocoa nsview subviews

我正在使用提供不同句柄的自定义控件。我想确保所选的句柄具有Z-index格式,然后其他句柄处理。

有没有办法交换视图订单? 我找到了这个函数sortSubviewsUsingFunction:context:,但我无法理解这是否是正确的解决方案。

4 个答案:

答案 0 :(得分:6)

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

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

结帐documentation;根据我的经验NSWindowBelowNSWindowAbove似乎有所逆转。

答案 1 :(得分:5)

非常简单,您可以使用比较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;
        }
    }
}

答案 2 :(得分:-3)

是的,sortSubviewsUsingFunction:context:可以做你想要做的事情,但是如果你想要的只是一个特定的视图坐在(无序的)其他人之上,它可能会有点过分。在这种情况下,您应该查看bringSubviewToFront:的{​​{1}}方法。这样,你可以在你的IBAction中做这样的事情来提出句柄:

UIView

假设handle是一个/从UIView继承的对象。如果这不是您想要的,那么请务必使用[self.view bringSubviewToFront: handle]; ,在这种情况下,您需要更改每个子视图的单个标记属性,并进行相应的排序。

答案 3 :(得分:-5)

根据我的理解,您可以循环查看所有视图并将它们添加到数组中,然后您可以选择将它们添加到带索引的视图中。您可以使用以下功能。

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

然后你可以根据需要交换它的订单..