从CSDN下载demo:https://download.csdn.net/download/u011018979/16651799
文章:https://kunnan.blog.csdn.net/article/details/115653905 原理:利用CoreGraphics进行自定义转盘的绘制 视频:https://live.csdn.net/v/158749
iOS概率抽奖算法 & 转盘算法 &轮盘边框动画丨蓄力计划https://kunnan.blog.csdn.net/article/details/115630759
@interface KNTurntableView()
/**
转盘视图
*/
@property (strong, nonatomic) SubTurntableView *turntable;
/**
开始抽奖按钮
*/
@property (nonatomic, weak) UIButton *startButton;
/**
点击抽奖文字视图
*/
@property (nonatomic, weak) UIImageView *textImgView;
/**
指针视图
*/
@property (nonatomic, weak) UIImageView *needleImgView;
- (instancetype)initWithFrame:(CGRect)frame {
return [self initWithFrame:frame ViewModel:nil];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
return [self initWithFrame:CGRectZero ViewModel:nil];
}
- (instancetype)initWithViewModel:(id)ViewModel {
return [self initWithFrame:CGRectZero ViewModel:ViewModel];
}
- (instancetype)initWithFrame:(CGRect)frame ViewModel:(id)viewModel {
if (self = [super initWithFrame:frame]) {
_viewModel = viewModel;
[self selfInit];
[self createSubView];
[self setupdata];
[self bindViewModel];
}
return self;
}
- (void)selfInit{
// self.backgroundColor = k_view_backColor;
}
- (void)createSubView{
[self turntable];
self.turntable.luckyItemArray = _viewModel.luckyItemArray;
[self initStartBtn];
}
- (void)setupdata{
}
- (void)bindViewModel{
}
- (SubTurntableView *)turntable{
if(_turntable == nil){
_turntable = [[SubTurntableView alloc] init];
[self addSubview:_turntable];
__weak __typeof__(self) weakSelf = self;
[_turntable mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(weakSelf);
}];
[_turntable setRotaryEndTurnBlock:^{
[weakSelf lunckyAnimationDidStop];
}];
}
return _turntable;
;
}
1、判断用户是否可以抽奖
禁用按钮 self.startButton.enabled = NO;
2、发起网络请求获取当前选中奖品,demo通过随机的方式获取一次index; 另外一种是根据奖品百分比进行控制
3、拿到当前奖品的 找到其对于的位置
4、让转盘转起来
/**
//1、判断用户是否可以抽奖
//禁用按钮
// self.startButton.enabled = NO;
//2、发起网络请求获取当前选中奖品,demo通过随机的方式获取一次index; 另外一种是根据奖品百分比进行控制
//3、拿到当前奖品的 找到其对于的位置
//4、让转盘转起来
*/
- (void)startAction {
[self setupStartBtnState4noenable];
// 方式一: 发起网络请求获取当前选中奖品,demo通过随机的方式获取一次index;
// self.viewModel.endId = arc4random() % self.viewModel.luckyItemArray.count;
// 控制中奖的方式二:另外一种是根据奖品百分比进行控制中奖概率
// NSInteger randomNum = arc4random()%100;//控制概率
// 奖品 title A ,index下标0,中奖 概率probability80%, 就是当randomNum为0-80,返回中奖下标0
// 为了便于理解,我们称奖品A的【随机中奖范围】 probabilityRange为0-80
//
// 根据randomNum,确定中奖奖品
KNTurntableViewModel *tmp = [KNTurntableViewModel getMbyprobabilityRangeWithArr:self.viewModel.luckyItemArray];
// return nil;// 谢谢参与
if(tmp){
self.viewModel.endId = tmp.index;
}else{
self.viewModel.endId = 0;// 谢谢参与
}
[self turntableRotate:self.viewModel.endId];
}
- (void)lunckyAnimationDidStop {
self.startButton.enabled = YES;
self.textImgView.image = [UIImage imageNamed:@"lottery_state_start"];
self.needleImgView.image = [UIImage imageNamed:@"lottery_start_needle_enable"];
NSLog(@"============????????============:%ld",self.viewModel.endId);
KNTurntableViewModel *model = self.viewModel.luckyItemArray[self.viewModel.endId];
NSLog(@"============????????============:%@",model.title);
//抽奖结束 弹出奖品
KNPrizePopView *popView = [KNPrizePopView new];
KNActivityPrizeModel *m = [KNActivityPrizeModel new];
m.icon = model.icon;
m.prizeName =model.title;
m.winnerNum = [@1 description];
[popView showWithModel:m];
popView.popShareBlock = ^{
NSLog(@"分享按钮点击了");
};
}
原理:利用CoreGraphics进行自定义转盘的绘制
#import "KNTurntableViewModel.h"
#import <UIKit/UIKit.h>
#define D2R(degrees) ((M_PI * degrees) / 180)
@interface SubTurntableView : UIView
/**
奖品数据
*/
@property (nonatomic, strong) NSArray<KNTurntableViewModel *> *luckyItemArray;
-(void)animationWithSelectonIndex:(NSInteger)index;
//结束旋转
@property (nonatomic, copy) void (^rotaryEndTurnBlock)(void);