gpt4 book ai didi

ios - UIView insertSubview atIndex 移动 subview 的奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:35:53 27 4
gpt4 key购买 nike

我有一个 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 实际上移动了 CALayer。这是否意味着 self.subviews 只是一个辅助函数,用于获取与基于 self.layer.sublayers 的 CALayer 关联的 UIView?无论如何,我找到了我的罪魁祸首,看起来我对 CALayers 到 subview 的理解肯定存在缺陷。

最佳答案

这很有趣。

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

在你的例子中,我假设你的高亮层在索引 0 处,这就是为什么当你在索引 1 处插入 subview 时它会在 subviews 数组中的 0 位置,因为它的支持层实际上在它下面所有其他 subview 和您用来突出显示的 CALayer 之上。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com