OStack程序员社区-中国程序员成长平台

标题: ios - UIView insertSubview atIndex 移动 subview 的奇怪行为 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 16:04
标题: ios - UIView insertSubview atIndex 移动 subview 的奇怪行为

我有一个 UIView,在这种情况下有 4 个 subview 。我希望能够更改 subview 的顺序,但我似乎无法使用

 [UIView insertSubview: atIndex:]

在一种特定情况下,如果我调用它来将一个项目从索引 2 移动到索引 1,它会将其放置在索引 0 处。 这是调试器的输出:

(lldb) po self.subviews
<__NSArrayM 0x600003084f30>(
<ViewA: 0x7fb075cee4c0; frame = (20 12; 399.5 35.32); ...>,
<ViewB: 0x7fb075cf1b60; frame = (20 59.32; 399.5 27.5); ...>,
<ViewC: 0x7fb075cef2c0; frame = (20 98.82; 399.5 67); ...>,
<ViewD: 0x7fb075cfa750; baseClass = UIButton; frame = (20 177.82; 399.5 35); ...>)

(lldb) po self.subviews[2]
<ViewC: 0x7fb075cef2c0; frame = (20 98.82; 399.5 67); ...>

(lldb) po [self insertSubview:self.subviews[2] atIndex:1]
(lldb) po self.subviews
<__NSArrayM 0x600003085020>(
<ViewC: 0x7fb075cef2c0; frame = (20 98.82; 399.5 67); ...>,
<ViewA: 0x7fb075cee4c0; frame = (20 12; 399.5 35.32); ...>,
<ViewB: 0x7fb075cf1b60; frame = (20 59.32; 399.5 27.5); ...>,
<ViewD: 0x7fb075cfa750; baseClass = UIButton; frame = (20 177.82; 399.5 35); ...>)

如您所见,我试图将 ViewC 移到 ViewA 之后,但它却移到了它之前。 如果我改为使用

[UIView insertSubView: aboveSubview:]

效果很好。

我尝试在插入之前删除 View ,但这给了我相同的结果。这很奇怪,我觉得我在这里错过了 UIView 的一个基本部分。 我可以接受这种解决方法,但我真的更希望了解它为什么不起作用。

[更新] 事实证明,有一点额外的信息是必不可少的。我有一个额外的 CALayer 用于突出显示父 View 。因此,如果我禁用此 CALayer,则一切正常。 我可能是错的,但这意味着 insertSubviews 实际上移动了 CALayers。这是否意味着 self.subviews 只是一个辅助函数,用于获取与基于 self.layer.sublayers 的 CALayers 关联的 UIView?无论如何,我找到了罪魁祸首,看来我对 CALayers 到 subview 的理解肯定存在缺陷。



Best Answer-推荐答案


这很有趣。

UIView 只是 CALayer 的简单封装,它提供手势处理等功能。我们在屏幕上真正看到的是层树。似乎我们传递给 insertSubview:atIndex: 的 index 参数是层树中 View 层的索引,这会导致混淆。插入 subview 后,subviews数组是按照 View 的backing layer相对于其他 subview 的位置排列的。

在您的情况下,我假设您的突出显示层位于索引 0,这就是为什么当您在索引 1 处插入 subview 时,它位于 subviews 数组中的 0 位置,因为它的支持层实际上低于该位置在您用来突出显示的所有其他 subview 的 CALayer 之上。

关于ios - UIView insertSubview atIndex 移动 subview 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53624534/






欢迎光临 OStack程序员社区-中国程序员成长平台 (http://ostack.cn/) Powered by Discuz! X3.4