Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将位置较深的子视图置于最前面_Ios_Objective C_Subview - Fatal编程技术网

Ios 将位置较深的子视图置于最前面

Ios 将位置较深的子视图置于最前面,ios,objective-c,subview,Ios,Objective C,Subview,我有以下顺序的子视图: 父视图控制器 子视图1 子视图2 子视图1 子视图2 子视图1 现在,我需要将非常深的子视图1放到屏幕的最前面。我浏览了文档,发现将子视图带到前面在这里可能不起作用,因为它只会将子视图带到他父视图的前面。将父视图(子视图2)与它一起放在前面不是一个选项,因为它需要保持在子视图2下方 重新排序几乎是不可能的,它是一个依赖于图形的顺序,并且绑定了许多操作。您可以尝试将其放置在窗口本身上: [[UIApplication sharedApplication].k

我有以下顺序的子视图:

  • 父视图控制器
    • 子视图1
    • 子视图2
      • 子视图1
      • 子视图2
        • 子视图1
现在,我需要将非常深的子视图1放到屏幕的最前面。我浏览了文档,发现
将子视图带到前面
在这里可能不起作用,因为它只会将子视图带到他父视图的前面。将父视图(子视图2)与它一起放在前面不是一个选项,因为它需要保持在子视图2下方


重新排序几乎是不可能的,它是一个依赖于图形的顺序,并且绑定了许多操作。

您可以尝试将其放置在窗口本身上:

[[UIApplication sharedApplication].keyWindow addSubview: Subsubsubview1];
或使用以下方法帮助重新排序:

 insertSubview:atIndex:
 insertSubview:aboveSubview:
 insertSubview:belowSubview:
您可以使用:

- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;
定义:

在视图层次中的另一个视图下插入视图。 此方法建立了视图的强引用,并将其下一个响应者设置为接收器,即新的superview。 视图只能有一个superview。如果视图已经有一个superview,而该视图不是接收器,则此方法会在使接收器成为其新superview之前删除以前的superview


希望这有帮助。

设置深埋子视图的标记:

[深埋子视图设置标签:使用定义的常量而不是幻数]

然后在最上面的视图中,只需调用:


[topMostView将子视图带到前面:[topMostView视图带标记:使用“定义的”常量“而不是”幻数]

Swift 3中的递归算法:

/// Brings deeply placed subview to the front of the parent view.
///
/// - Parameters:
///   - view: Subview that should be bringed to the top.
///   - toFront: Parent view on which top should be placed the subview.
func bring(view: UIView, toFront parentView: UIView) {
    if !parentView.subviews.contains(view) {
        view.superview?.bringSubview(toFront: view)
        if let superview = view.superview {
            bring(view: superview, toFront: parentView)
        }
    }
}
用法:

bring(view: subview2.subsubview2.subsubsubview1, toFront: parentViewController.view)

我担心会发生什么,我和它的父母一起绑定了正在崩溃的动画:(我不得不重新排列视图,我使用了你列出的方法,所以我只想标记你的答案为正确,以便结束这个主题。感谢帮助!这看起来很有希望,让我试试!:-)没问题。标签的使用是一个有点争议的话题,我听到一些苹果的工程师对标签进行了抨击,但我发现它们非常适合这样做。YMMV:)不幸的是,它没有把它带到最上面:(我设置了标记,在父视图中标识了视图,调用了函数,但它不在前面:/一旦你从标记中引用了它,你就可以从它的当前超级视图中删除它,并将它添加到最上面的视图中?是的,不幸的是,这太危险了:(但感谢您的帮助,已经解决了问题。
[parentView-bringsubview-tofront:childView];
应该完成这项工作