我有一个 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 的理解肯定存在缺陷。
这很有趣。
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/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) | Powered by Discuz! X3.4 |