如何在自定义 UICollectionView 的旋转后触发 drawrect?

Posted

技术标签:

【中文标题】如何在自定义 UICollectionView 的旋转后触发 drawrect?【英文标题】:how to trigger drawrect after rotation for a custom UICollectionView? 【发布时间】:2015-10-18 05:30:35 【问题描述】:

对于具有客户 UICollectionViewCell 和 UICollectionViewLayout 的自定义 UICollectionView 在设备旋转后如何触发重绘(即调用 drawrect)?

自定义 UICollectionViewCell 的额外功能:

    override func drawRect(rect: CGRect) 
        let path = UIBezierPath(roundedRect: self.bounds.insetBy(dx: 1, dy: 1), cornerRadius: 50)
        path.lineWidth = 3
        UIColor.blueColor().setStroke()
        path.stroke()
    

旋转前

旋转后(布局已更新,注意到标签已移动,但在 drawRect 中绘制的椭圆没有,并且日志显示旋转时未调用“drawRect”)

【问题讨论】:

Redrawing a view in ios的可能重复 【参考方案1】:

您需要在轮换后致电cell.setNeedsDisplay()。这将导致单元格的drawRect: 方法再次被触发。

【讨论】:

从哪里来?是否有必要从我的自定义布局类“prepareLayout”函数中遍历所有可见单元格? setNeedsDisplay 方法触发重新绘制调用它的视图。何时调用,在何处调用完全取决于个人实现。进入流程后,您更改了一些数据,这可能导致潜在的 UI 更改,然后您调用此方法以反映 UI 上的数据更改。是的,这只会重绘调用它的目标视图。因此,如果您的数据在 2 个单元格上发生更改并且您想重绘它们,那么在这两个单元格上调用它。希望这是有道理的! 谢谢 - 有趣的是,从 viewController 中的 collectionView(或包含它的父视图)上调用这个(即 setNeedsDisplay)不起作用,但是从 viewController 中访问布局并循环遍历所有可见单元格确实有效 PS 我发现我还必须在自定义 UICollectionViewCell 的“prepareForReuse”方法中放置一个“setNeedsDisplay”行,因为使用的一些重用单元仍然是尺寸错误...【参考方案2】:

我刚刚发现了一个更简单的解决方案来解决这个问题。在您的自定义单元实现中,将contentMode 属性(在 UIView 上)设置为Redraw。这将导致setNeedsDisplay: 在单元格边界发生变化时被自动调用。

【讨论】:

以上是关于如何在自定义 UICollectionView 的旋转后触发 drawrect?的主要内容,如果未能解决你的问题,请参考以下文章

在自定义 UICollectionView 中出列时返回错误的单元格

UICollectionView 单元格阴影

UICollectionView 包裹在 UIViewController 中

以编程方式禁用 UICollectionView 中的垂直滚动

在 Swift 中更改 UICollectionView 的数据源

无法在 Swift 3 中调用非函数类型“UICollectionView”的值