我什么时候需要在iOS中调用setNeedsDisplay?

时间:2012-05-30 14:28:04

标签: ios objective-c swift uiview setneedsdisplay

创建iOS应用时,我很困惑何时需要拨打setNeedsDisplay?我知道它与更新/重绘UI有关;但是,每当我改变任何观点时,是否需要调用它?

例如,我是否需要调用它:

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

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

5 个答案:

答案 0 :(得分:125)

如果你在UIView的子类中覆盖drawRect,你应该只调用setNeedsDisplay,它基本上是在屏幕上绘制某些东西的自定义视图,比如线条,图像或像矩形一样的形状。

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

当您将imageView或UIButton添加为子视图或对任何子视图进行更改时,您无需调用此方法。

示例:

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:5)

当您想要明确刷新视图时,应调用

setNeedsDisplay:。它只是设置一个内部标志,iOS UI系统将在稍后的适当时间调用drawRect:

听起来应该在更新任何可能改变演示文稿的属性时始终调用它。但事实并非如此。几乎所有的标准UI控件都已经处理过了。我相信无论何时修改标准UI组件(视图)的属性,都会在内部触发setNeedsDisplay:,并重新绘制受影响的区域。 (在您列出的所有情况下)

但是,如果您创建自己的视图,请实施自己的drawRect:,并希望在更改内容时更新该视图,则必须明确调用setNeedsDisplay:

答案 3 :(得分:2)

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

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

如果您只想更改框架,按钮位置,标签......,您可以拨打setNeedLayoutlayoutIfNeeded

答案 4 :(得分:1)

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