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

当创build一个iPhone / iPad的应用程序,我很困惑什么时候我需要调用setNeedsDisplay? 我知道这与更新/重绘用户界面有关。 然而,每当我改变我的观点时,我是否需要调用它?

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

  • 在编程后更改文本字段中的文本
  • 当改变一个视图的背景?
  • 当我在viewDidLoad中进行更改时?
  • 如何看待这个问题?

有人可以给我一些关于什么时候使用这种方法的一般准则吗? 谢谢

你应该只调用setNeedsDisplay,如果你重写UIView的子类中的drawRect,这基本上是一个自定义的视图画在屏幕上的东西,像线条,图像或形状像一个矩形。

所以你应该调用setNeedsDisplay,当你对这个graphics所依赖的几个variables进行修改时,为了表示这个修改,你需要调用这个方法,在内部调用drawRect和重绘组件。

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

例:

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

现在在这种情况下,要么你将修改这些variables(中心或半径)在一个循环和计时器,或者可能是你的手指在touchesEnded和touchesMoved方法。 为了反映这个属性的变化,你需要重画这个你要调用setNeedsDisplay的视图。

你只需要真正的需要在UIView子类上调用-setNeedsDisplay来使用-drawRect:来绘制它们的内容。

对于标签和其他标准控件,更改文本将自动重新绘制标签,所以您不需要自己做这个。

setNeedsDisplay:当你想明确地刷新你的视图时应该被调用。 它只是设置一个内部标志,iOS UI系统将在稍后的适当时间调用drawRect:

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

但是,如果您创build了自己的视图,请实现自己的drawRect:并且在更改某些内容时要更新,您必须显式调用setNeedsDisplay:

我认为@Amogh Talpallikar明确表示。 而我只想讨论一件事。

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

如果你只想改变框架,button的位置,标签,…你可以调用setNeedLayoutlayoutIfNeeded

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