You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:30:57