将深刻的子视图带到最前面

时间:2013-08-20 09:13:30

标签: ios objective-c subview

我有这个子视图的顺序:

  • 父视图控制器
    • Subview 1
    • 子视图2
      • 子视图1
      • 子视图2
        • 子目录1

现在我需要将非常深的子子视图1 带到屏幕的最前面。我查看了文档,bringSubviewToFront可能无法在这里工作,因为它只会将子视图提供给他的父母。将父级(子视图2)与它一起放在前面不是一个选项,因为它需要保持在子视图2之下。

重新排序是不可能的,它是一个依赖于图形的顺序,并且有许多绑定它的aniamtions。

4 个答案:

答案 0 :(得分:6)

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

[[UIApplication sharedApplication].keyWindow addSubview: Subsubsubview1];

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

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

答案 1 :(得分:1)

您可以使用:

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

定义:

在视图层次结构中的另一个视图下插入视图。 该方法建立了一个强大的参考,以查看和设置其接收器的下一个响应者,这是它的新超级视图。 视图只能有一个超级视图。如果视图已经具有超视图并且该视图不是接收者,则此方法会在使接收器成为新的超级视图之前删除先前的超视图。

希望这有帮助。

答案 2 :(得分:1)

设置深埋子视图的标记:

[deeplyburiedSubview setTag:USE_A_DEFINED_CONSTANT_NOT_A_MAGIC_NUMBER];

然后在最顶层的视图中简单地调用:

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

答案 3 :(得分: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)