iOS14 UITableViewCell & UICollectionViewCell 中还是乖乖使用 contentView 吧-程序员宅基地

技术标签: contentView  CollectionView  日常bug  UITableViewCell  iOS14  cell  

做过 iOS 开发的,一般都使用过 UITableView UICollectionView,也就会用到 UITableViewCell UIColletionViewCell,在 iOS14 之前,使用UITableViewCell 或者 UICollectionViewCell 添加控件的时候,不管使用 [self addSubview:]; 还是使用 [self.contentView addSubview:];,最后的视图层级都是一样的。但是在 iOS14 上,视图层级发生了一些变化。而这个变化,会影响到 cell 上面子控件的点击。

iOS14 之前,不管是 UITableViewCell 还是 UICollectionViewCell,不管使用 self 还是 self.contentView 亦或是 xib 添加控件,最后的视图层级由下到上都是 cell - contentView - custom subviews,其中 custom subviews 代表自己添加的控件。

iOS14 上,UITableViewCellUICollectionViewCell 的视图层级已经不一样了。

先看下 UITableViewCell

  • 代码创建 cell

    • 不添加任何控件,系统会自动创建出 contentView,视图层级由下到上为cell - contentView
    • 如果使用 [self addSubview:]; 添加控件,视图层级由下到上会变成 cell - custom subviews - contentView,这时候添加的控件在 contentView 下面,如果子控件有点击事件,会被 contentView 阻断掉
    • 如果使用 [self.contentView addSubview:]; 添加控件,视频层级由下到上会变成 cell - contentView - custom subviews,这时候跟 iOS14 之前是一致的。
  • xib 创建 cell

    • 由于在 xib 中,添加的控件全部是在 contentView 上的,所以跟 iOS14 是一致的,视图层级由下到上为 cell - contentView - custom subviews

继续看 UICollectionViewCell

  • 代码创建 cell

    • 不添加任何控件,系统不会自动创建 contentView,此时只有 cell;
    • 如果使用 [self addSubview:]; 添加控件,视图层级由下到上会变成 cell - custom subviews
    • 如果使用 [self.contentView addSubview:]; 添加控件,视图层级由下到上会变成 cell - contentView - custom subviews
  • xib 创建 cell

    • xib 中,不会显示出 contentView,直观上看到的就是控件直接加到了 cell 上,但是运行之后,系统还是自动创建出 contentView,视图层级由下到上是 Cell - contentView - added subviews

所以,iOS14 上面,UITableViewCell UICollectionViewCell 偷偷的变化了。如果之前有使用 [self addSubview:]; 这个方法直接添加视图,可能就会发现界面看起来没有任何问题,但是 UITableViewCell 里面的点击事件单单在 iOS14 上无效了。那解决方案就是使用 [self.contentView addSubview:]; 替代 [self addSubview:];

其实,通过上面不同情况的对比,可以发现不同层级确实不会影响显示效果,而是会影响 cell 子控件的点击效果,而且仅仅是 UITableViewCell 才会出现这种问题。不过随着系统的继续迭代,UICollectionViewCell 会不会发生变化就不一定了。

而且,使用 xib 创建 cell 的话,表现跟 iOS14 之前是一致的,并且使用 [self.contentView addSubview:]; 也是一致的。

还有,系统规范也已经说明了:

// UITableViewCell
// Custom subviews should be added to the content view.
@property (nonatomic, readonly, strong) UIView *contentView;

// UICollectionViewCell
@property (nonatomic, readonly) UIView *contentView; // add custom subviews to the cell's contentView

所以,我们不管是为了解决目前遇到的问题,还是为了防止以后再次出现这种问题,都应该使用 [self.contentView addSubview:]; 添加控件。

我自己做了个 demo ,运行可以清楚的看到不同情况下的效果,地址在这里,需要的可以点击下载。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jianghui12138/article/details/108891385

智能推荐

Pytorch加载本地自己整理好的cifar10或cifar100数据集,并进行训练_cifar100 pytorch-程序员宅基地

文章浏览阅读6.7k次,点赞11次,收藏49次。Pytorch加载本地自己整理好的cifar10数据集,并进行训练这里写自定义目录标题1.下载数据集2.解压3.复制移动4.修改tv.datasets.CIFAR10源码使用pytorch在线下载cifar10数据集时,经常报错,而且很慢,倘若下载cifar100,那等待时间可想而知了。为了不浪费时间等待,可以将数据集先下载到本地,在自行加载,下面介绍一种修改源码简单的方法。1.下载数据集(随意下载,官网地址:http://www.cs.toronto.edu/~kriz/cifar-10-pytho_cifar100 pytorch

大象机器人开源六轴协作机械臂myCobot 320 手机摄影技术!

这些问题标志着我后续研究的重点方向,需要我继续深入学习AVFoundation框架的使用,特别是其控制摄像头的具体方法,并探索如何将这些控制整合到机械臂的运动调整中,以确保最终拍摄出的视频质量符合预期。尽管目前市场上有许多稳定设备如平衡环架(gimbal)来辅助拍摄,以求达到稳定和多角度的拍摄效果,但在此篇文章中,我将探索一种独特的解决方案:通过将手机安装在机械臂的末端来进行拍摄,以实现那些传统方法难以捕捉的特殊视角。随着人工智能技术的不断进步和普及,AI与机器人的结合无疑将成为未来技术发展的重要趋势。

【计算机毕业设计】springboot党员之家服务系统小程序-程序员宅基地

文章浏览阅读342次,点赞6次,收藏8次。党员之家服务系统小程序的功能已基本实现,主要包括首页、个人中心、学生管理、教师管理、任务信息管理、报名信息管理、任务排名管理、学习资料管理、每日打卡管理、交流信息管理、回复信息管理、积极分子管理、党员信息管理、交流论坛、系统管理等。论文主要从系统的分析与设计 、数据库设计和系统的详细设计等几个方面来进行论述,系统分析与设计部分主要论述了系统的功能分析、系统的设计思路,数据库设计主要论述了数据库的设计,系统的详细设计部分主要论述了几个主要模块的详细设计过程。

Failed to discover available identity versions when contacting http://controller:35357/v3. 错误解决方式_caused by newconnectionerror('<urllib3.connection.-程序员宅基地

文章浏览阅读8.3k次,点赞5次,收藏12次。作为 admin 用户,请求认证令牌,输入如下命令openstack --os-auth-url http://controller:35357/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name admin --os-username admin token issue报错Failed to discover available identity versions whe._caused by newconnectionerror('

学校机房统一批量安装软件的方法来了_教室电脑 一起装软件-程序员宅基地

文章浏览阅读4.5k次。​可以在桌面安装云顷还原系统软件,利用软件中的网络对拷功能部署批量对拷环境,进行电脑教室软件的批量对拷安装与增量对拷安装。​_教室电脑 一起装软件

消息队列(kafka/nsq等)与任务队列(celery/ytask等)到底有什么不同?_任务队列和消息队列-程序员宅基地

文章浏览阅读3.1k次,点赞5次,收藏7次。原文链接:https://www.ikaze.cn/article/43写这篇博文的起因是,我在论坛宣传我开源的新项目YTask(go语言异步任务队列)时,有小伙伴在下面回了一句“为什么不用nsq?”。这使我想起,我在和同事介绍celery时同事说了一句“这不就是kafka吗?”。那么YTask和nsq,celery和kafka?他们之间到底有什么不同呢?下面我结合自己的理解。简单的分析一..._任务队列和消息队列

随便推点

rsync+inotify实现NFS实时同步数据以及压力测试_centos6.5 rsync ino-程序员宅基地

文章浏览阅读1.2k次。1第一步:搭建NFS服务器关于NFS服务器的搭建请参考http://blog.csdn.net/qq_30256711/article/details/78463940第二步:rsync同步实现关于rsync同步请参考http://blog.csdn.net/qq_30256711/article/details/78539342第三步:inotify结合rsync实现实时同步_centos6.5 rsync ino

第11章 软件工程

2.可重复级:建立了基本的项目管理过程和实践来跟踪项目费用,进度,功能特性。5.优化级:加强了定量分析,通过过程质量反馈,新观念,新技术的反馈。1.初始级:软件过程杂乱无章,没有明确定义的步骤,英雄式核心人物。定量管理(CL4):已定量管理的过程的制度化。已管理(CL2):已管理的过程的制度化。已定义(CL3):已定义的过程的制度化。3.已定义级:过程文档化,标准化。4.已管理级:软件过程和产品质量。定量管理的:已度量和控制。优化的:集中于过程改进。已管理的:为项目服务。已定义的:为组织服务。

论文阅读--Search to Distill

标准的知识蒸馏(KD)方法将笨重的教师模型的知识蒸馏到具有预定义架构的学生模型的参数中。然而,神经网络的知识,即网络在给定输入条件下的输出分布,不仅取决于其参数,还取决于其架构。因此,对于KD的一种更广义的方法是将教师的知识蒸馏到学生的参数和架构中。为了实现这一点,我们提出了一种新的基于架构的知识蒸馏(AKD)方法,该方法找到最适合蒸馏给定教师模型的学生模型(对于教师来说是珍珠)。具体来说,我们利用带有我们的KD引导奖励的神经架构搜索(NAS)来搜索最适合给定教师模型的学生架构。

Docker知识点汇总表格总结

Docker知识比较全面的总结,使用表格总结结合示例,一目了然,运维参考以及面试参考皆可

Matplotlib.pyplot库引入失败?_如何导入 matplotlib.pyplot 导入失败-程序员宅基地

文章浏览阅读174次。用Python的人总少不了与Matplotlib接触,可是我们在引入时Python少不了报错。此时,我们就需要在错误中寻找线索。_如何导入 matplotlib.pyplot 导入失败

uni-app,uni-table表格操作_uniapp table-程序员宅基地

文章浏览阅读8.5k次,点赞2次,收藏11次。使用uni-ui UI框架实现表格加分页功能,uni-table 和uni-pagination 组件的使用示例加完整代码。_uniapp table

推荐文章

热门文章

相关标签