最近在看《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. 20145307《信息安全系统设计基础》课程总结
  2. [特征工程系列二]显性特征的基本处理方法
  3. [Python爬虫] 之十二:Selenium +phantomjs抓取中的url编码问题
  4. npm运行报错:Error: ENOSPC: System limit for number of file watchers reached
  5. aws消息服务器,经验分享:我们如何使用AWS构建无服务器架构 - hypertrack
  6. 【实践】微博多尺度序列推荐算法实践.pdf(附下载链接)
  7. 开启和关闭HBase的thrift进程
  8. 如何查看本地端口???
  9. 机器学习实战(十一)FP-growth算法
  10. 西门子g120变频器接线图_西门子S7—1500第二十二讲(G120变频器第二篇)
  11. Ubuntu系统清理瘦身
  12. 制作席慕蓉的诗html,席慕容诗歌集
  13. android 9.0 SystemUI导航栏添加虚拟按键功能(三)
  14. 移动光猫只有一个lan口?其他是电视用,如何增lan口
  15. TDMS如何用Excel打开编辑
  16. SharePoint重置密码功能Demo
  17. linux内核安装编译
  18. 2017-11-11 今天的工作任务
  19. ICP、ICP备案、ICP证是什么意思?有什么区别和联系?
  20. 超级文件批量重命名工具

热门文章

  1. PAT 1012 The Best Rank (25 分)
  2. 谁在使用 MacBook?来聊聊苹果笔记本的用户群体
  3. 论程序员写不出代码怎么办
  4. 百度站长平台网站验证图文教程
  5. Mac M1 pro 安装 python2 教程
  6. windows 下 MAC地址绑定
  7. 内链和外链到底是什么?
  8. 10月15日绿健简报,星期六,农历九月二十
  9. 笔记本外接显示器DELL,显示器总是阶段性黑屏
  10. 工单自动分配算法实现