【问题标题】:how to trigger drawrect after rotation for a custom UICollectionView?如何在自定义 UICollectionView 的旋转后触发 drawrect?
【发布时间】: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”)

【问题讨论】:

标签: ios swift uikit uicollectionview uicollectionviewlayout


【解决方案1】:

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2017-05-29
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多