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
将子视图带到前面
在这里可能不起作用,因为它只会将子视图带到他父视图的前面。将父视图(子视图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];
应该完成这项工作