UIView重新渲染布局时,不会触发draw函数

Posted

技术标签:

【中文标题】UIView重新渲染布局时,不会触发draw函数【英文标题】:when re-render layout of UIView, the draw function is not triggered 【发布时间】:2016-11-10 19:47:56 【问题描述】:

我正在使用 Xcode 8.1

我是 UIView 的子类:

class DrawingView: UIView 
   override func draw(_ rect: CGRect) 
        super.draw(rect)
        print("drawing...")
   

   override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 
      // re-renader the layout when finger moves
      setNeedsLayout()
      super.touchesMoved(touches, with: event)
   

当我运行我的应用程序时,上面的draw(...) 函数在应用程序启动时被调用一次。 (我看到了打印消息)

然后,我手指在屏幕上移动,我预计每次手指移动都应该调用draw(...)(因为我调用了setNeedsLayout()), 但是draw(...) 函数永远不会被调用。为什么?

【问题讨论】:

How Do I Force Redrawing (drawRect) of a SubView When it Changes Dimensions?的可能重复 【参考方案1】:

要触发视图重新绘制,请调用setNeedsDisplay(),而不是setNeedsLayout()

【讨论】:

调用setNeedsLayout() 将导致调用layoutSubviews()layoutSubviews() 的实现应该设置所有子视图的框架。尽管您可以在任何地方设置视图框架,但出于性能和代码可读性的考虑,建议您使用该方法进行设置。当你使用约束时,你不需要实现这个方法,框架是由自动布局系统为你使用约束设置的。

以上是关于UIView重新渲染布局时,不会触发draw函数的主要内容,如果未能解决你的问题,请参考以下文章

突变后的 Apollo 更新不会触发重新渲染

Vue 组件 prop 更改不会触发重新渲染

使用带有graphql的react hooks时,按钮元素中的onClick不会触发react-table中的重新渲染

Vuex 全局状态更改不会触发 Nuxt 中 v-for 循环中的重新渲染组件

回收时不会重新布局自定义 iOS UITableViewCells

状态更新不会触发条件渲染组件中的重新渲染