前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS抽奖转盘:概率抽奖算法 & 转盘算法 & 转盘主视图的实现思路 (完整Demo)

iOS抽奖转盘:概率抽奖算法 & 转盘算法 & 转盘主视图的实现思路 (完整Demo)

作者头像
公众号iOS逆向
发布2021-04-15 16:09:56
4.9K1
发布2021-04-15 16:09:56
举报
文章被收录于专栏:iOS逆向与安全

引言

从CSDN下载demo:https://download.csdn.net/download/u011018979/16651799

文章:https://kunnan.blog.csdn.net/article/details/115653905 原理:利用CoreGraphics进行自定义转盘的绘制 视频:https://live.csdn.net/v/158749

I 、概率抽奖算法 & 转盘算法

iOS概率抽奖算法 & 转盘算法 &轮盘边框动画丨蓄力计划https://kunnan.blog.csdn.net/article/details/115630759

II 、转盘主视图的实现

2.1 子视图

  • 属性
代码语言:javascript
复制
@interface KNTurntableView()
/**
 转盘视图
 */
@property (strong, nonatomic) SubTurntableView *turntable;

/**
 开始抽奖按钮
 */
@property (nonatomic, weak) UIButton *startButton;
/**
 点击抽奖文字视图
 */
@property (nonatomic, weak) UIImageView *textImgView;

/**
 指针视图
 */
@property (nonatomic, weak) UIImageView *needleImgView;


  • 初始化转盘视图
代码语言:javascript
复制
- (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;
    
;
    
    

}

2.2 处理点击抽奖事件

1、判断用户是否可以抽奖

禁用按钮 self.startButton.enabled = NO;

2、发起网络请求获取当前选中奖品,demo通过随机的方式获取一次index; 另外一种是根据奖品百分比进行控制

3、拿到当前奖品的 找到其对于的位置

4、让转盘转起来

代码语言:javascript
复制
/**
 //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];
    
}

2.3 抽奖结束,弹出奖品

代码语言:javascript
复制

- (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(@"分享按钮点击了");
        };

    
}


III、绘制转盘

原理:利用CoreGraphics进行自定义转盘的绘制

  • 头文件
代码语言:javascript
复制
#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);
  • 根据奖品绘制转盘
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS逆向 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • I 、概率抽奖算法 & 转盘算法
  • II 、转盘主视图的实现
    • 2.1 子视图
      • 2.2 处理点击抽奖事件
        • 2.3 抽奖结束,弹出奖品
        • III、绘制转盘
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档