Demo6—抽奖转盘
一.搭建界面
1.设置背景图片

self.view.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"LuckyBackground"].CGImage);

2.自定义一个类管理转盘视图,并用xib关联界面

  • 创建一个xib文件,负责管理界面的基本搭建,与LuckWheelView类关联

    并设置图片的大小
  • 写一个类方法快速创建当前类LuckWheelView的一个对象
 + (LuckWheelView *)wheel{//创建当前类的一个对象LuckWheelView *luckView = [[[NSBundle mainBundle] loadNibNamed:@"LuckWheelView" owner:self options:nil] lastObject];//放回对象return luckView;
}
  • 在控制类中用户使用,创建转盘视图,并设置视图处于主视图中心
LuckWheelView *luckView = [LuckWheelView wheel];
luckView.center = self.view.center;
  • 让这个转盘视图显示到主视图上
[self.view addSubview:luckView];

3.当xib文件加载结束后执行后续事件

  • 由于xib中搭建的界面背景是白色的,所以,为了视觉感,将其背景颜色设为透明
self.backgroundColor = [UIColor clearColor];
  • 给转盘上添加12个按钮,不接收事件,设置按钮的中心位置为视图的中心;设置按钮的大小;设置按钮的锚点在矩形的下边线中间,以便其他按钮通过旋转形成圆盘;给按钮设置背景图片,并把各个按钮添加到转盘视图上,不可添加到主视图上,因为给主视图上添加视图是添加到主视图的最外层,会覆盖一部分视图;旋转按钮,每次循环旋转30°;给按钮上添加内容图片,表示抽奖结果。
for (int i = 0; i < 12; i++) {UIButton *btn = [[UIButton alloc] init];//设置位置btn.layer.position = self.center;//设置尺寸btn.layer.bounds = CGRectMake(0, 0, 68, 143);//设置锚点btn.layer.anchorPoint = CGPointMake(0.5, 1);//设置图片[btn setBackgroundImage:[UIImage imageNamed:@"LuckyRototeSelected"] forState:UIControlStateSelected];[self.wheelImageView addSubview:btn];//旋转图片btn.transform = CGAffineTransformRotate(btn.transform, M_PI * 2 / 12 * i);
}
  • 为了提高可移植性,把截取图片写成一个工具类别,分两步实现,第一步是已知所裁图片的名称和裁第几个,然后根据得到的图片和范围裁剪需要的那个图片。
  • 第一步:先通过已知的图片名称读取图片,然后计算截取一个图片的宽高,但是为了适应不同型号的手机大小,在这里需要乘一个倍数,最后计算出裁剪的范围
 + (UIImage *)clipWithImageNamed:(NSString *)imgName index:(int)index{//读取图片UIImage *img = [UIImage imageNamed:imgName];//计算每一个的宽高CGFloat width = img.size.width / 12.0 * [UIScreen mainScreen].scale;CGFloat height = img.size.height * [UIScreen mainScreen].scale;//计算裁剪的范围CGRect frame = CGRectMake(index * width, 0, width, height);return [self clipWithImage:img rect:frame];
}
  • 第二步:算出要裁剪的范围后,调用CGImageCreateWithImageInRect方法直接裁取指定范围内的图片

CGImageRef是一个结构体指针,这个结构用来创建像素位图,可以通过操作存储的像素位来编辑图片

typedef struct CF_BRIDGED_TYPE(id) CGImage *CGImageRef;
+(UIImage *)clipWithImage:(UIImage *)img rect:(CGRect)frame{CGImageRef imgRef = CGImageCreateWithImageInRect(img.CGImage, frame);/*匹配屏幕大小参数1: cgImage:image.CGImage  image为原始图片参数2:scale:原始图片放大倍数参数3:orientation:控制image的绘制方向*/UIImage *newImage = [UIImage imageWithCGImage:imgRef scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];return newImage;
}
  • 在for循环那里加上裁取内容图片这一步
//截取图片
UIImage *orgLongImage = [UIImage clipWithImageNamed:@"LuckyAstrology" index:i];//将图片显示到按钮上
[btn setImage:orgLongImage forState:UIControlStateNormal];

二.触发事件
1.在LuckWheelView类中关联xib中开始抽奖按钮的时间
2.设置一个定时器控制转盘的开始和暂停

  • 定一个属性变量link
@property(nonatomic, strong) CADisplayLink *link;
  • 当link为空时转盘开始,不为空时转盘暂停,转盘暂停之后继续转一个角度经过一个缓冲后再停下
- (IBAction)startButtonDidClicked:(id)sender {if (self.link) {//self.link.paused = !_link.paused;if (self.link.paused == YES) {//1.暂停_link.paused = NO;} else {_link.paused = YES;//2.继续旋转一个角度[self stop];}} else{//创建定时器 执行旋转任务self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(rotate)];//启动定时器[_link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];}
}
  • 转盘开始转的方法
- (void)rotate{_wheelImageView.transform = CGAffineTransformRotate(_wheelImageView.transform, M_PI/30);
}

3.转盘暂停后再转一个角度缓冲并点亮箭头所指的那个按钮,首先需要计算出箭头所指方向…

- (void)stop{[UIView animateWithDuration:2 animations:^{self.wheelImageView.transform = CGAffineTransformRotate(self.wheelImageView.transform, M_PI*8/9.0);} completion:^(BOOL finished) {//确定剪头指向哪个按钮//1.获取旋转之后的弧度CGFloat hudu = [self getRadianDegreeFromTransform:self.wheelImageView.transform];//2.根据弧度计算旋转了几个按钮int index = (hudu - M_PI/12.0)/(M_PI/6.0);if (hudu - index*M_PI/6.0 > 0) {index++;}//3.通过tag值获取按钮对象_selectedButton = [self.wheelImageView viewWithTag:12-index+1];_selectedButton.selected = YES;}];
}
  • 计算旋转的弧度
- (CGFloat)getRadianDegreeFromTransform:(CGAffineTransform)transform{CGFloat rotate = acosf(transform.a);// 旋转180度后,需要处理弧度的变化if (transform.b < 0) {rotate = M_PI*2 - rotate;}return rotate;
}

iOS篇—Demo6—抽奖转盘相关推荐

  1. 微信大转盘 java_[Java教程]使用CSS3+jquery.js 实现微信抽奖转盘效果

    [Java教程]使用CSS3+jquery.js 实现微信抽奖转盘效果 0 2014-03-19 02:00:24 上次发表了一篇 微信抽奖转盘活动-效果源码分析 最近想起了刚接到这个项目时第一时间脑 ...

  2. 九宫格抽奖转盘源码分析

         效果如上图所示,下面对其实现代码进行分析,看能不能破解其抽奖规则.需要引入jquery-1.8.3.min.js和images/9张图片. <!DOCTYPE html PUBLIC ...

  3. Html5-Canvas实现简易的抽奖转盘

    ###Html5实现抽奖转盘效果 1.实现的基本效果 2.主要的内容 html5中canvas标签的使用 jQueryRotate.js旋转插件 3.主要html代码 <body>< ...

  4. cocos2dx 圆盘抽奖_cocoscreator之微信小游戏的抽奖转盘

    许多小游戏里面都有涉及到抽奖环节,所以就可能会用到抽奖转盘的制作,今天分享一个自己左转盘的小小过程. 1.准备材料过程不多说,拼完界面之后大概是这样的: 2.给界面绑定脚本,在脚本的propertie ...

  5. 详解与重构hyman《Android SurfaceView实战 打造抽奖转盘》

    详解与重构hyman<Android SurfaceView实战 打造抽奖转盘> 作者:邵励治 一.概述--关于SurfaceView您不得不知道的二三事 1.SurfaceView是干什 ...

  6. Android开发:抽奖转盘的实现

    故事的开始 最近有个需求,支付成功的时候加个抽奖轮盘.类似问卷星提交后的那种东西,翻了一下gayhub,下面给出自己的实现思路. 写在题前 这东西是在github上一个项目是拓展的.但是实现时间和下载 ...

  7. html页面转盘如何实现,原生(纯)js+html+css实现移动端抽奖转盘系统

    这是我前个月使用纯javascript+html写出的一个抽奖转盘系统,按理来说,我应该在当时做完这个小系统,就应该立即写bike总结才对,但是本人之前没有在网上写博客的习惯,平时总结更加习惯写在纸上 ...

  8. python转盘抽奖_react 抽奖转盘 ----小计

    前言 很久没有写过小组件了,突然想做一个抽奖转盘,就花半天时间做一个,很简单 1.支持把一个圆盘分成n瓣. 2.实现转动动画. 3.弄个指针样式意思意思. 4.遇到抽奖的需求改吧改吧就能用了. 图是这 ...

  9. 抽奖 开源 html5,抽奖转盘.html · smilestone/awardRotate - Gitee.com

    jQuery 抽奖转盘 #box{width: 340px;height: 340px; position: absolute; left:50%;top:50%;margin-left:-170px ...

最新文章

  1. 2020诺奖预测出炉!一位华人学者入选
  2. 有理想的程序员必须知道的15件事
  3. 阴雨连绵潮湿加剧 车辆防潮提升保值
  4. 使用Scrapy时出现虽然队列里有很多Request但是却不下载,造成假死状态
  5. html设置table表格的弧度,用CSS3和table标签实现一个圆形轨迹的动画的示例代码
  6. jsp+servlet实现文件的上传和下载
  7. 世界编程语言2008年初排行榜
  8. 视频通讯使用的SIP协议详解
  9. Matlab用巴特沃斯带通滤波器产生窄带高斯噪声并进行时域频域分析
  10. 最新上市公司商誉减值损失数据
  11. Android TV Input Framework(TIF)--构建TV input list
  12. ABE或IBE中属性撤销的寻找最小覆盖集的基本算法
  13. 清华大学计算机相关夏令营,夏令营报名
  14. ariang修改默认服务器,Mac小技巧之AriaNg Native配置
  15. 转载:optparse模块OptionParser学习
  16. 洞悉数字资产存储与交易 免于“韭菜”的命运
  17. Java通过webcam-capture调用摄像头并截图
  18. CityMaker学习教程09 一个示例,多窗体,画中画,多屏幕显示
  19. C++ 动态库导出函数名乱码及解决
  20. 支持向量机(SVM)--小样本

热门文章

  1. 华为实现中:STP链路或端口失效后网络重新收敛所需时间
  2. 5个Excel快速查找,解决删除重复值技巧
  3. python车牌识别系统抬杆_【小区停车场车牌识别系统 车辆进门道闸自动抬杆】 - 太平洋安防网...
  4. 模板技术-freemarker与velocity
  5. 老男孩培训 | 0基础转行,大专学历,工资翻3倍,他只用了5个月!
  6. 中职学校计算机实训室简介,中职学校计算机实训教学质量论文
  7. 计算机的屏幕怎么扩展,电脑如何扩展屏幕_给电脑扩展屏幕的设置方法
  8. Windwos server 2019域控制器策略部分
  9. 恢复MAC保存丢失的word文档
  10. 数据湖是一种方法 数据湖的四个最佳实践