• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 16:04:56 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap