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

Nos*_*tap 65 objective-c uiview ios setneedsdisplay swift

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

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

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

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

Amo*_*kar 128

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

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

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

例:

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

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


Mik*_*ler 11

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

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


Wei*_*ang 5

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

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

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