iOS-绘制UIView之drawCGRect
写在前面
UIView
对于iOS开发来讲,再熟悉不过了。也正是因为这一点,我们可能会忽略UIView
一些特有方法的理解和使用。今天,笔者主要整理一下对drawRect
方法的理解和使用。- 默认情况下,该方法在视图加载过程中不做任何人处理。当子类使用
Core Graphics
和UIKit
绘制视图内容时就需要在该方法中添加绘制的代码。
drawRect简介
drawRect
方法在UIView
的使用上起着十分关键的作用。不知道大家注意过没有,每一次创建UIView
子类文件时候,会有自动带有已注释的drawRect
方法,也许从这一点就能看出这个方法的重要性。- 该方法定义在
UIView(UIViewRendering)
分类里面,望文生义,该方法完成视图的绘制。
drawRect作用
Only override drawRect: if you perform custom drawing.
- 重绘作用:重写该方法以实现自定义的绘制内容
drawRect调用场景
- 视图第一次显示的时候会调用。这个是由系统自动调用的,主要是在
UIViewController
中loadView
和viewDidLoad
方法调用之后; - 如果在
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相关推荐
- IOS绘制小黄人,对绘图知识的一个练习
IOS绘制小黄人,对绘图知识的一个练习 #define kTopX rect.size.width * 0.5 #define kTopRadius 80 #define kTopY 260// // ...
- ios 自定义UIView绘制时文字上下颠倒问题解决
- (void)drawRect:(CGRect)rect { [self showPage:m_currentPageIndex]; } - (void)showPage:(int)page ...
- iOS绘制物理按钮 - 透明圆角渐变边框
需求是需要制作一个投票组件,支持边框是透明渐变,填充为渐变色背景的不规则按钮,并支持有点击之后的变化动画. 搜索了一圈内部技术论坛上文章,并没有类似的透明渐变边框的参考文章,遂起草对这一内容的总结. ...
- swift使用xib绘制UIView
目标:用xib绘制一个UIView,在某个ViewController中调用. 三个文件:ViewController.swift DemoView.swift DemoView.xib ...
- iOs 自定义UIView 日历的实现 Swift2.1
学习Swift有一个月了,动手写一个UIView吧. 所有源代码在最后,直接用就可以了,第一次写Swift,和C#,Java还是有区别的 (博客园可以考虑在代码插入中添加Swift的着色了) 1 函 ...
- iOS 绘制圆角矩形
在 UIView 层 可以通过设置 layer 的 cornerRadius来设置圆角. 也可通过 Layer 层设置 带圆角的maskLayer 来设置圆角. 那如果在 UIView 的 draw( ...
- ios 绘制线框_iOS开发 给View添加指定位置的边框线
略微封装了一下,给View添加指定位置的边框线,其中位移枚举的使用询问了哥们儿,总算搞定: 封装一:直接封装成了一个方法 /// 边框类型(位移枚举) typedef NS_ENUM(NSIntege ...
- ios 绘制线框_iOS 各种边框
UIView *View = [[UIView alloc] initWithFrame:(CGRectMake(0, 0, 100, 100))]; View.center = self.view. ...
- iOS 绘制股票K线图
//联系人:石虎 QQ: 1224614774昵称:嗡嘛呢叭咪哄 一.k线图概念 k线图:有最新价.收盘价.开盘价.最高价.最低价.均价.卖量.买量等等.而我们需要展示给用户看的第一眼就是把它们全部 ...
- ios 绘制线框_16款值得一用的iPhone线框图模板 (PSD Sketch)
在任何网站或移动应用设计的过程中,线框图作为设计元素和功能的图示,它有助于帮助定义和更好地传达信息层次结构,让参与设计和开发的人员更好的理解设计师的思路和设计的功能点. 即使线框图设计是一个比较耗时的 ...
最新文章
- 面试官:什么是QoS?如何原理是怎么样的?
- Android --- Binary XML file line2 Binary XML file line 2 Error inflating class unknown
- sortingOrder,sortingLayer
- python教学数据库_Python学习之数据库初识
- 深入信号和槽(Signals and Slots in Depth)
- java 邮件模板_Spring Boot 2发送邮件手把手图文教程
- 学习python课程_想学习Python吗? 这是我们的免费4小时互动课程
- View绑定式监听器实现原理
- 2021年中国国家级高新区 (科技园)数量、产值及营业收入分析[图]
- ElementUI表格如何获取当前行的数据?
- eas表单分录带出自定义核算项目
- 第一章概述-------第一节--1.3互联网的组成
- vue中清除路由缓存
- for、forEach、 for of 、for in的区别
- 音乐代码 (DNF天空之城、欢乐颂)。
- maven项目test执行main找不到资源文件
- 远程驾驶一般怎么实现
- 4. PCIe 接口时序
- STM32开发笔记112:ADS1258驱动设计——读寄存器
- 简单实用远控小工具Todesk
热门文章
- android TouchEvent分发笔记(2016.03.14更新)
- 开发基于CXF的 RESTful WebService web 项目 webservice发布
- db_cxx.h: No such file or directory
- gcc include lib路径扩展
- sonarqube如何导入规则_webpack如何使用Vue
- 谈谈CSMA/CD,TCP中的二进制指数退避算法
- Linux内核线程kernel thread详解--Linux进程的管理与调度(十)
- linux内核C -- 第09课:链接过程中的强符号和弱符号
- LINUX内核的进程调度策略
- Android SD卡操作