iOS實(shí)現(xiàn)新年抽獎(jiǎng)轉(zhuǎn)盤(pán)效果的思路
臨近春節(jié),相信不少app都會(huì)加一個(gè)新的需求——新年抽獎(jiǎng)
不多廢話,先上GIF效果圖
DEMO鏈接
1. 跑馬燈效果
2. 抽獎(jiǎng)效果
實(shí)現(xiàn)步驟:
一、跑馬燈效果
其實(shí)很簡(jiǎn)單,就是通過(guò)以下兩張圖片,用NSTimer無(wú)限替換,達(dá)到跑馬燈的效果
實(shí)現(xiàn)代碼:
_rotaryTable = [[UIImageView alloc] initWithFrame:CGRectMake((kScreenWidth-366*XT)/2, 218*XT, 366*XT, 318*XT)]; _rotaryTable.tag = 100; [_rotaryTable setImage:[UIImage imageNamed:@"bg_lamp_1"]]; [scrollView addSubview:_rotaryTable]; _itemBordeTImer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(itemBordeTImerEvent) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:_itemBordeTImer forMode:NSRunLoopCommonModes];
- (void)itemBordeTImerEvent { if (_rotaryTable.tag == 100) { _rotaryTable.tag = 101; [_rotaryTable setImage:[UIImage imageNamed:@"bg_lamp_2"]]; }else if (_rotaryTable.tag == 101){ _rotaryTable.tag = 100; [_rotaryTable setImage:[UIImage imageNamed:@"bg_lamp_1"]]; } }
二、抽獎(jiǎng)效果
1.初始化獎(jiǎng)品數(shù)組,以及按照 從上到下,從左到右 的順序布局UI界面
_itemTitleArray = @[@"3跳幣",@"嘉年華門(mén)票",@"8跳幣",@"10朵花",@"128朵花",@"2018跳幣",@"528跳幣",@"128跳幣",@"28朵花",@"88跳幣"]; for (int i = 0 ; i < 4; i ++) { UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(i*82*XT, 0, 78*XT, 80*XT)]; [img setImage:[UIImage imageNamed:itemImgArray[i]]]; [itemView addSubview:img]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 63*XT, 78*XT, 13*XT)]; label.textAlignment = NSTextAlignmentCenter; label.textColor = [UIColor whiteColor]; label.font = [UIFont systemFontOfSize:13*XT]; label.text = _itemTitleArray[I]; [img addSubview:label]; } for (int i = 0 ; i < 2; i ++) { UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(i*(78*XT+169*XT), 84*XT, 78*XT, 80*XT)]; [img setImage:[UIImage imageNamed:itemImgArray[i+4]]]; [itemView addSubview:img]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 63*XT, 78*XT, 13*XT)]; label.textAlignment = NSTextAlignmentCenter; label.textColor = [UIColor whiteColor]; label.font = [UIFont systemFontOfSize:13*XT]; label.text = _itemTitleArray[i+4]; [img addSubview:label]; } for (int i = 0 ; i < 4; i ++) { UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(i*82*XT, 168*XT, 78*XT, 80*XT)]; [img setImage:[UIImage imageNamed:itemImgArray[i+6]]]; [itemView addSubview:img]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 63*XT, 78*XT, 13*XT)]; label.textAlignment = NSTextAlignmentCenter; label.textColor = [UIColor whiteColor]; label.font = [UIFont systemFontOfSize:13*XT]; label.text = _itemTitleArray[i+6]; [img addSubview:label]; }
2.點(diǎn)擊之后開(kāi)始抽獎(jiǎng)按鈕后,先快速地將選中框 正時(shí)針 轉(zhuǎn)三圈,再慢速地在 一圈之內(nèi) 旋轉(zhuǎn)至中獎(jiǎng)位置,請(qǐng) 注意 是按照 正時(shí)針 的順序旋轉(zhuǎn),和UI布局的順序不一致,如圖所示:
- (void)getLotteryInfo { // 快速旋轉(zhuǎn)計(jì)數(shù),在NSTimer的方法下自增到29時(shí)結(jié)束,代表選中框快速旋轉(zhuǎn)了三圈,結(jié)束快速旋轉(zhuǎn) _fastIndex = 0; // 慢速旋轉(zhuǎn)計(jì)數(shù),在NSTimer的方法下自增到下面 _selectedIndex 的數(shù)字時(shí),選中框到達(dá)中獎(jiǎng)位置,結(jié)束慢速旋轉(zhuǎn) _slowIndex = -1; // 中獎(jiǎng)位置計(jì)數(shù),按照順時(shí)針的順序,如上圖所示,若 _selectedIndex = 9 則獲得 9 所在位置的獎(jiǎng)品 _selectedIndex = arc4random()%10; // 根據(jù)獎(jiǎng)品數(shù)組,獲取中獎(jiǎng)信息 if (_selectedIndex<4) { _result = _itemTitleArray[_selectedIndex]; }else if (_selectedIndex == 4){ _result = @"2018跳幣"; }else if (_selectedIndex == 5){ _result = @"88跳幣"; }else if (_selectedIndex == 6){ _result = @"28朵花"; }else if (_selectedIndex == 7){ _result = @"128跳幣"; }else if (_selectedIndex == 8){ _result = @"528跳幣"; }else if (_selectedIndex == 9){ _result = @"128朵花"; } _itemBorderView.hidden = NO; // 開(kāi)啟快速旋轉(zhuǎn),時(shí)間間隔為0.1秒 _fastTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(fastTimerEvent) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:_fastTimer forMode:NSRunLoopCommonModes]; }
3.NSTimer 快速旋轉(zhuǎn)事件
- (void)fastTimerEvent { // _fastIndex 自增 _fastIndex = _fastIndex + 1; // 順時(shí)針移動(dòng)選中框的位置 if (_fastIndex % 10 == 0) { [_itemBorderView setFrame:CGRectMake(-1*XT, -1*XT, 80*XT, 82*XT)]; }else if (_fastIndex % 10 == 1){ [_itemBorderView setFrame:CGRectMake(82*XT-1*XT, -1*XT, 80*XT, 82*XT)]; }else if (_fastIndex % 10 == 2){ [_itemBorderView setFrame:CGRectMake(2*82*XT-1*XT, -1*XT, 80*XT, 82*XT)]; }else if (_fastIndex % 10 == 3){ [_itemBorderView setFrame:CGRectMake(3*82*XT-1*XT, -1*XT, 80*XT, 82*XT)]; }else if (_fastIndex % 10 == 4){ [_itemBorderView setFrame:CGRectMake(3*82*XT-1*XT, 84*XT-1*XT, 80*XT, 82*XT)]; }else if (_fastIndex % 10 == 5){ [_itemBorderView setFrame:CGRectMake(3*82*XT-1*XT, 2*84*XT-1*XT, 80*XT, 82*XT)]; }else if (_fastIndex % 10 == 6){ [_itemBorderView setFrame:CGRectMake(2*82*XT-1*XT, 2*84*XT-1*XT, 80*XT, 82*XT)]; }else if (_fastIndex % 10 == 7){ [_itemBorderView setFrame:CGRectMake(82*XT-1*XT, 2*84*XT-1*XT, 80*XT, 82*XT)]; }else if (_fastIndex % 10 == 8){ [_itemBorderView setFrame:CGRectMake(-1*XT, 2*84*XT-1*XT, 80*XT, 82*XT)]; }else if (_fastIndex % 10 == 9){ [_itemBorderView setFrame:CGRectMake(-1*XT, 84*XT-1*XT, 80*XT, 82*XT)]; } // _fastIndex = 29 時(shí)選中框結(jié)束快速旋轉(zhuǎn),開(kāi)啟慢速旋轉(zhuǎn),時(shí)間間隔為0.45秒 if (_fastIndex >= 29) { [_fastTimer invalidate]; _slowTimer = [NSTimer scheduledTimerWithTimeInterval:0.45 target:self selector:@selector(slowTimerEvent) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:_slowTimer forMode:NSRunLoopCommonModes]; } }
4.NSTimer 慢速旋轉(zhuǎn)事件
// 慢速移動(dòng)動(dòng)畫(huà) - (void)slowTimerEvent { // _slowIndex 自增 _slowIndex = _slowIndex + 1; // 順時(shí)針移動(dòng)轉(zhuǎn)中框的位置 if (_slowIndex % 10 == 0) { [_itemBorderView setFrame:CGRectMake(-1*XT, -1*XT, 80*XT, 82*XT)]; }else if (_slowIndex % 10 == 1){ [_itemBorderView setFrame:CGRectMake(82*XT-1*XT, -1*XT, 80*XT, 82*XT)]; }else if (_slowIndex % 10 == 2){ [_itemBorderView setFrame:CGRectMake(2*82*XT-1*XT, -1*XT, 80*XT, 82*XT)]; }else if (_slowIndex % 10 == 3){ [_itemBorderView setFrame:CGRectMake(3*82*XT-1*XT, -1*XT, 80*XT, 82*XT)]; }else if (_slowIndex % 10 == 4){ [_itemBorderView setFrame:CGRectMake(3*82*XT-1*XT, 84*XT-1*XT, 80*XT, 82*XT)]; }else if (_slowIndex % 10 == 5){ [_itemBorderView setFrame:CGRectMake(3*82*XT-1*XT, 2*84*XT-1*XT, 80*XT, 82*XT)]; }else if (_slowIndex % 10 == 6){ [_itemBorderView setFrame:CGRectMake(2*82*XT-1*XT, 2*84*XT-1*XT, 80*XT, 82*XT)]; }else if (_slowIndex % 10 == 7){ [_itemBorderView setFrame:CGRectMake(82*XT-1*XT, 2*84*XT-1*XT, 80*XT, 82*XT)]; }else if (_slowIndex % 10 == 8){ [_itemBorderView setFrame:CGRectMake(-1*XT, 2*84*XT-1*XT, 80*XT, 82*XT)]; }else if (_slowIndex % 10 == 9){ [_itemBorderView setFrame:CGRectMake(-1*XT, 84*XT-1*XT, 80*XT, 82*XT)]; } // 當(dāng) _slowIndex >= _selectedIndex 時(shí)選中框結(jié)束慢速旋轉(zhuǎn),開(kāi)啟中獎(jiǎng)獎(jiǎng)品界面 if (_slowIndex >= _selectedIndex) { [_slowTimer invalidate]; dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5/*延遲執(zhí)行時(shí)間*/ * NSEC_PER_SEC)); dispatch_after(delayTime, dispatch_get_main_queue(), ^{ self.startButton.userInteractionEnabled = YES; [self showLotteryRlesultView]; }); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
iOS自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能詳解
關(guān)于左滑刪除這塊,相信不少朋友都遇到過(guò)。下面這篇文章主要給大家介紹了關(guān)于iOS如何自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09iOS App開(kāi)發(fā)中使用設(shè)計(jì)模式中的單例模式的實(shí)例解析
單例模式是最簡(jiǎn)單和基本的一種設(shè)計(jì)模式,下面我們就簡(jiǎn)單解讀一下iOS中單例設(shè)計(jì)模式的用法,示例代碼還是為傳統(tǒng)的Objective-C,主要為了體現(xiàn)單例模式的思想,需要的朋友可以參考下2016-05-05iOS開(kāi)發(fā)驗(yàn)證判斷語(yǔ)句之正則表達(dá)式小結(jié)
最近在公司接手重構(gòu)一個(gè)項(xiàng)目,發(fā)現(xiàn)之前的開(kāi)發(fā)在驗(yàn)證格式這塊寫(xiě)的太亂了,到處都有相關(guān)的驗(yàn)證代碼,所以就有了這篇文章,供自己收藏也分享給有需要的朋友們參考借鑒,下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2016-12-12ios使用NSProxy實(shí)現(xiàn)消息轉(zhuǎn)發(fā)
本文主要介紹了ios使用NSProxy實(shí)現(xiàn)消息轉(zhuǎn)發(fā),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07iOS App中UILabel的自定義及在Auto Layout中的使用
這篇文章主要介紹了iOS App中UILabel的自定義及在Auto Layout中的使用,示例代碼為傳統(tǒng)的Objective-C語(yǔ)言,需要的朋友可以參考下2016-03-03安裝win10+黑蘋(píng)果雙系統(tǒng)零基礎(chǔ)教程(圖文)
這篇文章主要介紹了安裝win10+黑蘋(píng)果雙系統(tǒng)零基礎(chǔ)教程(圖文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-01-01