iOS重绘机制drawRect
下面先说明一下绘图,比如,你想绘制一个方块,你需要写一个类来扩展UIView并在drawRect方法中填入如下代码:
- (void)drawRect:(CGRect)rect {
// Drawing code.
//获得处理的上下文
CGContextRef context = UIGraphicsGetCurrentContext();
//设置线条样式
CGContextSetLineCap(context, kCGLineCapSquare);
//设置线条粗细宽度
CGContextSetLineWidth(context, 1.0);
//设置颜色
CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);
//开始一个起始路径
CGContextBeginPath(context);
//起始点设置为(0,0):注意这是上下文对应区域中的相对坐标,
CGContextMoveToPoint(context, 0, 0);
//设置下一个坐标点
CGContextAddLineToPoint(context, 100, 100);
//设置下一个坐标点
CGContextAddLineToPoint(context, 0, 150);
//设置下一个坐标点
CGContextAddLineToPoint(context, 50, 180);
//连接上面定义的坐标点
CGContextStrokePath(context);
}
再说明一下重绘,重绘操作仍然在drawRect方法中完成,但是苹果不建议直接调用drawRect方法,当然如果你强直直接调用此方法,当然是没有效果的。苹果要求我们调用UIView类中的setNeedsDisplay方法,则程序会自动调用drawRect方法进行重绘。(调用setNeedsDisplay会自动调用drawRect)
在UIView中,重写drawRect: (CGRect) aRect方法,可以自己定义想要画的图案.且此方法一般情况下只会画一次.也就是说这个drawRect方法一般情况下只会被掉用一次. 当某些情况下想要手动重画这个View,只需要掉用[self setNeedsDisplay]方法即可.
drawRect调是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量值).
1.如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。
2.该方法在调用sizeThatFits后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
3.通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。
4.直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0.
以上1,2推荐;而3,4不提倡
1、若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或者 setNeedsDisplayInRect ,让系统自动调该方法。
2、若使用calayer绘图,只能在drawInContext: 中(类似鱼drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法。
3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕
iOS重绘机制drawRect相关推荐
- Phone重绘机制drawRect 转
Phone重绘机制drawRect 如何使用iPhone进行绘图.重绘操作 iPhone的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个 ...
- iPhone重绘机制drawRect
iPhone重绘机制drawRect 如何使用iPhone进行绘图.重绘操作 iPhone的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一 ...
- windows重绘机制原理
一.Windows程序中的绘制和更新 与DOS环境比较,Windows中的应用程序在处理文字和图形绘制时有以下区别: 1.只能在窗口的客户区域绘制文字和图形 2.在窗口上绘制的内容不一定能够保留到程序 ...
- ios uiview 如何刷新_UIView的重绘及布局刷新
本文将简要讨论以下几个问题: 1.UIView的drawRect方法的调用机制及注意点 2.UIView的layoutSubviews.layoutIfNeeded.setNeedsLayout等方法 ...
- qt repaint 用法_Qt重绘之update,repaint详解
Qt里面的重绘和Windows编程里面的重绘差不多.但是Qt的重绘更有特色,更加智能. 在讲之前,先说说paintEvent() paintEvent()是一个虚函数槽(slot),子类可以对父类的p ...
- android 重绘如何能不闪一下屏幕_浏览器渲染机制——重绘重排
性能优化中,减少重绘重排应该是一种很好的优化方式,我们具体看一下什么情况下会造成重绘重排,为什么减少重绘重排可以做到优化,怎么样减少重绘重排. 浏览器渲染过程 我们先看看当浏览器拿到服务端返回的资源时 ...
- UITableviewcell重用机制以及解决重绘出现的重叠现象
2019独角兽企业重金招聘Python工程师标准>>> UITableviewcell重用机制以及解决重绘出现的重叠现象 重点1.删除子控件 重点2.重新分配控件 该方法是自定义创建 ...
- 浏览器渲染机制、重排、重绘
前言 浏览器的渲染机制.重排.重绘 一.页面生成 1. HTML会被HTMl解析器解析成DOM树 2. CSS会被CSS解析器解析成CSSOM树 3. 结合DOM树和CSSOM树生成一颗渲染树 4.将 ...
- 斯坦福iOS7教程以及国内一些培训班中关于UIView重绘不易发现的一个坑
在这些教程里,对于UIView的重绘基本都是新建一个类,然后在StroyBoard里拖线. 而很多iOS的学习者,是用代码来构建界面的,这样就造成了有时候会发生莫名其妙的Bug. 大家都知道重绘是在这 ...
最新文章
- 硬件框图分析、核心元器件参数选定和核心元器件参数选择
- nacos 公共_Springboot,Nacos并向使用研究
- Java面向对象编程学习
- Windows Live Writer
- Ubuntu dpkg 常用命令教程
- node.js核心模块
- android核心基础(5)_Android)java虚拟机和Dalvik虚拟机的区别
- fence_ilo can't connect by ssl, since CentOS 5.8 lack pyOpenSSL
- lol载入服务器无限崩溃,lol一直崩溃_lol无限崩溃重连
- 弘玑Cyclone发布全线产品 | 多个产品与功能系行业首创
- udp简单通讯示例---心跳示例
- android 分享到YouTube失败 403
- 关于svn提交performing vcs refresh 卡住的解决办法
- 【Django】有效解决django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_FROM, but settings
- p标签内不能包含块级元素
- 关于未名湖边的烦恼问题
- 海康威视:单季盈利下滑与华为并无关系,2019 年将进入 AI 落地阶段...
- 趣味点名软件_新老师必学之趣味点名游戏
- java计算机毕业设计在线云音乐系统源码+mysql数据库+系统+lw文档+部署
- LNMP之Nginx服务搭建及三种类型虚拟主机