关于UICollectionView 插入子视图在其与cell之间的问题的解决

问题

最近做带有背景游标的标签的时候,使用UICollectionView进行实现过程中,在其View中添加子视图,会盖住Cell,导致Cell展示出问题。而此时的想法目的是要将view作为cell的背景进行展示,百说不如一见,如下截图展示的当前问题:

问题界面

原因

进行了几次尝试之后,发现在collectionView没有显示的时候,是不会进行cell视图的渲染的,也就是说当前的collectionView中没有cell类别的子视图,此时直接加入子视图会在渲染cell类别子视图之前,而当collectionView可见的时候,collectionView再去渲染显示cell(推测系统可能使用insertView:Index:方法),此时让cell层级插入到了UICollectionView与刚刚加到CollectionView视图之间了,进而导致了当前的问题的发生。

此时CollectionView子视图并没有cell
页面层级

解决方案

知道原因了,再去解决这样的问题,就很方便了。我们可以将View的添加放在渲染cell之后,这样就能避免系统渲染cell影响我们视图的层级结构导致画面被遮挡的问题了。

    
    [self.topTagCollectionView reloadData];
    //强制刷新页面
    [self.topTagCollectionView layoutIfNeeded];

    //获取第一个cell在CollectionView的坐标
    UICollectionViewCell *cell = [self.topTagCollectionView cellForItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    CGRect idcadorViewLocation = [self.topTagCollectionView convertRect:cell.frame toView:self.topTagCollectionView];
    self.idcadorView.frame = idcadorViewLocation;
    self.idcadorView.layer.cornerRadius = idcadorViewLocation.size.height * 0.5;
    //将背景View插入到UICollectionView与Cell之间
    [self.topTagCollectionView insertSubview:self.idcadorView atIndex:0];

在进行CollectionView reload之后,我们可以强制CollectionView渲染界面,使用 layoutIfNeeded进行界面的强制刷新,之后再去插入我们想加入的视图,这样就能将加入的视图放入到UICollectionViewCell之间了,从而达到我们想要的效果。

最终效果
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,795评论 1 32
  • UICollectionView是我们常说的集合视图,它在iOS 6中引入,是iOS开发者中最受欢迎的UI元素之一...
    pro648阅读 13,677评论 18 44
  • 这里就是对UICollectionView的一个个人总结,不喜勿喷,如有不妥之处,望请指正🙏🙏🙏 1.简介 UIC...
    Kity_Pei阅读 11,517评论 0 4
  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 10,032评论 0 12
  • 2017.02.22 可以练习,每当这个时候,脑袋就犯困,我这脑袋真是神奇呀,一说让你做事情,你就犯困,你可不要太...
    Carden阅读 5,190评论 0 1