我有这个子视图的顺序:
- 父视图控制器
- 子视图 1
- 子视图 2
- 子视图 1
- 子视图 2
- 子子视图 1
现在我需要将非常深的Subsubsubview 1带到屏幕的最前面。我查看了文档,bringSubviewToFront
可能无法在这里工作,因为它只会将子视图带到他父母的前面。将父视图(子视图 2)与它一起放在前面不是一种选择,因为它需要保持在子视图 2下方。
重新排序几乎是不可能的,它是一个依赖于图形的顺序,并且绑定了很多动画。
我有这个子视图的顺序:
现在我需要将非常深的Subsubsubview 1带到屏幕的最前面。我查看了文档,bringSubviewToFront
可能无法在这里工作,因为它只会将子视图带到他父母的前面。将父视图(子视图 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;
定义 :
在视图层次结构中的另一个视图下方插入一个视图。该方法建立了对视图的强引用,并将其下一个响应者设置为接收者,即其新的超级视图。视图只能有一个超级视图。如果视图已经有一个超级视图并且该视图不是接收者,则此方法会在使接收者成为其新的超级视图之前删除先前的超级视图。
希望这可以帮助。
设置深埋子视图的标签:
[deeplyburiedSubview setTag:USE_A_DEFINED_CONSTANT_NOT_A_MAGIC_NUMBER];
然后在最顶部的视图中简单地调用:
[topMostView bringSubviewToFront:[topMostView viewWithTag:USE_A_DEFINED_CONSTANT_NOT_A_MAGIC_NUMBER]];
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)