前些日子,公司做了个竞猜下注功能。突发奇想,想做一个转盘抽象的功能,于是便有了接下来的demo。

demo地址:  https://github.com/SunshineTraveller/GambleView

思路:

1.根据外界给定数组画对应个数的扇形,然后加到一个父视图上

2.给父视图添加转盘动画

~~~~~~~~~~~~~~~~~~~~~~~~~~begin~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1.1先画一个扇形,给它起个名叫GambleCell,利用UIBezierPath画几个点,然后闭合上既可

.h文件

#import <UIKit/UIKit.h>

@interface GambleCell : UIView

/** title */

@property(nonatomic,copy) NSString *title;

@end

.m文件

#import "GambleCell.h"

#import "UIColor+Extension.h"

#import "UIView+Extension.h"

@interface GambleCell ()

/** title */

@property (nonatomic,strong)UILabel  *titleLabel;

@end

@implementation GambleCell

- (instancetype)initWithFrame:(CGRect)frame

{

self = [superinitWithFrame:frame];

if (self) {

[self addSubviews];

}

return self;

}

-(void)addSubviews {

// 画扇形

CAShapeLayer *maskLayer = [[CAShapeLayeralloc] init];

UIBezierPath *path = [UIBezierPathbezierPath];

[path moveToPoint:CGPointMake(0,self.frame.size.height)];

[path addLineToPoint:CGPointMake(self.frame.size.width/2,0)];

[path addLineToPoint:CGPointMake(self.frame.size.width,self.frame.size.height)];

[path closePath];

maskLayer.path = path.CGPath;

[maskLayer setFillColor:[UIColorblackColor].CGColor];

self.layer.mask = maskLayer;

UILabel *title = [[UILabelalloc] initWithFrame:CGRectMake(0,self.height-25,self.width,15)];

title.backgroundColor = [UIColorclearColor];

title.textAlignment =NSTextAlignmentCenter;

self.titleLabel = title;

title.font = [UIFontsystemFontOfSize:12];

title.textColor = [UIColorcolorWithHexString:@"baa160"];

[self addSubview:title];

}

-(void)setTitle:(NSString *)title {

self.titleLabel.text = title;

}

@end

1.2 将画好的cell根据外界数组添加到父视图上
1.2.1 父视图
.h文件

#import <UIKit/UIKit.h>

@interface GambleView : UIView

/** finish */

@property(nonatomic,copy) void (^finish)(void);

/**

* 实例

* @param frame frame

* @param colors 颜色数组

* @return 实例

*/

-(instancetype)initWithFrame:(CGRect)frame colors:(NSArray *)colors;

@end

.m文件

#import "UIView+Extension.h"

#import "GambleCell.h"

#import "GambleView.h"

@interface GambleView ()

/** 颜色数组 */

@property (nonatomic,strong)NSArray *colors;

/** fromValue */

@property (nonatomic,strong)NSNumber *fromValue;

@end

@implementation GambleView

/**

实例

@param frame frame

@param colors 颜色数组

@return 实例

*/

-(instancetype)initWithFrame:(CGRect)frame colors:(NSArray *)colors {

if (colors.count ==0) return nil;

self.colors = colors;

return [selfinitWithFrame:frame];

}

- (instancetype)initWithFrame:(CGRect)frame {

self = [superinitWithFrame:frame];

if (self) {

self.backgroundColor = [UIColoryellowColor];

self.clipsToBounds =YES;

[self addGestures];

[self addSubviews];

}

return self;

}

- (void)dealloc

{

NSLog(@"大转盘销毁了");

}

/**

* 添加子视图

*/

-(void)addSubviews {

// 关键点在计算上,要算好扇形实际在圆里的大小

_fromValue = @(0);

NSArray *titles =@[@"吃鸡",@"爆头10次",@"吉利服",@"杀10个",@"不被救助",@"杀15个"];

NSArray *colors = self.colors;

CGFloat angle = 2*M_PI/colors.count;

CGFloat r =self.frame.size.height/2;

CGFloat x = r*sin(angle/2);

CGFloat y = r*cos(angle/2);

CGFloat cwid = x/y*r;

// 将cell添加到俯视图上,这里要根据cell个数绕锚点进行不同角度的旋转,

for (int i =0; i<colors.count; i++) {

GambleCell *cell = [[GambleCellalloc] initWithFrame:CGRectMake(0,0,2*cwid,self.frame.size.height/2)];

cell.title = titles[i];

cell.layer.position =CGPointMake(self.width/2,self.height/2);

cell.backgroundColor = colors[i];

[self addSubview:cell];

cell.layer.anchorPoint =CGPointMake(0.5,0);

cell.transform =CGAffineTransformMakeRotation(-angle*i);

}

}

/**

* 手势

*/

-(void)addGestures {

UITapGestureRecognizer *tap = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(tapAction)];

[selfaddGestureRecognizer:tap];

}

-(void)tapAction {

// 这里随便给几个数值 让其进行旋转  不用transform动画的原因是:当旋转角度和最终角度位置一样时,不会产生动画

NSArray  *times =@[@(30),@(31),@(32)];

NSNumber *time = [times objectAtIndex:arc4random()%3];

CABasicAnimation *baseAni = [CABasicAnimationanimation];

baseAni.keyPath =@"transform.rotation.z";

baseAni.duration = time.floatValue/6;

baseAni.fromValue =_fromValue;

baseAni.toValue = [NSNumbernumberWithFloat:M_PI/3*time.floatValue];

baseAni.autoreverses = NO;

baseAni.removedOnCompletion =NO;

baseAni.fillMode =kCAFillModeForwards;

baseAni.timingFunction = [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseInEaseOut];

[self.layeraddAnimation:baseAni forKey:@""];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(time.floatValue/6 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

if (self.finish) {

self.finish();

}

});

}

VC中调用

NSArray *colors = @[[UIColorredColor],[UIColorblueColor],[UIColoryellowColor],[UIColorcyanColor],[UIColorpurpleColor],[UIColorgreenColor]];

GambleView *dubo = [[GambleViewalloc] initWithFrame:CGRectMake(80,300, 200, 200) colors:colors];

dubo.layer.cornerRadius =100;

[self.viewaddSubview:dubo];

dubo.finish = ^{

[selfemitterEffect];

};

[self.viewsendSubviewToBack:dubo];

UIImageView *imv = [[UIImageViewalloc] initWithFrame:dubo.frame];

imv.x += dubo.width/2-10;

imv.y += 22;

imv.width = 20;

imv.height = dubo.height/2-18;

imv.backgroundColor = [UIColorclearColor];

imv.image = [UIImageimageNamed:@"pointer"];

[self.viewaddSubview:imv];

//  转盘结束,加一个简单的粒子动画表示中奖效果,有点low     ~~~~(>_<)~~~~

-(void)emitterEffect {

CAEmitterCell *cell = [[CAEmitterCellalloc] init];

//展示的图片

cell.contents = (__bridgeid _Nullable)([UIImageimageNamed:@"gold"].CGImage);

//每秒粒子产生个数的乘数因子,会和layer的birthRate相乘,然后确定每秒产生的粒子个数

cell.birthRate = 200;

//每个粒子存活时长

cell.lifetime = 5.0;

//粒子生命周期范围

cell.lifetimeRange =0.3;

//粒子透明度变化,设置为-0.4,就是每过一秒透明度就减少0.4,这样就有消失的效果,一般设置为负数。

//    cell.alphaSpeed = -0.2;

//    cell.alphaRange = 0.5;

//粒子的速度

cell.velocity = 40;

//粒子的速度范围

cell.velocityRange =20;

//周围发射的角度,如果为M_PI*2 就可以从360度任意位置发射

//        cell.emissionRange = M_PI*2;

//粒子内容的颜色

//    cell.color = [[UIColor whiteColor] CGColor];

cell.redRange = 0.5;

cell.blueRange = 0.5;

cell.greenRange = 0.5;

//缩放比例

cell.scale = 1;

//缩放比例范围

cell.scaleRange = 0.2;

//粒子的初始发射方向

cell.emissionLongitude =M_PI;

//Y方向的加速度

cell.yAcceleration =70.0;

//X方向加速度

//    cell.xAcceleration = 20.0;

_emitterLayer = [CAEmitterLayerlayer];

//发射位置

_emitterLayer.emitterPosition =CGPointMake(SCREEN_WIDTH/2.0,0);

//粒子产生系数,默认为1

_emitterLayer.birthRate =1;

//发射器的尺寸

_emitterLayer.emitterSize =CGSizeMake(SCREEN_WIDTH,0);

//发射的形状

_emitterLayer.emitterShape =kCAEmitterLayerSphere;

//发射的模式

_emitterLayer.emitterMode =kCAEmitterLayerOutline;

//渲染模式

_emitterLayer.renderMode =kCAEmitterLayerUnordered;

_emitterLayer.zPosition = -1;

_emitterLayer.emitterCells =@[cell];

[self.view.layeraddSublayer:_emitterLayer];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

self.emitterLayer.birthRate =0;

});

}

demo地址:  https://github.com/SunshineTraveller/GambleView

~~~~~~~~~~~~~~~~~~~~~~~~~~end~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

iOS 幸运转盘抽奖+粒子动画相关推荐

  1. android 矢量粒子动画,iOS CAEmitterLayer实现粒子发射动画效果

    iOS实现粒子发射动画效果图 动画效果用 CAEmitterLayer 实现.CAEmitterLayer 显示粒子发射动画,具体的粒子由 CAEmitterCell 封装.代码示例是展示 CAEmi ...

  2. iOS实现“下雨下雪”动画效果和“烟花”动画效果

    "下雨"的动画效果 一.效果展示 二.实现流程 设置背景 func setupUI() {self.imageView = UIImageView.init()self.image ...

  3. Swift开发之粒子动画的实现

    ####粒子系统介绍 什么是粒子系统? 粒子系统是由总体具有相同的表现规律,个体却随机表现出不同的特征的大量显示元素构成的集合. 粒子定义有三要素 群体性:粒子系统是由"大量显示元素&quo ...

  4. android 烟雾动画,android使用粒子动画实现炊烟袅袅的效果

    很久以前,做了一个关于旅游景区的项目,要求在等待页面实现一个炊烟袅袅升起的效果,本来是没有这个的,鬼知道我们的ios大神(坑货)从哪找来的,我们项目经理一看非常满意,要我们也加一个!(团队有这样的大神 ...

  5. VCTransitionsLibrary –自定义iOS交互式转场动画的库

    简介 VCTransitionsLibrary 提供了许多适用于入栈,出栈,模态等场景下控制器切换时的转场动画.它本身提供了一个定义好的转场动画库,你可以拖到自己工程中直接使用;也提供了许多拥有不同转 ...

  6. canvas学习之粒子动画

    项目地址:http://pan.baidu.com/s/1ccTptc 粒子动画意思就是把一个图片粒子画,然后使用粒子作出动画效果,主要两个问题:一个图片如何粒子化,这里面我们使用canvas的get ...

  7. canvas粒子动画

    2019独角兽企业重金招聘Python工程师标准>>> 周末在家玩了一下canvas粒子动画,先看看效果,用的图是我们微众银行的干爹'qq',先看看效果 ##1.获取图片信息 ### ...

  8. iOS - Core Animation 核心动画

    1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...

  9. vuejs粒子动画特效 npm安装插件vue-particles(particles.js) - 代码篇

    文章目录 1. npm 安装插件`vue-particles` 2. 效果图: 3. 代码截图: 4. 代码示下: 5. 附件 · 文章阅读: 1. npm 安装插件vue-particles npm ...

  10. 惊艳的HTML5粒子动画特效

    转自:http://geek.csdn.net/news/detail/201487?ref=myread HTML5确实非常强大,很多时候我们可以利用HTML5中的新技术实现非常炫酷的粒子动画效果, ...

最新文章

  1. [转] MySQL和MongoDB设计实例对比
  2. 突破屏蔽限制,自己的网站使劲弹新IE窗口
  3. linux命令行变大,Linux命令行下'!'的8大神奇的用法!
  4. mybatis mysql5.7_【mysql】mysql5.7支持的json字段查询【mybatis】
  5. 补CEGUIFont_xmlHandler.cpp
  6. ASCII码表 0~127
  7. Unity快速安装教程
  8. DDoS异常流量清洗解决方案
  9. loadrunner支持的浏览器版本
  10. html背景图片大小嵌套,div嵌套div 背景图片 不显示的问题
  11. 蛮力法 第4关:韩信点兵问题
  12. 暑假2019培训:Day3Day4提高组测试赛
  13. ARM开发板 瑞芯微RK3288开发板
  14. 公司生产管理系统如何精细管控生产全过程
  15. 数据治理(二):数据治理功能方面
  16. linux使用gcc实现扫雷,基于linux环境下扫雷应用程序
  17. std::ifstream实例
  18. 微信小程序在 wxml 文件中使用 Array.includes 方法
  19. 中国动力电池PACK行业商业模式创新及发展方向建议报告2022-2028年版
  20. 5G NR协议栈----无线协议栈

热门文章

  1. poi操作ppt创建表格
  2. python中round(x、2)是什么意思_python中round函数具体使用详解
  3. NPOI实现Word表格新增一行
  4. Android项目实战(八):列表右侧边栏拼音展示效果
  5. C# WinForm 中嵌入另一个.EXE程序(给程序加锁)
  6. 软考高项 : (04)论项目沟通管理
  7. 【动态规划】流水作业调度问题与Johnson法则
  8. python编程一球从100米_Python求解一个球从100米高度自由落下的问题
  9. 数据库中了勒索病毒,怎么办?
  10. spring boot面试问题集锦