iOS实现新年抽奖转盘效果的思路

临近春节,相信不少app都会加一个新的需求——新年抽奖

不多废话,先上GIF效果图

DEMO链接

1. 跑马灯效果

2. 抽奖效果

实现步骤:

一、跑马灯效果

其实很简单,就是通过以下两张图片,用NSTimer无限替换,达到跑马灯的效果

实现代码:

_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"]];
 }
}

二、抽奖效果

1.初始化奖品数组,以及按照 从上到下,从左到右 的顺序布局UI界面

_itemTitleArray = @[@"3跳币",@"嘉年华门票",@"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.点击之后开始抽奖按钮后,先快速地将选中框 正时针 转三圈,再慢速地在 一圈之内 旋转至中奖位置,请 注意 是按照 正时针 的顺序旋转,和UI布局的顺序不一致,如图所示:

- (void)getLotteryInfo
{
 // 快速旋转计数,在NSTimer的方法下自增到29时结束,代表选中框快速旋转了三圈,结束快速旋转
 _fastIndex = 0;

 // 慢速旋转计数,在NSTimer的方法下自增到下面 _selectedIndex 的数字时,选中框到达中奖位置,结束慢速旋转
 _slowIndex = -1;

 // 中奖位置计数,按照顺时针的顺序,如上图所示,若 _selectedIndex = 9 则获得 9 所在位置的奖品
 _selectedIndex = arc4random()%10;

 // 根据奖品数组,获取中奖信息
 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;

 // 开启快速旋转,时间间隔为0.1秒
 _fastTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(fastTimerEvent) userInfo:nil repeats:YES];
 [[NSRunLoop currentRunLoop] addTimer:_fastTimer forMode:NSRunLoopCommonModes];
}

3.NSTimer 快速旋转事件

- (void)fastTimerEvent
{
 // _fastIndex 自增
 _fastIndex = _fastIndex + 1;

 // 顺时针移动选中框的位置
 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 时选中框结束快速旋转,开启慢速旋转,时间间隔为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 慢速旋转事件

// 慢速移动动画
- (void)slowTimerEvent
{
 // _slowIndex 自增
 _slowIndex = _slowIndex + 1;

 // 顺时针移动转中框的位置
 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)];
 }

 // 当 _slowIndex >= _selectedIndex 时选中框结束慢速旋转,开启中奖奖品界面
 if (_slowIndex >= _selectedIndex) {
 [_slowTimer invalidate];

 dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5/*延迟执行时间*/ * NSEC_PER_SEC));
 dispatch_after(delayTime, dispatch_get_main_queue(), ^{
  self.startButton.userInteractionEnabled = YES;
  [self showLotteryRlesultView];
 });
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS

    绝对值得看的来篇,哈哈.本人亲自完成,有错误请大家指出: 现在的手机完美支持html5,所以如果手机端想要做个抽奖模块的话,用刮刮卡抽奖效果,相信这个互动体验是非常棒的 ​ps:由于本人没有wp8系统的手机,所以没法兼容wp8系统的,目前完美兼容android,IOS 如果要在pc浏览的话,得改下js,目前支持谷歌,火狐,ie>=10,如果网友想要的话我就去写个 代码如下: 复制代码 代码如下: <!DOCTYPE html> <html lang="en"&g

  • iOS实现新年抽奖转盘效果的思路

    临近春节,相信不少app都会加一个新的需求--新年抽奖 不多废话,先上GIF效果图 DEMO链接 1. 跑马灯效果 2. 抽奖效果 实现步骤: 一.跑马灯效果 其实很简单,就是通过以下两张图片,用NSTimer无限替换,达到跑马灯的效果 实现代码: _rotaryTable = [[UIImageView alloc] initWithFrame:CGRectMake((kScreenWidth-366*XT)/2, 218*XT, 366*XT, 318*XT)]; _rotaryTable.

  • JS实现简单的抽奖转盘效果示例

    本文实例讲述了JS实现简单的抽奖转盘效果.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>www.jb51.net JS抽奖转盘</title> <style> *{ margin:0; padding:0; list-style: none; } .big{

  • Vue.js实现大转盘抽奖总结及实现思路

    大家好!先上图看看本次案例的整体效果. 实现思路: Vue component实现大转盘组件,可以嵌套到任意要使用的页面. css3 transform控制大转盘抽奖过程的动画效果. 抽奖组件内使用钩子函数watch监听抽奖结果的返回情况播放大转盘动画并给用户弹出中奖提示. 中奖结果弹窗,为抽奖组件服务. 实现步骤如下: 构建api奖品配置信息和抽奖接口,vuex全局存放奖品配置和中奖结果数据信息. api: export default { getPrizeList () { let priz

  • iOS实现转盘效果

    本文实例为大家分享了iOS实现转盘效果的具体代码,供大家参考,具体内容如下 Demo下载地址: iOS转盘效果 功能:实现了常用的iOS转盘效果,轮盘抽奖效果的实现,转盘可以暂停,旋转,已经快速旋转抽奖,选中的效果指向正上方. 效果图: 工程文件目录: 核心代码: // // ViewController.m // 转盘效果 // // Created by llkj on 2017/8/31. // Copyright © 2017年 LayneCheung. All rights reser

  • python实现转盘效果 python实现轮盘抽奖游戏

    本文实例为大家分享了python实现转盘效果的具体代码,供大家参考,具体内容如下 #抽奖 面向对象版本 import tkinter import time import threading class choujiang: #初始化魔术方法 def __init__(self): #准备好界面 self.root = tkinter.Tk() self.root.title('lowB版转盘') self.root.minsize(300, 300) # 声明一个是否按下开始的变量 self.

  • iOS仿微信添加标签效果(shape实现)

    一. 概述 可以说微信做的用户体验太棒了,可以做到老少皆宜,给个赞,我们也同时应该告诫自己,用户体验应该向微信看齐,微信就是我们的标杆,那我们今天也来仿一仿微信添加的标签功能.只能仿着做了,真是做不到微信的那种体验.甘拜下风. 我们上篇学习了shape属性的用法,那我们今天就用shape来做下微信的标签功能.先看一下效果. 我不仅用到了shape属性,还用到了翔哥的标签布局FlowLayout跟TagFlowLayout鸿洋的博客 二.效果图 三 .定义shape 添加标签 <?xml vers

  • iOS自定义collectionView实现毛玻璃效果

    先来看看效果图,由于录屏软件不给力,毛玻璃效果不明显,请见谅. 步骤详解: 说下思路,很简单,首先自定义一个collectionView, 重写它的initWithFrame:collectionViewLayout:方法,在这里面做配置,这里用的是AXECollectionView. 与之对应的自定义一个collectionViewCell,在cell里配置操作:设置layer涂层,加载图片等操作,这里用的是AXECollectionViewCell. 最后在需要展示的控制器里调用AXECol

  • 基于javascript实现九宫格大转盘效果

    本文实例为大家分享了js实现幸运抽奖九宫格大转盘效果,供大家参考,具体内容如下 实现代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>九宫格大转盘</title> <style type="text/css"> /*reset*/ *{ padding:0; margin:0} body{ height:

  • iOS实现音频进度条效果

    前几天开发群里有一个老兄问了一个开发问题,他们的需求是要做一个类似音频进度条的东西,我感觉设计还不错,于是就写了个小demo供大家参考,在争得了他的同意的情况下写下这篇文章. 话不多说先上效果图 看到这个效果的时候我感觉相对比较难的点有两点: 一.是这个进度条的进度颜色变化,这里思路还是比较清晰的,直接用layer的mask来做就可以. 二.第二点就是这个各各条条的高度不一致又没有规律可言,在各个方法中我最终选择用随机数来做.   好了思路清晰了,那就开始撸代码了. 首先创建一个View CYX

  • Android仿IOS上拉下拉弹性效果的实例代码

    用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还是蛮实用的. 思路:其实原理很简单,实现一个自定义的Scrollview方法(来自网上大神),然后在布局文件中使用自定义方法Scrollview就可以了. 代码: 自定义View,继承自Scrollview.MyReboundScrollView类 package com.wj.myrebounds

随机推荐