iOS的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写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相关推荐

  1. Phone重绘机制drawRect 转

    Phone重绘机制drawRect 如何使用iPhone进行绘图.重绘操作 iPhone的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个 ...

  2. iPhone重绘机制drawRect

    iPhone重绘机制drawRect 如何使用iPhone进行绘图.重绘操作 iPhone的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一 ...

  3. windows重绘机制原理

    一.Windows程序中的绘制和更新 与DOS环境比较,Windows中的应用程序在处理文字和图形绘制时有以下区别: 1.只能在窗口的客户区域绘制文字和图形 2.在窗口上绘制的内容不一定能够保留到程序 ...

  4. ios uiview 如何刷新_UIView的重绘及布局刷新

    本文将简要讨论以下几个问题: 1.UIView的drawRect方法的调用机制及注意点 2.UIView的layoutSubviews.layoutIfNeeded.setNeedsLayout等方法 ...

  5. qt repaint 用法_Qt重绘之update,repaint详解

    Qt里面的重绘和Windows编程里面的重绘差不多.但是Qt的重绘更有特色,更加智能. 在讲之前,先说说paintEvent() paintEvent()是一个虚函数槽(slot),子类可以对父类的p ...

  6. android 重绘如何能不闪一下屏幕_浏览器渲染机制——重绘重排

    性能优化中,减少重绘重排应该是一种很好的优化方式,我们具体看一下什么情况下会造成重绘重排,为什么减少重绘重排可以做到优化,怎么样减少重绘重排. 浏览器渲染过程 我们先看看当浏览器拿到服务端返回的资源时 ...

  7. UITableviewcell重用机制以及解决重绘出现的重叠现象

    2019独角兽企业重金招聘Python工程师标准>>> UITableviewcell重用机制以及解决重绘出现的重叠现象 重点1.删除子控件 重点2.重新分配控件 该方法是自定义创建 ...

  8. 浏览器渲染机制、重排、重绘

    前言 浏览器的渲染机制.重排.重绘 一.页面生成 1. HTML会被HTMl解析器解析成DOM树 2. CSS会被CSS解析器解析成CSSOM树 3. 结合DOM树和CSSOM树生成一颗渲染树 4.将 ...

  9. 斯坦福iOS7教程以及国内一些培训班中关于UIView重绘不易发现的一个坑

    在这些教程里,对于UIView的重绘基本都是新建一个类,然后在StroyBoard里拖线. 而很多iOS的学习者,是用代码来构建界面的,这样就造成了有时候会发生莫名其妙的Bug. 大家都知道重绘是在这 ...

最新文章

  1. 硬件框图分析、核心元器件参数选定和核心元器件参数选择
  2. nacos 公共_Springboot,Nacos并向使用研究
  3. Java面向对象编程学习
  4. Windows Live Writer
  5. Ubuntu dpkg 常用命令教程
  6. node.js核心模块
  7. android核心基础(5)_Android)java虚拟机和Dalvik虚拟机的区别
  8. fence_ilo can't connect by ssl, since CentOS 5.8 lack pyOpenSSL
  9. lol载入服务器无限崩溃,lol一直崩溃_lol无限崩溃重连
  10. 弘玑Cyclone发布全线产品 | 多个产品与功能系行业首创
  11. udp简单通讯示例---心跳示例
  12. android 分享到YouTube失败 403
  13. 关于svn提交performing vcs refresh 卡住的解决办法
  14. 【Django】有效解决django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_FROM, but settings
  15. p标签内不能包含块级元素
  16. 关于未名湖边的烦恼问题
  17. 海康威视:单季盈利下滑与华为并无关系,2019 年将进入 AI 落地阶段...
  18. 趣味点名软件_新老师必学之趣味点名游戏
  19. java计算机毕业设计在线云音乐系统源码+mysql数据库+系统+lw文档+部署
  20. LNMP之Nginx服务搭建及三种类型虚拟主机

热门文章

  1. python打印小猪佩琪_极度舒适的 Python 入门教程,小猪佩奇也能学会~
  2. android 电池栏的高度,Android如何取得状态栏、任务栏高度
  3. java autovalue_Android AutoValue使用和扩展库
  4. IDEA对新建java线程池的建议
  5. 机器学习系统设计——误差矩阵
  6. poj 1236 Network of Schools
  7. double类型问题
  8. ASP.NET MVC 重点教程一周年版 第八回 Helper之演化 【转】
  9. c#中事件注册多个委托并获取委托列表
  10. Windows句柄-2