将深层次的子视图置于最前面

3
我有这样的子视图顺序:
父视图控制器 - 子视图1 - 子视图2 - 子子视图1 - 子子视图2 - 子子子视图1
现在我需要将非常深层的子子子视图1带到屏幕最前面。我查阅了文档,发现bringSubviewToFront可能行不通,因为它只会将子视图置于其父视图之前。将父视图(子视图2)与此一起置于前面也不是一个选项,因为它需要保持在子视图2下面。
重新排序几乎是不可能的,它是一个图形相关的顺序,并且有许多与之绑定的动画。

[parentView bringSubviewToFront:childView]; 应该能完成任务。 - Fahim Parkar
4个回答

6
您可以尝试将其放在窗户上:
[[UIApplication sharedApplication].keyWindow addSubview: Subsubsubview1];

或者使用以下方法帮助重新排序:

 insertSubview:atIndex:
 insertSubview:aboveSubview:
 insertSubview:belowSubview:

我担心会发生什么,因为它与其父级元素绑定了折叠动画 :( - Michal
我不得不重新排列视图,并使用了您列出的方法,所以我只是将您的答案标记为正确,以关闭此主题。感谢您的帮助! - Michal

1
你可以使用:

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

定义:

将一个视图插入到另一个视图的下方。 此方法会建立视图的强引用,并将其下一个响应者设置为接收器,也就是它的新父视图。 视图只能有一个父视图。如果视图已经有了父视图且不是接收器,则此方法会在将接收器设为其新父视图之前删除先前的父视图。

希望这可以帮助您。


1

设置深埋的子视图的标签:

[deeplyburiedSubview setTag:USE_A_DEFINED_CONSTANT_NOT_A_MAGIC_NUMBER];

然后在最上层的视图中调用:

[topMostView bringSubviewToFront:[topMostView viewWithTag:USE_A_DEFINED_CONSTANT_NOT_A_MAGIC_NUMBER]];


这看起来非常有前途,让我试试吧! :-) - Michal
没问题。标签的使用是一个有争议的话题,我听说一些苹果工程师反对它们,但我发现它们对于像这样的事情非常有用。你的经验可能会有所不同 :) - Cocoadelica
不幸的是,它并没有置顶 :( 我设置了标签,确定了父视图中的视图,调用了函数,但它并没有在前面 :/ - Michal
一旦你从标签处获得了对它的引用,你可以将它从当前的父视图中移除,并添加到最上层的父视图中。 - Cocoadelica
是的,不幸的是那样做太冒险了 :( 但还是谢谢您的帮助,我已经解决了。 - Michal

0

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接