67

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

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

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

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

4

5 回答 5

130

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

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

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

例子:

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

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

于 2012-05-30T14:32:23.950 回答
11

你只需要调用-setNeedsDisplayUIView 子类来绘制它们的内容-drawRect:

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

于 2012-05-30T14:33:15.323 回答
6

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

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

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

于 2012-05-30T14:40:24.757 回答
3

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

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

如果你只想改变框架、按钮的位置、标签……你可以打电话setNeedLayoutlayoutIfNeeded

于 2016-06-29T04:08:15.020 回答
1

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

于 2017-04-01T11:26:01.370 回答