【问题标题】:When do I need to call setNeedsDisplay in iOS?我什么时候需要在 iOS 中调用 setNeedsDisplay?
【发布时间】:2012-06-04 19:23:55
【问题描述】:

在创建 iOS 应用程序时,我不知道什么时候需要致电 setNeedsDisplay?我知道这与更新/重绘 UI 有关;但是,每次我改变任何观点时都需要调用它吗?

例如,我需要调用它吗:

  • 以编程方式更改文本字段中的文本后
  • 更改视图的背景时?
  • 当我在 viewDidLoad 中进行更改时?
  • 在 viewDidAppear 中怎么样?

有人能给我一些关于何时使用此方法的一般指导吗?

【问题讨论】:

  • 这是所有计算中名字最差的调用之一。它应该简单地称为 setNeedsDraw。 setNeedsLayout 标记要重做的布局(约束、框架)。 setNeedsDraw 标记要重做的 draw#rect 调用。就是这么简单。

标签: ios objective-c swift uiview setneedsdisplay


【解决方案1】:

只有在 UIView 的子类中重写 drawRect 时才应该调用 setNeedsDisplay,UIView 基本上是在屏幕上绘制某些东西的自定义视图,例如线条、图像或矩形等形状。

因此,当您对该绘图所依赖的少数变量进行更改并让视图表示该更改时,您应该调用 setNeedsDisplay,您需要调用此方法,该方法在内部将调用 drawRect 并重绘组件。

当你添加一个imageView或一个UIButton作为子视图或对任何子视图进行更改时,你不需要调用这个方法。

示例:

您有一个显示移动圆圈的视图,您可以触摸并移动它,也可以是基于计时器的动画。 现在为此,您将需要一个自定义视图,该视图在给定的中心和给定的半径处绘制一个圆。 这些被保存为实例变量,它们被修改为通过改变圆的中心来移动圆,或者通过增加圆的半径来使其变大。

现在,在这种情况下,您可以在循环和计时器中修改这些变量(中心或半径),或者可以在 touchesEnded 和 touchesMoved 方法中由您的手指修改。 要反映此属性的更改,您需要重绘此视图,您将为其调用 setNeedsDisplay。

【讨论】:

  • 在我的视图子类中更改图层或视图的框架后也是如此?
【解决方案2】:

当您更改视图自定义绘图所依赖的属性时,您将调用 setNeedDisplay。它会显式调用drawRect:方法。

【讨论】:

    【解决方案3】:

    我认为@Amogh Talpallikar 说的很清楚。我只想再讨论一件事。

    事实上,你应该避免覆盖drawRect,除非你真的需要它,因为它会导致性能下降。你可以参考这个https://yalantis.com/blog/mastering-uikit-performance/

    如果您只想更改框架、按钮位置、标签……您可以致电setNeedLayoutlayoutIfNeeded

    【讨论】:

      【解决方案4】:

      setNeedsDisplay: 应该在您想要显式刷新视图时调用。它只是设置了一个内部标志,iOS UI 系统会在稍后的适当时间调用drawRect:

      当你更新任何可能改变显示的属性时,听起来应该总是调用它。但事实并非如此。几乎所有的标准 UI 控件都已经处理了这个问题。我相信每当你修改标准 UI 组件(视图)的属性时,setNeedsDisplay: 会在内部触发,并且受影响的区域会被重绘。 (在您列出的所有情况下)

      但是,如果您创建自己的视图,实现其自己的drawRect:,并希望在更改某些内容时更新它,则必须显式调用setNeedsDisplay:

      【讨论】:

        【解决方案5】:

        您只需要在使用-drawRect: 绘制其内容的 UIView 子类上调用 -setNeedsDisplay

        对于标签和其他标准控件,更改文本会自动导致标签重绘,因此您无需自己执行此操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多