iOS开发UI篇—Quartz2D简单使用(三)

一、通过slider控制圆的缩放

1.实现过程

新建一个项目,新建一个继承自UIview的类,并和storyboard中自定义的view进行关联。

界面搭建,如图:

代码示例:

YYViewController.m文件

  1. //
  2. // YYViewController.m
  3. // 04-对圆进行缩放
  4. //
  5. // Created by apple on 14-6-11.
  6. // Copyright (c) 2014年 itcase. All rights reserved.
  7. //
  8.  
  9. #import "YYViewController.h"
  10. #import "YYview.h"
  11.  
  12. @interface YYViewController ()
  13. @property (weak, nonatomic) IBOutlet YYview *circleView;
  14. - (IBAction)valueChange:(UISlider *)sender;
  15.  
  16. @end
  17.  
  18. @implementation YYViewController
  19.  
  20. - (void)viewDidLoad
  21. {
  22. [super viewDidLoad];
  23. // Do any additional setup after loading the view, typically from a nib.
  24. }
  25.  
  26. - (IBAction)valueChange:(UISlider *)sender {
  27. //当值改变的时候,把值传递给view,改变圆的半径
  28. NSLog(@"%f",sender.value);
  29. //把sender的值传递给自定义view,设置圆的半径
  30. self.circleView.radius=sender.value;
  31. }
  32. @end

YYview.h文件

  1. //
  2. // YYview.h
  3. // 04-对圆进行缩放
  4. //
  5. // Created by apple on 14-6-11.
  6. // Copyright (c) 2014年 itcase. All rights reserved.
  7. //
  8.  
  9. #import <UIKit/UIKit.h>
  10.  
  11. @interface YYview : UIView
  12. //提供一个属性来接收外界传入的半径
  13. @property(nonatomic,assign)float radius;
  14. @end

YYview.m文件

  1. //
  2. // YYview.m
  3. // 04-对圆进行缩放
  4. //
  5. // Created by apple on 14-6-11.
  6. // Copyright (c) 2014年 itcase. All rights reserved.
  7. //
  8.  
  9. #import "YYview.h"
  10.  
  11. @implementation YYview
  12. //自定义view中的圆不显示
  13. //重写set方法,为半径赋值
  14. -(void)setRadius:(float)radius
  15. {
  16. _radius=radius;
  17. //通知自定义的view重新绘制图形
  18. [self setNeedsDisplay];
  19. }
  20.  
  21. //如果view是从xib或storyboard中创建出来的会先调用awakefromnib方法
  22. - (void)awakeFromNib
  23. {
  24. //在这里为圆的半径设定一个初始的值
  25. self.radius = ;
  26. }
  27.  
  28. - (void)drawRect:(CGRect)rect
  29. {
  30. //1.获取图形上下文
  31. CGContextRef ctx=UIGraphicsGetCurrentContext();
  32. //2.绘图
  33. //在自定义的view中画一个圆
  34. CGContextAddArc(ctx, , , self.radius, , *M_PI, );
  35. //设置圆的填充颜色
  36. [[UIColor grayColor]set];
  37.  
  38. //3.渲染
  39. // CGContextStrokePath(ctx);
  40. CGContextFillPath(ctx);
  41. }
  42.  
  43. @end

效果:

       

2.注意点:

drawRect:方法不能由我们自己手动调用,只能由系统来调用。
drawRect:调用的时机:当第一次显示或者一个重绘事件发生时调用。
setNeedsDisplay方法:重新绘制,调用这个方法就会通知自定义的view重新绘制画面,调用drawRect:。
提示:当一个view从xib或storyboard创建出来时,会调用awakefromnib方法。
3.补充
可以通过slider的value属性监听值的改变,当然也可以指定value的取值范围(这里设定为0~100)。
二、刷帧效果
说明:把雪花状的图片绘制到view上,实现图片在视图中下落的效果。
1.实现代码:
  1. //
  2. // YYview.m
  3. // 05-刷帧动画
  4. //
  5. // Created by apple on 14-6-11.
  6. // Copyright (c) 2014年 itcase. All rights reserved.
  7. //
  8.  
  9. #import "YYview.h"
  10.  
  11. //私有扩展
  12. @interface YYview ()
  13. @property(nonatomic,assign)float imageY;
  14.  
  15. @end
  16. @implementation YYview
  17.  
  18. -(id)initWithCoder:(NSCoder *)aDecoder
  19. {
  20. //请注意这里一定要先初始化父类的构造方法
  21. if (self=[super initWithCoder:aDecoder]) {
  22. NSLog(@"initWithCoder:");
  23.  
  24. //NSTimer一般用于定时的更新一些非界面上的数据,告诉多久调用一次
  25. //使用定时器,使用该定时器会出现卡顿的现象
  26. // [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateImage) userInfo:nil repeats:YES];
  27.  
  28. // CADisplayLink刷帧,默认每秒刷新60次
  29. //该定时器创建之后,默认是不会执行的,需要把它加载到消息循环中
  30. CADisplayLink *display= [CADisplayLink displayLinkWithTarget:self selector:@selector(updateImage)];
  31. [display addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
  32.  
  33. }
  34. return self;
  35. }
  36.  
  37. -(void)updateImage
  38. {
  39. //调用该方法重绘画面
  40. [self setNeedsDisplay];
  41. }
  42. -(void)awakeFromNib
  43. {
  44. NSLog(@"awakeFromNib");
  45. }
  46.  
  47. - (void)drawRect:(CGRect)rect
  48. {
  49. //把图片绘制到view上
  50.  
  51. //每次调用该方法对画面进行重绘时,imageY的值就+5
  52. self.imageY+=;
  53. //判断,当雪花超出屏幕的时候,让图片从头开始降落
  54. if (self.imageY>rect.size.height) {
  55. self.imageY=;
  56. }
  57. UIImage *image=[UIImage imageNamed:@"snow"];
  58. [image drawAtPoint:CGPointMake(, self.imageY)];
  59.  
  60. UIImage *image2=[UIImage imageNamed:@"me"];
  61. [image2 drawAtPoint:CGPointMake(, self.imageY)];
  62.  
  63. }
  64.  
  65. @end

实现效果

     

2.重要说明

(1)下面两个方法的调用顺序

-(void)awakeFromNib

-(id)initWithCoder:(NSCoder *)aDecoder

提示:如果view是从xib或storyboard中创建可以调用awakefromnib方法,归档。从文件创建view,其实会先调用initwithcoder这个方法。xib和storyboard也是文件。

上面两个方法,-(id)initWithCoder:(NSCoder *)aDecoder会先调用。实现该方法需要实现NSCoding协议,由于创建的UIView默认就已经实现了该协议。

可以进入到头文件查看:

运行新建的程序,通过打印可以验证上面两个方法的调用顺序。

(2)两个定时器

第一个:

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateImage) userInfo:nil repeats:YES];

说明: NSTimer一般用于定时的更新一些非界面上的数据,告诉多久调用一次

第二个:

CADisplayLink *display= [CADisplayLink displayLinkWithTarget:self selector:@selector(updateImage)];

[display addToRunLoop:[NSRunLoopmainRunLoop] forMode:NSDefaultRunLoopMode];

  说明: CADisplayLink刷帧,默认每秒刷新60次。该定时器创建之后,默认是不会执行的,需要把它加载到消息循环中

iOS开发UI篇—Quartz2D简单使用(三)的更多相关文章

  1. iOS开发UI篇—Quartz2D简单介绍

    iOS开发UI篇—Quartz2D简单介绍 一.什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\ ...

  2. iOS开发UI篇—Quartz2D简单使用(一)

    iOS开发UI篇—Quartz2D简单使用(一) 一.画直线 代码: // // YYlineview.m // 03-画直线 // // Created by apple on 14-6-9. // ...

  3. iOS开发UI篇—Quartz2D简单使用(一)

    iOS开发UI篇—Quartz2D简单使用(一) 一.画直线 代码: 1 // 2 // YYlineview.m 3 // 03-画直线 4 // 5 // Created by apple on ...

  4. iOS开发UI篇—Quartz2D简单使用(二)

    iOS开发UI篇—Quartz2D简单使用(二) 一.画文字 代码: // // YYtextview.m // 04-写文字 // // Created by 孔医己 on 14-6-10. // ...

  5. iOS开发UI篇—Quartz2D使用(绘制基本图形)

    iOS开发UI篇—Quartz2D使用(绘制基本图形) 一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 ...

  6. iOS开发UI篇—Quartz2D使用(图形上下文栈)

    iOS开发UI篇—Quartz2D使用(图形上下文栈) 一.qurza2d是怎么将绘图信息和绘图的属性绘制到图形上下文中去的? 说明: 新建一个项目,自定义一个view类和storyboard关联后, ...

  7. iOS开发UI篇—Quartz2D使用(绘图路径)

    iOS开发UI篇—Quartz2D使用(绘图路径) 一.绘图路径 A.简单说明 在画线的时候,方法的内部默认创建一个path.它把路径都放到了path里面去. 1.创建路径  cgmutablepat ...

  8. iOS开发UI篇—Quartz2D使用(信纸条纹)

    iOS开发UI篇—Quartz2D使用(信纸条纹) 一.前导程序 新建一个项目,在主控制器文件中实现以下几行代码,就能轻松的完成图片在视图中的平铺. #import "YYViewContr ...

  9. iOS开发UI篇—Quartz2D使用(截屏)

    iOS开发UI篇—Quartz2D使用(截屏) 一.简单说明 在程序开发中,有时候需要截取屏幕上的某一块内容,比如捕鱼达人游戏.如图: 完成截屏功能的核心代码:- (void)renderInCont ...

随机推荐

  1. 手机触摸touch事件

    1.Touch事件简介 pc上的web页面鼠 标会产生onmousedown.onmouseup.onmouseout.onmouseover.onmousemove的事件,但是在移动终端如 ipho ...

  2. retain,copy,assign及autorelease ,strong,weak

    一,retain, copy, assign区别 1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a ...

  3. PoE以太网远程供电

    每个以太网口向下挂设备提供的最大功率为 15.4W 通过3/5 类双绞线的信号线(1.3.2.6)同时传递数据和电流

  4. viewpager实现酷炫侧滑demo

    晚上叫外卖,打开饿了么,发现推了一个版本,更新以后,点开了个鸡腿,哇,交互炫炸了. 不过还是有槽点.我是无意中才发现可以左右滑动的.这...你不告诉我,我怎么知道左右可以滑. https://gith ...

  5. es5.0安装问题

    ES的5.0版本听说在性能上大大优化,于是老大说准备换5.0版本.由于在技术群看到很多人都说ES 5.0 安装有问题,在这里贴出自己在使用最新版5.0遇到的问题和解决方法 1.Elasticsearc ...

  6. [转] GitHub上README.md教程

    点击阅读原文 最近对它的README.md文件颇为感兴趣.便写下这贴,帮助更多的还不会编写README文件的同学们. README文件后缀名为md.md是markdown的缩写,markdown是一种 ...

  7. 图论$\cdot$最短路问题

    Dijkstra单源最短路径算法 Dijkstra可以计算出发点到每个点的最短路,及单源最短路径(SSSP).这一特点使得Dijkstra常常用来进行其他算法的预处理.用Dijkstra算法计算最短路 ...

  8. WebRequest使用

    // 待请求的地址 string url = "http://www.cnblogs.com"; // 创建 WebRequest 对象,WebRequest 是抽象类,定义了请求 ...

  9. Annotation

    Annotation是给类,方法或域上加的一种特殊的标记,可以通过反射取到注解的类型和值,从而完成某种特定的操作. 定义注解需要使用元注解,元注解有@Retention和@Target p.p1 { ...

  10. centos6.6安装配置jboss7.1.1

    Centos6.6下安装配置Jboss7.1.1 在了解jboss牛逼特性之后,我决定安装下jboss7.1.1试试 下面是安装包百度云盘链接: http://pan.baidu.com/s/1o6O ...