更改NSView子视图顺序

Mat*_*oal 6 cocoa objective-c nsview subviews

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

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

Axe*_*min 6

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

[self.view addSubview:myView positioned:NSWindowBelow relativeTo:myViewInBackground];
Run Code Online (Sandbox Code Playgroud)

查看文档 ; 根据我的经验NSWindowBelow,NSWindowAbove虽然似乎有所逆转.


Mar*_*ace 5

它非常简单,您可以使用比较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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Min*_*bil -6

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

[self.view insertSubview:view1 atIndex:2]
[self.view insertSubview:view1 aboveSubview:0]
[self.view insertSubview:view1 belowSubview:1]
Run Code Online (Sandbox Code Playgroud)

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

  • 看起来OP正在询问“NSView”,这仅适用于“UIView” (5认同)