iOS button组实现摇奖效果

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface YaoJiangView : UIView

/**  按钮名字  */
@property (nonatomic, strong) NSArray *arr;


/**  摇奖结果不是随机的 而是固定的 可以自定义摇奖结果   */
@property (nonatomic, strong) NSString *stopStr;

@end

NS_ASSUME_NONNULL_END


#import "YaoJiangView.h"

#define GuDing 3
#define HangCount 4

@interface YaoJiangView ()

/**  存放包括开始按钮 以及四周的一圈摇奖选项  的全部按钮  */
@property (nonatomic, strong) NSMutableArray *buttonArr;

/**  当前高亮的选项  */
@property (nonatomic, assign) NSInteger buttonINdex;

/**  除去中间按钮以外的 四周按钮  */
@property (nonatomic, strong) NSMutableArray *yaoJiangArr;

/**
 停止信号
 但不是立刻停止
 在减速缓冲圈数完成 和 最后抽奖结果一致
 三个信号均满足才会停止
 
 */
@property (nonatomic, assign) BOOL stop;

/**  开始按钮  */
@property (nonatomic, strong) UIButton *actionButton;

/**  缓冲圈数  */
@property (nonatomic, assign) NSInteger quanShu;

/**  秒数  */
@property (nonatomic, assign) CGFloat miaoShu;

@end
@implementation YaoJiangView

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

- (instancetype)initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];
    if (self)
    {
       
    }
    return self;
}

-(void)setArr:(NSArray *)arr
{
    _arr = arr;
     [self initUI];
}

-(void)setStopStr:(NSString *)stopStr
{
    _stopStr = stopStr;
}

- (void)initUI
{
    _quanShu = 0;
    _miaoShu = 0.05f;
    self.buttonArr = [self addMenuButton:self.arr];
    self.yaoJiangArr = self.buttonArr;
    
    for (int i = 0; i < self.yaoJiangArr.count; ++i)
    {
        for (int j = 0; j < self.yaoJiangArr.count-1; ++j)
        {
            UIButton *button = self.yaoJiangArr[j];
            UIButton *button2 = self.yaoJiangArr[j+1];
            NSInteger namet = [button.currentTitle integerValue];
            NSInteger namet2 = [button2.currentTitle integerValue];
            
            if (namet > namet2)
            {
                [self.yaoJiangArr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
            }
        }
    }
    
    NSMutableArray *arrlast = [NSMutableArray array];
    
    for (UIButton *button in self.yaoJiangArr)
    {
        NSString * namet = button.currentTitle;
        
        if ([namet isEqualToString:@"开始"])
        {
            _actionButton = button;
        }
        else
        {
            [arrlast addObject:button];
        }
    }
    self.yaoJiangArr = arrlast;
    _buttonINdex = 0;
}

#pragma mark ————————— 创建button组 —————————————
-(NSMutableArray *)addMenuButton:(NSArray *)arr
{
    NSMutableArray *arrReturn = [NSMutableArray array];
    
    CGFloat screenW =  CGRectGetWidth([UIScreen mainScreen].bounds);
    CGFloat space = 0;
    CGFloat x = 10;
    CGFloat y = 100;
    CGFloat w =  ( screenW - space * 2 - x * ( HangCount + 1 ) ) / HangCount;
    CGFloat h = 50;
    CGFloat bigW = w * 2 + x ;
    CGFloat temp = 0;
    CGFloat newI = 0;
    CGFloat newW = 0;
    
    for (int i = 0;  i < arr.count ; i++)
    {
        if ([arr[i] isEqualToString:@"10"] || [arr[i] isEqualToString:@"9"]  )
        {
            y = y + h + x;
            space = 0;
            temp = i ;
        }
        
        space += newW + x;
        
        if ([arr[i] isEqualToString:@"开始"] )
        {
            newW = bigW;
        }
        else
        {
            newW = w;
        }
        
        newI = i - temp;
        
        if (newI == 0)
        {
            space = x;
        }
        
        
        UIButton *button = [UIButton buttonWithType:(UIButtonTypeCustom)];
        button.frame = CGRectMake(space, y, newW, h);
        [button setTitle:arr[i] forState:(UIControlStateNormal)];
        [button setBackgroundColor:[UIColor redColor]];
        button.tag = i+10;
        
        [button addTarget:self action:@selector(buttonSender:) forControlEvents:(UIControlEventTouchUpInside)];
        
        [self addSubview:button];
        
        
        // 这是 SDAutoLayout 的约束 引入第三方就可以
        //        button.sd_layout
        //        .topSpaceToView(self.view, y)
        //        .leftSpaceToView(self.view, space)
        //        .widthIs(newW)
        //        .heightIs(h);
        
        [arrReturn addObject:button];
    }
    return arrReturn;
}

#pragma mark ————————— 点击事件 —————————————
-(void)buttonSender:(UIButton *)sender
{
    if ([sender.currentTitle isEqualToString:@"开始"] )
    {
        NSLog(@"开始抽奖");
        [sender setTitle:@"停止" forState:(UIControlStateNormal)];
        
        for (UIButton *button in self.yaoJiangArr)
        {
            [button setBackgroundColor:[UIColor redColor]];
        }
        _buttonINdex = 0;
        _stop = NO;
        [self actionZhuanQuanQuan];
        return;
    }
    
    if ([sender.currentTitle isEqualToString:@"停止"] )
    {
        [sender setTitle:@"开始" forState:(UIControlStateNormal)];
        _stop = YES;
        sender.enabled = NO;
        
    }
}

#pragma mark ————————— 模拟转圈圈 —————————————
-(void)actionZhuanQuanQuan
{
    NSLog(@"模拟转圈圈");
    
    UIButton *button = self.yaoJiangArr[_buttonINdex];
    
    // 收到停止信号
    if (self.stop == YES)
    {
        //没完成一圈时间增加 模拟减速
        if ([button.currentTitle isEqualToString:self.arr.firstObject])
        {
            _quanShu ++;
            _miaoShu = _miaoShu+0.07;
        }
    }
    
    __weak __typeof(&*self)weakSelf = self;
    
    [UIView animateWithDuration:_miaoShu animations:^{
        [button setBackgroundColor:[UIColor blueColor]];
    } completion:^(BOOL finished) {
        
        if ( weakSelf.stop == YES &&
            weakSelf.quanShu == GuDing &&
            [button.currentTitle isEqualToString:weakSelf.stopStr] )
        {
            weakSelf.actionButton.enabled = YES;
            weakSelf.quanShu = 0;
            weakSelf.miaoShu = 0.05f;
        }
        else
        {
            [button setBackgroundColor:[UIColor redColor]];
            weakSelf.buttonINdex ++;
            
            if (weakSelf.buttonINdex > weakSelf.yaoJiangArr.count-1)
            {
                weakSelf.buttonINdex = 0;
            }
            [weakSelf actionZhuanQuanQuan];
        }
    }];
}

-(NSMutableArray *)yaoJiangArr{
    if (!_yaoJiangArr)
    {
        _yaoJiangArr = [NSMutableArray array];
    }
    return _yaoJiangArr;
}

-(NSMutableArray *)buttonArr{
    if (!_buttonArr)
    {
        _buttonArr = [NSMutableArray array];
    }
    return _buttonArr;
    
}

@end
#import "ViewController.h"
#import "YaoJiangView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    
    NSArray *arr = @[@"1",@"2",@"3",@"4",@"10",@"开始",@"5",@"9",@"8",@"7",@"6"];
    YaoJiangView *view = [[YaoJiangView alloc]initWithFrame:self.view.bounds];
    view.arr = arr;
    view.stopStr = arr[3];
    [self.view addSubview:view];
}



@end

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值