写在前面

  • UIView对于iOS开发来讲,再熟悉不过了。也正是因为这一点,我们可能会忽略UIView一些特有方法的理解和使用。今天,笔者主要整理一下对drawRect方法的理解和使用。
  • 默认情况下,该方法在视图加载过程中不做任何人处理。当子类使用Core GraphicsUIKit绘制视图内容时就需要在该方法中添加绘制的代码。

drawRect简介

  • drawRect方法在UIView的使用上起着十分关键的作用。不知道大家注意过没有,每一次创建UIView子类文件时候,会有自动带有已注释的drawRect方法,也许从这一点就能看出这个方法的重要性。
  • 该方法定义在UIView(UIViewRendering)分类里面,望文生义,该方法完成视图的绘制。

drawRect作用

  • Only override drawRect: if you perform custom drawing.
  • 重绘作用:重写该方法以实现自定义的绘制内容

drawRect调用场景

  • 视图第一次显示的时候会调用。这个是由系统自动调用的,主要是在UIViewControllerloadViewviewDidLoad方法调用之后;
  • 如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用;
  • 该方法在调用sizeThatFits后被调用,所以可以先调用sizeToFit计算出size,然后系统自动调用drawRect:方法;
  • 通过设置contentMode属性值为UIViewContentModeRedraw,那么将在每次设置或更改frame的时候自动调用drawRect:;
  • 直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0;

drawRect重绘方法定义

  • - (void)drawRect:(CGRect)rect;:重写此方法,执行重绘任务;
  • - (void)setNeedsDisplay;:标记为需要重绘,异步调用drawRect,但是绘制视图的动作需要等到下一个绘制周期执行,并非调用该方法立即执行;
  • - (void)setNeedsDisplayInRect:(CGRect)rect;:标记为需要局部重绘,具体调用时机同上;

drawRect使用注意事项

  • 如果子类直接继承自UIView,则在drawRect 方法中不需要调用super方法。若子类继承自其他View类则需要调用super方法以实现重绘。
  • 若使用UIView绘图,只能在drawRect:方法中获取绘制视图的contextRef。在其他方法中获取的contextRef都是不生效的;
  • drawRect:方法不能手动调用,需要调用实例方法setNeedsDisplay或者setNeedsDisplayInRect,让系统自动调用该方法;
  • 若使用CALayer绘图,只能在drawInContext :绘制,或者在delegate方法中进行绘制,然后调用setNeedDisplay方法实现最终的绘制;
  • 若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕 ------这个阐述需要调整
  • UIImageView继承自UIView,但是UIImageView能不重写drawRect方法用于实现自定义绘图。具体原因如下图所示:
    Apple官方文档描述

小结一下

上面的几个问题说的有些啰嗦了,总结一下需要掌握一下几点:

  • 了解drawRect使用场景;
  • 哪些方法可以调用;
  • 了解何时进行重绘;

参考文献

  • drawRect参考
  • setNeedsDisplay使用

转载于:https://www.cnblogs.com/LifeTechnologySupporter/p/8662047.html

iOS-绘制UIView之drawCGRect相关推荐

  1. IOS绘制小黄人,对绘图知识的一个练习

    IOS绘制小黄人,对绘图知识的一个练习 #define kTopX rect.size.width * 0.5 #define kTopRadius 80 #define kTopY 260// // ...

  2. ios 自定义UIView绘制时文字上下颠倒问题解决

    - (void)drawRect:(CGRect)rect {     [self showPage:m_currentPageIndex]; } - (void)showPage:(int)page ...

  3. iOS绘制物理按钮 - 透明圆角渐变边框

    需求是需要制作一个投票组件,支持边框是透明渐变,填充为渐变色背景的不规则按钮,并支持有点击之后的变化动画. 搜索了一圈内部技术论坛上文章,并没有类似的透明渐变边框的参考文章,遂起草对这一内容的总结. ...

  4. swift使用xib绘制UIView

    目标:用xib绘制一个UIView,在某个ViewController中调用. 三个文件:ViewController.swift    DemoView.swift     DemoView.xib ...

  5. iOs 自定义UIView 日历的实现 Swift2.1

    学习Swift有一个月了,动手写一个UIView吧. 所有源代码在最后,直接用就可以了,第一次写Swift,和C#,Java还是有区别的 (博客园可以考虑在代码插入中添加Swift的着色了) 1  函 ...

  6. iOS 绘制圆角矩形

    在 UIView 层 可以通过设置 layer 的 cornerRadius来设置圆角. 也可通过 Layer 层设置 带圆角的maskLayer 来设置圆角. 那如果在 UIView 的 draw( ...

  7. ios 绘制线框_iOS开发 给View添加指定位置的边框线

    略微封装了一下,给View添加指定位置的边框线,其中位移枚举的使用询问了哥们儿,总算搞定: 封装一:直接封装成了一个方法 /// 边框类型(位移枚举) typedef NS_ENUM(NSIntege ...

  8. ios 绘制线框_iOS 各种边框

    UIView *View = [[UIView alloc] initWithFrame:(CGRectMake(0, 0, 100, 100))]; View.center = self.view. ...

  9. iOS 绘制股票K线图

    //联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄 一.k线图概念 k线图:有最新价.收盘价.开盘价.最高价.最低价.均价.卖量.买量等等.而我们需要展示给用户看的第一眼就是把它们全部 ...

  10. ios 绘制线框_16款值得一用的iPhone线框图模板 (PSD Sketch)

    在任何网站或移动应用设计的过程中,线框图作为设计元素和功能的图示,它有助于帮助定义和更好地传达信息层次结构,让参与设计和开发的人员更好的理解设计师的思路和设计的功能点. 即使线框图设计是一个比较耗时的 ...

最新文章

  1. 面试官:什么是QoS?如何原理是怎么样的?
  2. Android --- Binary XML file line2 Binary XML file line 2 Error inflating class unknown
  3. sortingOrder,sortingLayer
  4. python教学数据库_Python学习之数据库初识
  5. 深入信号和槽(Signals and Slots in Depth)
  6. java 邮件模板_Spring Boot 2发送邮件手把手图文教程
  7. 学习python课程_想学习Python吗? 这是我们的免费4小时互动课程
  8. View绑定式监听器实现原理
  9. 2021年中国国家级高新区 (科技园)数量、产值及营业收入分析[图]
  10. ElementUI表格如何获取当前行的数据?
  11. eas表单分录带出自定义核算项目
  12. 第一章概述-------第一节--1.3互联网的组成
  13. vue中清除路由缓存
  14. for、forEach、 for of 、for in的区别
  15. 音乐代码 (DNF天空之城、欢乐颂)。
  16. maven项目test执行main找不到资源文件
  17. 远程驾驶一般怎么实现
  18. 4. PCIe 接口时序
  19. STM32开发笔记112:ADS1258驱动设计——读寄存器
  20. 简单实用远控小工具Todesk

热门文章

  1. android TouchEvent分发笔记(2016.03.14更新)
  2. 开发基于CXF的 RESTful WebService web 项目 webservice发布
  3. db_cxx.h: No such file or directory
  4. gcc include lib路径扩展
  5. sonarqube如何导入规则_webpack如何使用Vue
  6. 谈谈CSMA/CD,TCP中的二进制指数退避算法
  7. Linux内核线程kernel thread详解--Linux进程的管理与调度(十)
  8. linux内核C -- 第09课:链接过程中的强符号和弱符号
  9. LINUX内核的进程调度策略
  10. Android SD卡操作