// // QXAgePraizeView.m // QXLive // // Created by 启星 on 2025/8/16. // #import "QXAgePraizeView.h" #import "UIButton+QX.h" #import #import "QXAgePraizeRuleView.h" #import "QXAgePraizePoolView.h" #import "QXAgePraizeRecordView.h" #import "QXDrawGiftCenterView.h" #import "QXDiamondViewController.h" /// 共有12个礼物 static NSInteger giftMaxCount = 10; /// 最少转2圈 static NSInteger minRoundCount = 7; /// 距离4个的时候放慢 static NSInteger toSlowCount = 4; @interface QXAgePraizeView() /// 目标下标 @property (nonatomic,assign)NSInteger targetIndex; @property (nonatomic,strong)NSMutableArray* targetArrayIndex; @property (nonatomic,strong)NSMutableArray* finishTargetArrayIndex; /// 当前转动到第几个下标 @property (nonatomic,assign)NSInteger currentIndex; /// 转动了多少次 @property (nonatomic,assign)NSInteger roundCount; /// 延时 @property (nonatomic,assign)double delayTime; ///// 22 抽一次 33 抽十次 44 抽 100次 @property (nonatomic,assign)QXAgeDrawBtnType startType; @property (nonatomic,strong)QXAgePraizeSubView *currentGiftView; @property (nonatomic,strong)UIView *bgView; @property (nonatomic,strong)UIImageView *bgImageView; /// 奖池 @property (nonatomic,strong)UIButton *poolBtn; /// 规则 @property (nonatomic,strong)UIButton *ruleBtn; /// 记录 @property (nonatomic,strong)UIButton *recordBtn; /// 音效 @property (nonatomic,strong)UIButton *soundBtn; /// 特效 @property (nonatomic,strong)UIButton *specialBtn; @property (nonatomic,strong)NSMutableArray *allViewsArray; @property (nonatomic,strong)dispatch_source_t fastTimer; @property (nonatomic,strong)AVPlayer* player; /// 金币 @property (nonatomic,strong)UIView* coinView; @property (nonatomic,strong)UIButton* coinBtn; @property (nonatomic,strong)UIButton* exchangeBtn; @property (nonatomic,strong)QXAgeDrawBtn *oneBtn; @property (nonatomic,strong)QXAgeDrawBtn *tenBtn; @property (nonatomic,strong)QXAgeDrawBtn *hundredBtn; @property (nonatomic,strong)QXDrawGiftResultModel *drawResultModel; /// 是否正在抽奖 @property (nonatomic,assign)BOOL isDrawing; /// 是否开启音效 @property (nonatomic,assign)BOOL isOpenSound; /// 是否开启特效 @property (nonatomic,assign)BOOL isOpenSpecial; /// 规则视图 @property (nonatomic,strong)QXAgePraizeRuleView *ruleView; /// 奖池视图 @property (nonatomic,strong)QXAgePraizePoolView *poolView; /// 记录 @property (nonatomic,strong)QXAgePraizeRecordView *recordView; @property (nonatomic,strong)QXDrawGiftCenterView * centerView; @property (nonatomic,assign)double coin; @end @implementation QXAgePraizeView - (instancetype)init { self = [super init]; if (self) { self.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); [self initSubviews]; } return self; } -(void)initSubviews{ UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hide)]; tap.delegate = self; [self addGestureRecognizer:tap]; self.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.3]; self.bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, ScaleWidth(663))]; [self.bgView addRoundedCornersWithRadius:16 byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight)]; [self addSubview:self.bgView]; // 添加拖拽手势 UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)]; [self.bgView addGestureRecognizer:panGesture]; self.bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"active_age_castle_bg"]]; self.bgImageView.frame = CGRectMake(0, 0, SCREEN_WIDTH, ScaleWidth(663)); self.bgImageView.contentMode = UIViewContentModeScaleToFill; [self.bgView addSubview:self.bgImageView]; self.poolBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, ScaleWidth(48), ScaleWidth(48), ScaleWidth(24))]; [self.poolBtn setBackgroundImage:[UIImage imageNamed:@"age_right_bg"] forState:(UIControlStateNormal)]; [self.poolBtn setTitle:@"奖池" forState:(UIControlStateNormal)]; [self.poolBtn setTitleColor:RGB16(0xffffff) forState:(UIControlStateNormal)]; self.poolBtn.titleLabel.font = [UIFont systemFontOfSize:14]; [self.poolBtn addTarget:self action:@selector(poolAction) forControlEvents:(UIControlEventTouchUpInside)]; [self.bgView addSubview:self.poolBtn]; self.ruleBtn = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH-ScaleWidth(48), self.poolBtn.top, ScaleWidth(48), ScaleWidth(24))]; [self.ruleBtn setBackgroundImage:[UIImage imageNamed:@"age_left_bg"] forState:(UIControlStateNormal)]; [self.ruleBtn setTitle:@"规则" forState:(UIControlStateNormal)]; [self.ruleBtn setTitleColor:RGB16(0xffffff) forState:(UIControlStateNormal)]; self.ruleBtn.titleLabel.font = [UIFont systemFontOfSize:14]; [self.ruleBtn addTarget:self action:@selector(ruleAction) forControlEvents:(UIControlEventTouchUpInside)]; [self.bgView addSubview:self.ruleBtn]; self.recordBtn = [[UIButton alloc] initWithFrame:CGRectMake(self.ruleBtn.left, self.ruleBtn.bottom+12, ScaleWidth(48), ScaleWidth(24))]; [self.recordBtn setBackgroundImage:[UIImage imageNamed:@"age_left_bg"] forState:(UIControlStateNormal)]; [self.recordBtn setTitle:@"记录" forState:(UIControlStateNormal)]; [self.recordBtn setTitleColor:RGB16(0xffffff) forState:(UIControlStateNormal)]; self.recordBtn.titleLabel.font = [UIFont systemFontOfSize:14]; [self.recordBtn addTarget:self action:@selector(recordAction) forControlEvents:(UIControlEventTouchUpInside)]; [self.bgView addSubview:self.recordBtn]; [self.allViewsArray removeAllObjects]; CGFloat topMargin = self.recordBtn.bottom+5; CGFloat margin = 34; CGFloat space = 8; CGFloat leftSpace = 30; CGFloat itemWidth = (SCREEN_WIDTH - margin*2 - leftSpace*2) / 3; CGFloat itemHeight = itemWidth/82*99;; // for (int i = 0; i < giftMaxCount; i++) { // QXAgePraizeSubView *giftView; // if (i < 3) { // /// 第一行3个 // giftView = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(margin+(itemWidth+leftSpace)*i, topMargin, itemWidth, itemHeight)]; // giftView.titleLabel.text = [NSString stringWithFormat:@"%d",i]; // [self.allViewsArray replaceObjectAtIndex:i withObject:giftView]; // }else if (i > 2 && i < 5){ // /// 第二行两个 // if (i == 3) { // giftView = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(margin, topMargin+itemHeight+space, itemWidth, itemHeight)]; // giftView.titleLabel.text = [NSString stringWithFormat:@"%d",9]; // [self.allViewsArray replaceObjectAtIndex:9 withObject:giftView]; // }else{ // giftView = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(margin+(itemWidth+leftSpace)*2, topMargin+itemHeight+space, itemWidth, itemHeight)]; // [self.allViewsArray replaceObjectAtIndex:3 withObject:giftView]; // giftView.titleLabel.text = [NSString stringWithFormat:@"%d",3]; // } // }else if (i > 4 && i < 7){ // /// 第三行两个 // if (i == 5) { // giftView = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(margin, topMargin+(itemHeight+space)*2, itemWidth, itemHeight)]; // [self.allViewsArray replaceObjectAtIndex:8 withObject:giftView]; // giftView.titleLabel.text = [NSString stringWithFormat:@"%d",8]; // }else{ // giftView = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(margin+(itemWidth+leftSpace)*2, topMargin+(itemHeight+space)*2, itemWidth, itemHeight)]; // [self.allViewsArray replaceObjectAtIndex:4 withObject:giftView]; // giftView.titleLabel.text = [NSString stringWithFormat:@"%d",4]; // } // }else{ // giftView = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(margin+(itemWidth+leftSpace)*(i%3), topMargin+(itemHeight+space)*3, itemWidth, itemHeight)]; // [self.allViewsArray replaceObjectAtIndex:9-(i-4) withObject:giftView]; // giftView.titleLabel.text = [NSString stringWithFormat:@"%d",9-(i-4)]; // } // // [self.bgView addSubview:giftView]; // } QXAgePraizeSubView*giftView1 = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(margin, topMargin, itemWidth, itemHeight)]; [self.allViewsArray addObject:giftView1]; [self.bgView addSubview:giftView1]; QXAgePraizeSubView*giftView2 = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(giftView1.right+leftSpace, topMargin, itemWidth, itemHeight)]; [self.allViewsArray addObject:giftView2]; [self.bgView addSubview:giftView2]; QXAgePraizeSubView*giftView3 = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(giftView2.right+leftSpace, topMargin, itemWidth, itemHeight)]; [self.allViewsArray addObject:giftView3]; [self.bgView addSubview:giftView3]; QXAgePraizeSubView*giftView4 = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(giftView3.left, giftView3.bottom+space, itemWidth, itemHeight)]; [self.allViewsArray addObject:giftView4]; [self.bgView addSubview:giftView4]; QXAgePraizeSubView*giftView5 = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(giftView3.left, giftView4.bottom+space, itemWidth, itemHeight)]; [self.allViewsArray addObject:giftView5]; [self.bgView addSubview:giftView5]; QXAgePraizeSubView*giftView6 = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(giftView3.left, giftView5.bottom+space, itemWidth, itemHeight)]; [self.allViewsArray addObject:giftView6]; [self.bgView addSubview:giftView6]; QXAgePraizeSubView*giftView7 = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(giftView2.left, giftView6.top, itemWidth, itemHeight)]; [self.allViewsArray addObject:giftView7]; [self.bgView addSubview:giftView7]; QXAgePraizeSubView*giftView8 = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(giftView1.left, giftView6.top, itemWidth, itemHeight)]; [self.allViewsArray addObject:giftView8]; [self.bgView addSubview:giftView8]; QXAgePraizeSubView*giftView9 = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(giftView1.left, giftView5.top, itemWidth, itemHeight)]; [self.allViewsArray addObject:giftView9]; [self.bgView addSubview:giftView9]; QXAgePraizeSubView*giftView10 = [[QXAgePraizeSubView alloc] initWithFrame:CGRectMake(giftView1.left, giftView4.top, itemWidth, itemHeight)]; [self.allViewsArray addObject:giftView10]; [self.bgView addSubview:giftView10]; [self resetViews]; CGFloat btnWidth = ScaleWidth(109); CGFloat btnMargin = (SCREEN_WIDTH- ScaleWidth(109)*3)/4; QXAgeDrawBtn *oneBtn = [[QXAgeDrawBtn alloc] initWithFrame:CGRectMake(btnMargin, self.bgView.height-ScaleWidth(34)-20, btnWidth, ScaleWidth(34))]; oneBtn.btnType = QXAgeDrawBtnTypeOne; oneBtn.isDisable = YES; self.oneBtn = oneBtn; self.oneBtn.hidden = YES; [oneBtn addTarget:self action:@selector(startAction:) forControlEvents:(UIControlEventTouchUpInside)]; [self.bgView addSubview:oneBtn]; QXAgeDrawBtn *tenBtn = [[QXAgeDrawBtn alloc] initWithFrame:CGRectMake(self.oneBtn.right+btnMargin, self.oneBtn.top, btnWidth, ScaleWidth(34))]; tenBtn.btnType = QXAgeDrawBtnTypeTen; tenBtn.isDisable = YES; self.tenBtn = tenBtn; self.tenBtn.hidden = YES; [tenBtn addTarget:self action:@selector(startAction:) forControlEvents:(UIControlEventTouchUpInside)]; [self.bgView addSubview:tenBtn]; QXAgeDrawBtn *hundredBtn = [[QXAgeDrawBtn alloc] initWithFrame:CGRectMake(tenBtn.right+btnMargin, self.oneBtn.top, btnWidth, ScaleWidth(34))]; hundredBtn.btnType = QXAgeDrawBtnTypeHundred; hundredBtn.isDisable = YES; self.hundredBtn = hundredBtn; self.hundredBtn.hidden = YES; [hundredBtn addTarget:self action:@selector(startAction:) forControlEvents:(UIControlEventTouchUpInside)]; [self.bgView addSubview:hundredBtn]; self.soundBtn = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH/2-75-15, self.oneBtn.top-20-20, 75, 20)]; [self.soundBtn addTarget:self action:@selector(soundAction:) forControlEvents:(UIControlEventTouchUpInside)]; [self.soundBtn setTitle:@"音效" forState:(UIControlStateNormal)]; [self.soundBtn setTitleColor:RGB16(0xffffff) forState:(UIControlStateNormal)]; self.soundBtn.titleLabel.font = [UIFont systemFontOfSize:14]; [self.soundBtn setImage:[UIImage imageNamed:@"age_switch_off"] forState:(UIControlStateNormal)]; [self.soundBtn setImage:[UIImage imageNamed:@"age_switch_on"] forState:(UIControlStateSelected)]; self.soundBtn.selected = YES; [self.bgView addSubview:self.soundBtn]; self.specialBtn = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH/2+15, self.oneBtn.top-20-20, 75, 20)]; [self.specialBtn addTarget:self action:@selector(specialAction:) forControlEvents:(UIControlEventTouchUpInside)]; [self.specialBtn setTitle:@"特效" forState:(UIControlStateNormal)]; [self.specialBtn setTitleColor:RGB16(0xffffff) forState:(UIControlStateNormal)]; self.specialBtn.titleLabel.font = [UIFont systemFontOfSize:14]; [self.specialBtn setImage:[UIImage imageNamed:@"age_switch_off"] forState:(UIControlStateNormal)]; [self.specialBtn setImage:[UIImage imageNamed:@"age_switch_on"] forState:(UIControlStateSelected)]; self.specialBtn.selected = YES; [self.bgView addSubview:self.specialBtn]; [self.soundBtn qx_layoutButtonNOSizeToFitWithEdgeInsetsStyle:(QXButtonEdgeInsetsStyleRight) imageTitleSpace:2]; [self.specialBtn qx_layoutButtonNOSizeToFitWithEdgeInsetsStyle:(QXButtonEdgeInsetsStyleRight) imageTitleSpace:2]; self.isOpenSound = YES; self.isOpenSpecial = YES; self.coinView = [[UIView alloc] initWithFrame:CGRectMake((self.bgView.width-100)/2, topMargin+(itemHeight+space)*3-ScaleWidth(28)-6, 100,ScaleWidth(28))]; [self.coinView addRoundedCornersWithRadius:ScaleWidth(14)]; self.coinView.backgroundColor = RGB16A(0x926D37,0.5); [self.bgView addSubview:self.coinView]; self.coinBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, self.coinView.height)]; [self.coinBtn setTitleColor:RGB16(0xF8E837) forState:(UIControlStateNormal)]; [self.coinBtn setTitle:@"-" forState:(UIControlStateNormal)]; [self.coinBtn setImage:[UIImage imageNamed:@"age_item_coin"] forState:(UIControlStateNormal)]; self.coinBtn.titleLabel.font = [UIFont systemFontOfSize:10]; self.coinBtn.userInteractionEnabled = NO; [self.coinView addSubview:self.coinBtn]; self.exchangeBtn = [[UIButton alloc] initWithFrame:CGRectMake(self.coinView.width-50, 0, 50, self.coinView.height)]; [self.exchangeBtn setTitle:@"去兑换" forState:(UIControlStateNormal)]; [self.exchangeBtn setTitleColor:RGB16(0xF8E837) forState:(UIControlStateNormal)]; self.exchangeBtn.titleLabel.font = [UIFont systemFontOfSize:10]; [self.exchangeBtn addTarget:self action:@selector(exchangeAction) forControlEvents:(UIControlEventTouchUpInside)]; [self.coinView addSubview:self.exchangeBtn]; MJWeakSelf self.centerView = [[QXDrawGiftCenterView alloc] initWithFrame:CGRectMake((self.bgView.width-ScaleWidth(148))/2, topMargin+itemHeight, ScaleWidth(148), ScaleWidth(180))]; self.centerView.hidden = YES; self.centerView.startBlock = ^{ if (weakSelf.startBlock) { weakSelf.startBlock(); } }; self.centerView.type = QXDrawGiftCenterTypeWait; self.centerView.activityType = QXActivityTypeAge; [self.bgView addSubview:self.centerView]; } - (void)handlePanGesture:(UIPanGestureRecognizer *)gesture { static CGPoint originalCenter; if (gesture.state == UIGestureRecognizerStateBegan) { // 记录原始中心点 originalCenter = gesture.view.center; }else if (gesture.state == UIGestureRecognizerStateChanged) { // 获取拖拽位移 CGPoint translation = [gesture translationInView:self]; // 只允许向下拖拽 if (translation.y > 0) { gesture.view.center = CGPointMake(originalCenter.x, originalCenter.y + translation.y); // // 根据拖拽距离调整透明度 // CGFloat progress = translation.y / (self.view.bounds.size.height / 2); // gesture.view.alpha = 1.0 - MIN(progress, 0.8); } } else if (gesture.state == UIGestureRecognizerStateEnded || gesture.state == UIGestureRecognizerStateCancelled) { CGPoint translation = [gesture translationInView:self]; CGPoint velocity = [gesture velocityInView:self]; // 判断是否应该消失:拖拽超过一半高度或速度足够快 BOOL shouldDismiss = translation.y > self.bgView.height/2.0 || velocity.y > 1000; if (shouldDismiss) { [self hide]; } else { // 恢复原位置 [UIView animateWithDuration:0.3 animations:^{ self.bgView.y = SCREEN_HEIGHT-ScaleWidth(663); }]; } } } -(void)getMyWallet{ MJWeakSelf [[QXRequset shareInstance] getWithUrl:QXWallet parameters:@{@"token":[QXGlobal shareGlobal].loginModel.token?[QXGlobal shareGlobal].loginModel.token:@""} needCache:NO success:^(id responseObject) { double coin = [responseObject[@"data"][@"coin"] doubleValue]; NSString *coinStr = [NSString stringWithFormat:@"%.2f",coin]; [weakSelf.coinBtn setTitle:[NSString stringWithFormat:@" %@",coinStr] forState:(UIControlStateNormal)]; [weakSelf.coinBtn sizeToFit]; CGFloat allWidth = weakSelf.coinBtn.width + self.exchangeBtn.width+15; weakSelf.coinView.width = allWidth; weakSelf.coinView.x = (self.bgView.width-allWidth)/2; weakSelf.coinBtn.frame = CGRectMake(10, 0, weakSelf.coinBtn.width, weakSelf.coinView.height); weakSelf.exchangeBtn.frame = CGRectMake(allWidth-weakSelf.exchangeBtn.width, 0, weakSelf.exchangeBtn.width, weakSelf.coinView.height); weakSelf.coin = coin; [weakSelf configBtnStatus]; } fail:^(NSError *error, NSString *msg, NSURLSessionDataTask *task) { }]; } -(void)setGiftModel:(QXGiftModel *)giftModel{ _giftModel = giftModel; [self getGiftList]; [self getMyWallet]; } -(void)updateProgress:(QXXLHModel*)model{ if (self.model) { self.model.xlh_data = model; self.centerView.model = self.model; } } -(void)getGiftList{ if (![self.giftModel.gift_bag isExist]) { return; } if (![self.roomId isExist]) { return; } // if (self.model) { // return; // } MJWeakSelf [[QXRequset shareInstance] postWithUrl:[NSString stringWithFormat:@"%@%@",ServerUrl,@"api/BlindBoxTurntable/get_gift_list"] parameters:@{@"gift_bag_id":self.giftModel.gift_bag?self.giftModel.gift_bag:@"",@"room_id":self.roomId?self.roomId:@""} needCache:NO success:^(id responseObject) { QXGiftActivityModel *model = [QXGiftActivityModel yy_modelWithJSON:responseObject[@"data"]]; weakSelf.model = model; weakSelf.centerView.model = model; for (int i = 0; i < model.gift_list.count; i++) { QXAgePraizeSubView* subview = weakSelf.allViewsArray[i]; subview.giftModel = model.gift_list[i]; } [weakSelf.oneBtn.giftCoin setTitle:[NSString stringWithFormat:@"%@币一次",model.box_price] forState:(UIControlStateNormal)]; [weakSelf.tenBtn.giftCoin setTitle:[NSString stringWithFormat:@"%ld币一次",model.box_price.integerValue*6] forState:(UIControlStateNormal)]; [weakSelf.hundredBtn.giftCoin setTitle:[NSString stringWithFormat:@"%ld币一次",model.box_price.integerValue*9] forState:(UIControlStateNormal)]; weakSelf.oneBtn.hidden = NO; weakSelf.tenBtn.hidden = NO; weakSelf.hundredBtn.hidden = NO; [weakSelf configBtnStatus]; } fail:^(NSError *error, NSString *msg, NSURLSessionDataTask *task) { }]; } -(void)configBtnStatus{ if (self.coin > 0 && self.model.box_price.integerValue > 0) { if (self.coin>=self.model.box_price.integerValue) { self.oneBtn.isDisable = NO; }else{ self.oneBtn.isDisable = YES; } if (self.coin>=(self.model.box_price.integerValue*6)) { self.tenBtn.isDisable = NO; }else{ self.tenBtn.isDisable = YES; } if (self.coin>=(self.model.box_price.integerValue*9)) { self.hundredBtn.isDisable = NO; }else{ self.hundredBtn.isDisable = YES; } }else{ self.oneBtn.isDisable = YES; self.tenBtn.isDisable = YES; self.hundredBtn.isDisable = YES; } } -(void)setHeartId:(NSString *)heartId{ _heartId = heartId; } -(void)drawGiftWithNum:(NSString*)num{ NSDictionary *parameters = @{ @"gift_bag_id":self.giftModel.gift_bag, @"gift_user_ids":self.userIds, @"room_id":self.roomId, @"num":num, @"heart_id":[self.heartId isExist]?self.heartId:@"" }; self.isDrawing = YES; MJWeakSelf [[QXRequset shareInstance] postWithUrl:[NSString stringWithFormat:@"%@%@",ServerUrl,@"api/BlindBoxTurntable/draw_gift"] parameters:parameters needCache:NO success:^(id responseObject) { QXDrawGiftResultModel *model = [QXDrawGiftResultModel yy_modelWithJSON:responseObject[@"data"]]; weakSelf.drawResultModel = model; [weakSelf.targetArrayIndex removeAllObjects]; [weakSelf getMyWallet]; for (int i = 0; i < model.reslut_list.count; i++) { QXDrawGiftModel *md = model.reslut_list[i]; for (int j = 0; j < weakSelf.model.gift_list.count; j++) { QXDrawGiftModel*gift = weakSelf.model.gift_list[j]; if ([md.gift_id isEqualToString:gift.gift_id]) { [weakSelf.targetArrayIndex addObject:[NSNumber numberWithInt:j]]; if (j < 12) { QXAgePraizeSubView *subView = weakSelf.allViewsArray[j]; subView.count = md.count; if (!weakSelf.isOpenSpecial) { subView.resultView.hidden = NO; subView.isSelected = YES; weakSelf.isDrawing = NO; } } } } } if (weakSelf.isOpenSound) { [weakSelf.player seekToTime:CMTimeMake(0, 1)]; [weakSelf.player play]; } if (weakSelf.isOpenSpecial) { [weakSelf startFastAnimate]; }else{ [weakSelf animateFinishedSendGift]; } } fail:^(NSError *error, NSString *msg, NSURLSessionDataTask *task) { weakSelf.isDrawing = NO; showToast(msg); }]; } -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ return touch.view == self; } -(void)specialAction:(UIButton*)sender{ sender.selected = !sender.selected; self.isOpenSpecial = sender.selected; if (self.isOpenSpecial) { NSString *path = [[NSBundle mainBundle] pathForResource:@"draw_music" ofType:@"mp3"]; _player = [[AVPlayer alloc] initWithURL:[NSURL fileURLWithPath:path]]; }else{ NSString *path = [[NSBundle mainBundle] pathForResource:@"no_animate_draw_music" ofType:@"mp3"]; _player = [[AVPlayer alloc] initWithURL:[NSURL fileURLWithPath:path]]; } } -(void)soundAction:(UIButton*)sender{ sender.selected = !sender.selected; self.isOpenSound = sender.selected; if (self.isOpenSpecial) { NSString *path = [[NSBundle mainBundle] pathForResource:@"draw_music" ofType:@"mp3"]; _player = [[AVPlayer alloc] initWithURL:[NSURL fileURLWithPath:path]]; }else{ NSString *path = [[NSBundle mainBundle] pathForResource:@"no_animate_draw_music" ofType:@"mp3"]; _player = [[AVPlayer alloc] initWithURL:[NSURL fileURLWithPath:path]]; } } -(void)startAction:(QXAgeDrawBtn*)sender{ if (sender.isDisable) { showToast(@"金币不足"); return; } if (self.isDrawing) { // showToast(@"正在抽奖中"); return; } [self resetViews]; [self drawGiftWithNum:[NSString stringWithFormat:@"%ld",sender.btnType]]; /// 获取目标礼物 // [self getTargetGift]; // [self startFastAnimate]; } -(void)exchangeAction{ QXDiamondViewController *vc = [[QXDiamondViewController alloc] init]; [self.viewController.navigationController pushViewController:vc animated:YES]; } -(void)resetViews{ self.isDrawing = NO; self.targetIndex = -1; self.currentIndex = -1; self.roundCount = 0; self.delayTime = 0.2; [self.targetArrayIndex removeAllObjects]; [self.finishTargetArrayIndex removeAllObjects]; if (self.currentGiftView != nil) { self.currentGiftView.isSelected = NO; [self.currentGiftView stopPulseAnimationWithLayer]; } for (QXAgePraizeSubView *giftView in self.allViewsArray) { giftView.isSelected = NO; giftView.count = @"0"; giftView.resultView.hidden = YES; [giftView stopPulseAnimationWithLayer]; } } -(void)startFastAnimate{ self.currentGiftView = self.allViewsArray.firstObject; self.currentGiftView.isSelected = YES; [self stopFastAnimate]; if (_fastTimer == nil) { _fastTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)); } // dispatch_source_set_timer(_fastTimer, // dispatch_time(DISPATCH_TIME_NOW, 0), // NSEC_PER_SEC * 0.06, // 间隔0.1秒 // NSEC_PER_SEC * 0.01); // 允许误差0.01秒 dispatch_source_set_timer(_fastTimer, dispatch_time(DISPATCH_TIME_NOW, 0.2 * NSEC_PER_SEC), DISPATCH_TIME_FOREVER, // 使用一次性模式 0.01 * NSEC_PER_SEC); if (self.isOpenSound) { [self.player seekToTime:CMTimeMake(0, 1)]; [self.player play]; } __weak typeof(self) weakSelf = self; dispatch_source_set_event_handler(_fastTimer, ^{ __strong typeof(weakSelf) strongSelf = weakSelf; if (!strongSelf) return; // 如果需要更新UI,切换到主线程 dispatch_async(dispatch_get_main_queue(), ^{ strongSelf.roundCount++; if ((strongSelf.roundCount / giftMaxCount == minRoundCount) && strongSelf.startType != QXAgeDrawBtnTypeOne) { BOOL has = NO; for (NSNumber *index in strongSelf.finishTargetArrayIndex) { if (index.integerValue == strongSelf.currentIndex) { has = YES; break; } } self.currentGiftView.isSelected = NO; if (has) { QXAgePraizeSubView *giftView = strongSelf.allViewsArray[strongSelf.currentIndex]; giftView.isSelected = YES; }else{ QXAgePraizeSubView *giftView = strongSelf.allViewsArray[strongSelf.currentIndex]; giftView.isSelected = NO; } }else{ /// 把上一个选中状态置为未选中 strongSelf.currentGiftView.isSelected = NO; } /// 计算当前下标 strongSelf.currentIndex = strongSelf.roundCount%giftMaxCount; /// 获取当前选中的view 并设置为选中状态 QXAgePraizeSubView *giftView = strongSelf.allViewsArray[strongSelf.currentIndex]; giftView.isSelected = YES; /// 重新赋值给选中view strongSelf.currentGiftView = giftView; if (strongSelf.roundCount / giftMaxCount == minRoundCount) { for (NSNumber *index in strongSelf.targetArrayIndex) { if (strongSelf.currentIndex == index.integerValue) { QXAgePraizeSubView *giftView = strongSelf.allViewsArray[index.integerValue]; giftView.isSelected = YES; giftView.resultView.hidden = NO; [giftView startPulseAnimationWithLayer]; [strongSelf.targetArrayIndex removeObject:index]; [strongSelf.finishTargetArrayIndex addObject:index]; break; } } dispatch_source_set_timer(strongSelf.fastTimer, dispatch_time(DISPATCH_TIME_NOW, 0.03 * NSEC_PER_SEC), DISPATCH_TIME_FOREVER, 0.01 * NSEC_PER_SEC); if (strongSelf.targetArrayIndex.count == 0) { strongSelf.isDrawing = NO; [strongSelf stopFastAnimate]; [strongSelf animateFinishedSendGift]; } // } }else{ strongSelf.delayTime = strongSelf.delayTime-0.02; if (strongSelf.delayTime <= 0.03) { strongSelf.delayTime = 0.03; } dispatch_source_set_timer(strongSelf.fastTimer, dispatch_time(DISPATCH_TIME_NOW, strongSelf.delayTime * NSEC_PER_SEC), DISPATCH_TIME_FOREVER, 0.01 * NSEC_PER_SEC); } }); }); dispatch_resume(_fastTimer); } -(void)animateFinishedSendGift{ NSDictionary *parameters = @{ @"send_id":self.drawResultModel.blind_box_turntable_id?self.drawResultModel.blind_box_turntable_id:@"" }; [[QXRequset shareInstance] postWithUrl:[NSString stringWithFormat:@"%@%@",ServerUrl,@"api/BlindBoxTurntable/gift_send"] parameters:parameters needCache:NO success:^(id responseObject) { } fail:^(NSError *error, NSString *msg, NSURLSessionDataTask *task) { showToast(msg); }]; } -(void)stopFastAnimate{ if (_fastTimer != nil) { dispatch_source_cancel(_fastTimer); _fastTimer = nil; } } - (void)pauseGCDTimer { if (_fastTimer) { dispatch_suspend(_fastTimer); NSLog(@"GCD定时器已暂停"); } } - (void)resumeGCDTimer { if (_fastTimer) { dispatch_resume(_fastTimer); NSLog(@"GCD定时器已恢复"); } } -(void)ruleAction{ self.ruleView.rule = self.model.rule_url; [self.ruleView showInView:self]; } -(void)poolAction{ self.poolView.roomId = self.roomId; self.poolView.giftModel = self.giftModel; [self.poolView showInView:self]; } -(void)recordAction{ self.recordView.roomId = self.roomId; self.recordView.giftModel = self.giftModel; [self.recordView showInView:self]; } -(NSMutableArray *)allViewsArray{ if (!_allViewsArray) { _allViewsArray = [NSMutableArray array]; } return _allViewsArray; } -(NSMutableArray *)targetArrayIndex{ if (!_targetArrayIndex) { _targetArrayIndex = [NSMutableArray array]; } return _targetArrayIndex; } -(AVPlayer *)player{ if (!_player) { NSString *path = [[NSBundle mainBundle] pathForResource:@"draw_music" ofType:@"mp3"]; _player = [[AVPlayer alloc] initWithURL:[NSURL fileURLWithPath:path]]; } return _player; } -(NSMutableArray *)finishTargetArrayIndex{ if (!_finishTargetArrayIndex) { _finishTargetArrayIndex = [NSMutableArray array]; } return _finishTargetArrayIndex; } -(QXAgePraizeRuleView *)ruleView{ if (!_ruleView) { _ruleView = [[QXAgePraizeRuleView alloc] init]; } return _ruleView; } -(QXAgePraizePoolView *)poolView{ if (!_poolView) { _poolView = [[QXAgePraizePoolView alloc] init]; } return _poolView; } -(QXAgePraizeRecordView *)recordView{ if (!_recordView) { _recordView = [[QXAgePraizeRecordView alloc] init]; } return _recordView; } -(void)showInView:(UIView *)view{ [self getGiftList]; [self resetViews]; self.bgView.y = SCREEN_HEIGHT; [view addSubview:self]; [UIView animateWithDuration:0.3 animations:^{ self.bgView.y = SCREEN_HEIGHT-ScaleWidth(663); }]; } -(void)hide{ [self stopFastAnimate]; // [self stopSlowAnimate]; [UIView animateWithDuration:0.3 animations:^{ self.bgView.y = SCREEN_HEIGHT; } completion:^(BOOL finished) { [self removeFromSuperview]; }]; } -(void)destroyViews{ [[NSNotificationCenter defaultCenter] removeObserver:self]; } @end @implementation QXAgePraizeSubView - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self initSubviews]; } return self; } -(void)initSubviews{ self.bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"age_item_nor"]]; [self addSubview:self.bgImageView]; [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self); }]; self.giftImageView = [[UIImageView alloc] init]; [self addSubview:self.giftImageView]; [self.giftImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(7); make.width.height.mas_equalTo(ScaleWidth(50)); make.centerX.equalTo(self); }]; self.titleLabel = [[UILabel alloc] init]; self.titleLabel.font = [UIFont boldSystemFontOfSize:12]; self.titleLabel.textColor = RGB16(0xffffff); self.titleLabel.textAlignment = NSTextAlignmentCenter; [self addSubview:self.titleLabel]; [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.giftImageView.mas_bottom).offset(4); make.height.mas_equalTo(ScaleWidth(14)); make.centerX.equalTo(self); }]; self.giftCoin = [[UIButton alloc] init]; self.giftCoin.userInteractionEnabled = NO; [self.giftCoin setTitleColor:RGB16(0xC7BF62) forState:(UIControlStateNormal)]; [self.giftCoin setImage:[UIImage imageNamed:@"age_item_coin"] forState:(UIControlStateNormal)]; self.giftCoin.titleLabel.font = [UIFont systemFontOfSize:10]; [self addSubview:self.giftCoin]; [self.giftCoin mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self); make.top.equalTo(self.titleLabel.mas_bottom); }]; self.resultView = [[UIView alloc] init]; self.resultView.hidden = YES;; [self addSubview:self.resultView]; [self.resultView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.top.equalTo(self); make.height.mas_equalTo(54); }]; self.resultBgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"age_item_top_bg"]]; [self.resultView addSubview:self.resultBgImageView]; [self.resultBgImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.resultView); }]; self.countLabel = [[UILabel alloc] init]; self.countLabel.font = [UIFont fontWithName:@"YouSheBiaoTiHei" size:18]; self.countLabel.textColor = RGB16(0xE3732D); self.countLabel.textAlignment = NSTextAlignmentCenter; [self.resultView addSubview:self.countLabel]; [self.countLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(12); make.height.mas_equalTo(ScaleWidth(20)); make.centerX.equalTo(self.resultView); }]; } -(void)setCount:(NSString *)count{ _count = count; if (count.integerValue > 0) { // self.resultView.hidden = YES; // }else{ // self.resultView.hidden = NO; self.countLabel.text = [NSString stringWithFormat:@"X%@",count]; } } -(void)setGiftModel:(QXDrawGiftModel *)giftModel{ _giftModel = giftModel; self.titleLabel.text = giftModel.gift_name; [self.giftCoin setTitle:giftModel.gift_price forState:(UIControlStateNormal)]; NSString *encodedQuery = [giftModel.base_image stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSURL *imageUrl = [NSURL URLWithString:encodedQuery]; [self.giftImageView sd_setImageWithURL:imageUrl]; } -(void)setIsSelected:(BOOL)isSelected{ _isSelected = isSelected; self.bgImageView.image = [UIImage imageNamed:isSelected?@"age_item_sel":@"age_item_nor"]; } - (void)startPulseAnimationWithLayer { CABasicAnimation *pulseAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; pulseAnimation.duration = 0.5; pulseAnimation.fromValue = @0.9; pulseAnimation.toValue = @1.1; pulseAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; pulseAnimation.autoreverses = YES; pulseAnimation.repeatCount = HUGE_VALF; // 无限循环 [self.layer addAnimation:pulseAnimation forKey:@"pulse"]; } // 停止动画 - (void)stopPulseAnimationWithLayer { [self.layer removeAnimationForKey:@"pulse"]; } @end @implementation QXAgeDrawBtn - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self initSubviews]; } return self; } -(void)initSubviews{ self.bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"age_touch_bg"]]; self.bgImageView.frame = self.bounds; [self addSubview:self.bgImageView]; self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.width, 16)]; self.titleLabel.font = [UIFont systemFontOfSize:12]; self.titleLabel.textAlignment = NSTextAlignmentCenter; self.titleLabel.textColor = RGB16(0xA18710); [self addSubview:self.titleLabel]; self.giftCoin = [[UIButton alloc] initWithFrame:CGRectMake(0, self.titleLabel.bottom, self.width, 16)]; [self.giftCoin setTitleColor:RGB16(0xA18710) forState:(UIControlStateNormal)]; [self.giftCoin setImage:[UIImage imageNamed:@"age_item_coin"] forState:(UIControlStateNormal)]; self.giftCoin.titleLabel.font = [UIFont systemFontOfSize:10]; self.giftCoin.userInteractionEnabled = NO; [self addSubview:self.giftCoin]; } -(void)setIsDisable:(BOOL)isDisable{ _isDisable = isDisable; self.bgImageView.image = [UIImage imageNamed:isDisable?@"age_touch_dis_bg":@"age_touch_bg"]; } -(void)setBtnType:(QXAgeDrawBtnType)btnType{ // /// 抽一次 // QXAgeDrawBtnTypeOne = 0, // /// 抽10次 // QXAgeDrawBtnTypeTen , // /// 抽100次 // QXAgeDrawBtnTypeHundred , _btnType = btnType; switch (btnType) { case QXAgeDrawBtnTypeOne: { self.titleLabel.text = @"抽一次"; [self.giftCoin setTitle:@"10币一次" forState:(UIControlStateNormal)]; } break; case QXAgeDrawBtnTypeTen: { self.titleLabel.text = @"抽六次"; [self.giftCoin setTitle:@"100币一次" forState:(UIControlStateNormal)]; } break; case QXAgeDrawBtnTypeHundred: { self.titleLabel.text = @"抽九次"; [self.giftCoin setTitle:@"1000币一次" forState:(UIControlStateNormal)]; } break; default: break; } } @end