我有一个水平集合视图,这些单元格不会覆盖整个屏幕。我想将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
位置在绘制时并不完全位于单元格的顶部。对于第一个单元格,view
的{{1}}具有较小的负值。对于后续单元格,y
被进一步向左侧绘制。因此,例如,对于第二个单元格,view
几乎在第三个单元格之上绘制。而对于第三个,几乎在第五个之上。在view
中,我发现其Interface Debugger
值太大而x
值是一个小的负数(如y
- -20
点),但是, print语句仍然显示与所选单元格相同的值。
如果有人知道为什么会这样,我真的很感谢你的帮助。
答案 0 :(得分:1)
确保将单元格的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)
}