drawRect 是什么

drawRect 方法是 iOS 系统提供给我们自定义绘图的方法.如果我们想要绘制一些自定义的内容,就需要在 UIView 类中重写 drawRect 方法,在这个方法内进行绘图操作.

如下的方法就是在 drawRect 方法中简单的绘制一条线

drawRect 调用时机

如果视图中包含我们用 UIKit 或者 Core Graphics 绘制的内容,当视图第一次出现,或者是改变约束条件让视图的全部或者一部分在屏幕上发生变化时,系统都会调用 UIView 类的 drawRect 方法.然后我们在此方法中能过获取到当前图形上下文,实现我们的绘制内容,最后系统会在合适的时机自动调用此方法.

drawRect 一般调用是在 UIView 的 layoutSubviews 方法执行后. 但是, 在我们的视图全部初始化后,如果视图又发生了改变, 此时视图就需要重绘, 但是系统不会再帮我们自动调用 drewRect 方法. 这个时候就需要我们手动调用 UIView 类的 setNeedsDisplay 或 setNeedsDisplayInRect 方法. 这两个方法是用来告诉系统, 我们的视图有了更新需要去重绘. 相当于是给系统做了标记, 在系统 runloop 的下一个周期自动调用 drawRect 方法.

需要注意的地方

  1. 不要直接调用 drawRect 方法,如果强行调用此方法也是无效果的.苹果要求我们调用 UIView 类的 setNeedsDisplay 方法,则程序会自动调用 drawRect 方法进行重绘.

  2. 因为在绘制时要拿到图形上下文,如果在 UIView 初始化时没有设置 rect 大小, drawRect 方法不会被调用.

  3. 调用 sizeThatFits 后, 控件 frame 改变, UIView 的 layoutSubviews 被调用, 然后再调用 drawRect 方法. 所以可以先调用 sizeToFit 计算出size. 然后系统自动调用 drawRect 方法.

  4. 通过设置 contentMode 属性值为 UIViewContentModeRedraw.那么将在每次设置或更改 bounds 的时候自动调用 drawRect.

  5. 若要实时画图, 如果使用 gestureRecognizer 来刷新屏幕, 需要判断并转化 point 的坐标; 使用 touchbegan 等方法, 只需调用 setNeedsDisplay 实时刷新屏幕.

关于性能问题

至于 drawRect 方法的性能,可以参考一下此博文.此博文中主要是提到他们用 drawRect 来做画板功能,而且整个画板比较大是可以左右移动的,所以可能会比较耗费性能.如果我们在开发中只是简单的绘制一些基本图形,基本上不用担心性能问题.而且在 tableview 的优化中,我们在 drawRect 方法中自定义绘制 cell ,可以提高 tableview 的性能.

发表评论

电子邮件地址不会被公开。 必填项已用*标注