菜鸟教程小白 发表于 2022-12-13 16:04:56

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


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

<pre><code>
</code></pre>

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

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

(lldb) po self.subviews
&lt;ViewC: 0x7fb075cef2c0; frame = (20 98.82; 399.5 67); ...&gt;

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

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

<pre><code>
</code></pre>

<p>效果很好。</p>

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

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

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

<p>在您的情况下,我假设您的突出显示层位于索引 0,这就是为什么当您在索引 1 处插入 subview 时,它位于 <code>subviews</code> 数组中的 0 位置,因为它的支持层实际上低于该位置在您用来突出显示的所有其他 subview 的 CALayer 之上。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UIView insertSubview atIndex 移动 subview 的奇怪行为,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/53624534/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/53624534/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UIView insertSubview atIndex 移动 subview 的奇怪行为