最近在看《IOS疯狂讲义》这本书,看到最后里面有一个关于利用绘图和坐标变换实现雪花飘飘的效果,有点感兴趣,就按照书中的代码敲了一下,但是出来的效果和书中所说不太一样。所以把代码贴出来希望和大家交流一下,看看大位大神能够知道原因。
书中代码我就直接截图了:



书中说的效果:

我的代码如下:

//
//  ViewController.m
//  snowFlowerDemo
//
//  Created by Jack on 15/11/25.
//  Copyright © 2015年 Jack. All rights reserved.
//#import "ViewController.h"
#import "JKSnowView.h"
@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.JKSnowView *jkSnowView = [[JKSnowView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];[self.view addSubview:jkSnowView];
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end
//
//  JKSnowView.m
//  snowFlowerDemo
//
//  Created by Jack on 15/11/25.
//  Copyright © 2015年 Jack. All rights reserved.
//#import "JKSnowView.h"@implementation JKSnowViewstatic CGPoint snowPos[] ={{20,4},{50,4},{80,4},{110,4},{140,4},{140,4},{170,4},{200,4},{230,4},{260,4},{290,4}
};static NSInteger sonwCount =sizeof(snowPos)/sizeof(snowPos[0]);-(id)initWithFrame:(CGRect)frame{self = [super initWithFrame:frame];if ( self) {//控制每隔0.2秒执行一次setNeedsDisplay方法刷新自己[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES];}return self;}-(void)drawRect:(CGRect)rect{CGContextRef ctx = UIGraphicsGetCurrentContext();CGContextSetRGBFillColor(ctx, 1, 1, 1, 1);//设置白色做为填充色for (int i =0; i<sonwCount; i++) {CGContextSaveGState(ctx);   //保存当前绘图状态CGContextTranslateCTM(ctx, snowPos[i].x, snowPos[i].y);  //平移坐标系统//旋转坐标系统CGContextRotateCTM(ctx, (arc4random()%6-3) *M_PI/10);//控制雪花下落snowPos[i].y +=arc4random()%8;if (snowPos[i].y>self.frame.size.height) {snowPos[i].y =4;}//创建并绘制“雪花”CGContextAddFlower(ctx,6,0,0,4,8);CGContextFillPath(ctx);CGContextRestoreGState(ctx);}}//该方法负责绘制花朵
//n:该参数控制花朵的瓣数;dx,dy:控制花朵的位置;size:控制花朵的大小;length:控制花瓣的长度void CGContextAddFlower(CGContextRef ctx,NSInteger n,CGFloat dx,CGFloat dy,CGFloat size,CGFloat length){CGContextMoveToPoint(ctx, dx, dy+size);   //移动到指定地点CGFloat degree =2*M_PI/n;//采用循环添加n段二次曲线路径for (int i=0; i<n+1; i++) {//计算控制点坐标CGFloat ctrlX = sin((i-0.5) *degree)*length +dx;CGFloat ctrlY =cos((i-0.5) *degree) *length +dy;//计算结束点的坐标CGFloat x = sin(i*degree) *size +dx;CGFloat y = cos(i*degree) *size +dy;//添加二次曲线路径CGContextAddQuadCurveToPoint(ctx, ctrlX, ctrlY, x, y);}}/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {// Drawing code
}
*/@end

运行效果如下:

demo下载地址
大家看一下,代码有啥问题,欢迎交流哦

《IOS疯狂讲义》雪花飘飘效果实现相关推荐

  1. 制作网页雪花飘飘效果

    <SCRIPT language=JavaScript1.2> var snowsrc="image/1.png" var no = 11;//雪花数量var ns4u ...

  2. IOS疯狂基础之GIF图片的显示

    2019独角兽企业重金招聘Python工程师标准>>> IOS疯狂基础之GIF图片的显示 iPhone SDK提供了多种动画手段,UIView.UIImageView和CALayer ...

  3. 怎么把 html做成雪花特效,CSS3 HTML5下雪特效 雪花飘飘

    CSS3 HTML5下雪特效 雪花飘飘 $(document).ready(function () { makeSnow("christmasSnow", "bg.jpg ...

  4. 圣诞树的雪花飘飘(结尾附源码)

    写在前面:博主是一只经过实战开发历练后投身培训事业的"小山猪",昵称取自动画片<狮子王>中的"彭彭",总是以乐观.积极的心态对待周边的事物.本人的技 ...

  5. CSS3 HTML5下雪特效 雪花飘飘

    <!doctype html> <html lang="en"> <head> <meta charset=utf-8 /> < ...

  6. iOS疯狂详解之开源库

    youtube下载神器:https://github.com/rg3/youtube-dl vim插件:https://github.com/Valloric/YouCompleteMe vim插件配 ...

  7. 使用canvas实现雪花飘动效果

    文章目录 前言 一.canvas是什么? 二.canvas的基本用法 1.创建一个画布(Canvas) 2.使用JavaScript绘制图像 3.Canvas 坐标 4.Canvas - 路径 三.实 ...

  8. 《Java疯狂讲义》第3章(数据类型和运算符):博主李俊德的阅读笔记与知识拓展

    一.问题背景 博主在准备应聘的笔试.面试时,再次采用了多年以来的Java工具书<Java疯狂讲义>,并决定在每章详细复习后都要在博客中写下详细的阅读笔记. 二.阅读笔记与知识拓展--< ...

  9. java实现物体下落效果_手撸一个物体下落的控件,实现雪花飘落效果

    效果图: 圣诞登录页.gif 参考文章: Android自定义View--从零开始实现雪花飘落效果 感谢原文作者,不仅实现了效果,并且写得非常详细,还做了优化.笔者参考原文作者的源码,做了一点修改,实 ...

最新文章

  1. 在cxf中使用配置避免增加字段导致客户端必须更新、同步实体属性的问题
  2. IE10浏览器兼容模式
  3. QCOW2 — Overview
  4. ios purelayout--基础使用--进阶使用--看这就够了
  5. 通信原理随机信号分析
  6. 程序员面试题精选100题(08)-求1+2+...+n[C/C++/C#]
  7. java模拟数据库压测_写并发压测 java 脚本你必须会的 3 个类
  8. 在sql2005中加数据库时出现无法打开物理文件
  9. 作为 IT 行业的过来人,你有什么话想对后辈说的?
  10. MSP432P401R TI Drivers 库函数学习笔记(三)认识任务的创建及图形化配置
  11. Python 找出1与100之间的全部“同构数”
  12. swift扩展Extensions
  13. python从入门到精通-python从入门到精通视频(大全60集)
  14. 计算机组成原理唐朔飞第八章ppt,计算机组成原理唐朔飞PPT第8章CPU的结构和功能.ppt...
  15. 使用 SVI 实现 VLAN 间路由
  16. 坚果云服务器地址,#网盘每日小技巧分享# 坚果云API是什么?
  17. 【三】Apache的管理及优化
  18. Värde任命新合伙人和高级董事总经理
  19. java画胖虎_漫画家马千里闲在家里画的“胖虎下山图”火了,关键部位令人瞩目...
  20. java制作安卓游戏脚本_autoA开源(用java写安卓无障碍脚本)

热门文章

  1. MySQL索引type级别意思
  2. Linux 环境编程 day01 Linux系统介绍、GNU编译工具、静态/共享库、环境变量表
  3. Aero开启失败问题解决
  4. 雅思经验(9)之小作文常用词汇总结
  5. 苦战5局险胜许昕 樊振东:心态有波动 以后要克服
  6. 一文讲透|如何部署OceanBase社区版(4.x版)
  7. COM, COM+ 和 .NET 的区别
  8. 1.ReactiveX - 什么是Rx,Rx的理念和优势
  9. 区块链时代正开启 中原精英探讨区块链未来 ----2018华中首届区块链论坛郑州开幕
  10. 《精彩人生的一分钟小习惯》读后感