插入视图控制器视图的层次结构时,UIView不会直接放在集合视图单元格的顶部

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入视图控制器视图的层次结构时,UIView不会直接放在集合视图单元格的顶部相关的知识,希望对你有一定的参考价值。

我有一个水平的集合视图,哪些单元格不覆盖整个屏幕。我想将UIView插入到视图控制器的层次结构中,并将其放在所选单元格的顶部。

为了做到这一点,我需要所选单元格的框架。为了得到它,我在didSelectItem方法中尝试了以下内容:

1)

let frame = collectionViewLayout.layoutAttributesForItem(at: indexPath)?.frame

2)

 let selectedCell = collectionView.cellForItem(at: indexPath)

在这两种情况下,我得到相同的结果,这是正确的结果。要将UIView插入层次结构,我使用以下代码:

    self.view.insertSubview(mimicView, aboveSubview: collectionView)
    mimicView.frame = frame

    print ("mimicView frame:", mimicView.frame)

print语句打印右侧框架(与所选单元格的框架相同)。但是,mimicView位置在绘制时并不完全位于单元格的顶部。对于第一个细胞,viewy具有小的负值。对于随后的细胞,view进一步向左侧进一步绘制。因此,例如,对于第二个单元格,view几乎在第三个单元格之上绘制。而对于第三个,几乎在第五个之上。在Interface Debugger中,我看到它的x值太大而y值是一个小的负数(如-20 - -40点),但是,print语句仍然显示与所选单元格相同的值。

如果有人知道为什么会这样,我真的很感谢你的帮助。

答案

确保将单元格的bounds转换为视图的坐标系(要添加新子视图的视图),并使用生成的矩形作为覆盖视图的frame

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    guard let cell = collectionView.cellForItem(at: indexPath) else { return }
    let cellFrame = cell.convert(cell.bounds, to: view)

    let coverView = UIView(frame: cellFrame)
    coverView.backgroundColor = .darkGray
    view.addSubview(coverView)
}

以上是关于插入视图控制器视图的层次结构时,UIView不会直接放在集合视图单元格的顶部的主要内容,如果未能解决你的问题,请参考以下文章

如何在不将控制器添加到视图层次结构并使其可见的情况下从 UIViewController 获取 UIView?

界面生成器和视图层次结构

iOS CALayer.zPosition 不会超越视图层次结构吗?

如何将视图带到 UIView 层次结构的顶部

如何在复杂的视图层次结构中呈现相机

获取 uiview 层次结构顶部的对象