Swift中UICollectionView子视图约束布局时drawRect绘制位置异常
UICollectionViewCell子视图drawRect绘制偏移问题解决
我在基于Apple《Implementing Modern Collection Views》的代码开发时遇到了绘图偏移问题:在UICollectionViewCell的contentView中添加自定义UIView子类,通过drawRect方法在子视图中心绘制十字,但给子视图设置leading偏移20的约束后,十字并未出现在子视图中心,反而跟着偏移了20点;只有将leading约束常量改为0时,十字才会回到子视图中心。
问题重现步骤
- 创建自定义UIView子类
TextCellDrawingSubView,在drawRect方法中使用self.center获取中心点绘制十字 - 在
TextCell类中添加该子视图属性 - 在
configure方法中添加子视图并设置约束:宽高固定50pt,顶部对齐contentView,leading相对于contentView左侧偏移20pt - 运行项目后观察到十字偏移,调整leading约束为0后十字恢复居中
问题原因
self.center是视图相对于父视图坐标系的中心点坐标,而drawRect方法中的绘图操作基于视图自身的bounds坐标系进行。当子视图通过约束在父视图中偏移时,self.center的坐标值会包含这个偏移量,用它计算绘图位置自然会偏离子视图自身中心。而self.bounds.midX和self.bounds.midY是视图自身bounds范围内的中心点,不受父视图布局位置影响,是绘图时获取自身中心的正确方式。
解决方案
将drawRect中获取中心点的代码替换为基于bounds的计算:
// 原代码 let viewCenter = self.center // 修改后代码 let viewCenter = CGPoint(x:self.bounds.midX, y:self.bounds.midY)
内容的提问来源于stack exchange,提问作者Ugo
相关产品推荐
相关产品推荐

