转盘功能的详细实现

转盘功能的详细实现

一、自定义转盘XIB

+ ( instancetype )wheelView
{
   
return [[ NSBundle mainBundle ] loadNibNamed : @"HMWheelView" owner : nil options : nil ][ 0 ];
}

二、添加按钮
#warning 添加按钮
- ( void )awakeFromNib
{
     // 加载完XIB就开始启动转盘
      self . link . paused = NO ;
   
_rotationView . userInteractionEnabled = YES ;

   
// 裁剪的大图片
   
UIImage *bigImage = [ UIImage imageNamed : @"LuckyAstrology" ];
   
UIImage *selectedImage = [ UIImage imageNamed : @"LuckyAstrologyPressed" ];
   
   
// 图片的尺寸
   
CGFloat imageW = 40 * [ UIScreen mainScreen ]. scale ;
   
CGFloat imageH = 47 * [ UIScreen mainScreen ]. scale ;
   
   
for ( int i = 0 ; i < 12 ; i++) {
       
// 创建按钮
       
HMWheelButton *button = [ HMWheelButton buttonWithType : UIButtonTypeCustom ];
       
       
// 锚点
        button.
layer . anchorPoint = CGPointMake ( 0.5 , 1 );
       
// 位置
        button.
layer . position = CGPointMake ( self . bounds . size . width * 0.5 , self . bounds . size . height * 0.5 );
       
       
// 旋转按钮
        button.
layer . transform = CATransform3DMakeRotation ( angle2radian (i * 30 ), 0 , 0 , 1 );
       
       
// 尺寸
        button.
bounds = CGRectMake ( 0 , 0 , 68 , 143 );
       
       
// 设置选中时候的背景图片
        [button
setBackgroundImage :[ UIImage imageNamed : @"LuckyRototeSelected" ] forState : UIControlStateSelected ];
       
       
// 设置按钮的图片
       
// image: 裁剪的图片
       
// rect: 裁剪的尺寸
      
CGRect clipRect = CGRectMake (i * imageW, 0 , imageW, imageH);
      
CGImageRef smallImage = CGImageCreateWithImageInRect (bigImage. CGImage , clipRect);
        [button
setImage :[ UIImage imageWithCGImage :smallImage] forState : UIControlStateNormal ];
       
       
// 设置选中的图片
       
CGImageRef selectedSmallImage = CGImageCreateWithImageInRect (selectedImage. CGImage , clipRect);
        [button
setImage :[ UIImage imageWithCGImage :selectedSmallImage] forState : UIControlStateSelected ];
       
       
// 监听点击事件
        [button
addTarget : self action : @selector (btnClick:) forControlEvents : UIControlEventTouchDown ];
        
        // 默认选中第一个
       
if (i == 0 ) {
            [
self btnClick :button];
        }
        [
_rotationView addSubview :button]; 
    }
}


三、实现监听方法
#warning 监听按钮点击
- ( void )btnClick:( UIButton *)button
{
   
_selectedButton . selected = NO ;
    button.
selected = YES ;
   
_selectedButton = button;
}

四、定义定时器
- ( CADisplayLink *)link
{

   
if ( _link == nil ) {
       
CADisplayLink *link = [ CADisplayLink displayLinkWithTarget : self selector : @selector (update)];
        [link
addToRunLoop :[ NSRunLoop mainRunLoop ] forMode : NSDefaultRunLoopMode ];
       
_link = link;
    }
   
return _link ;
}

- (
void )update
{
   
_rotationView . transform = CGAffineTransformRotate ( _rotationView . transform (( 45  /  60.0 ) / 180.0 * M_PI) );
}
五、实现开始选号功能

- ( IBAction )start:( id )sender {

   
// 1. 不要和用户交互
   
_rotationView . userInteractionEnabled = NO ;
   
// 2. 取消慢慢的旋转
    
_link . paused = YES ;
   
   
CABasicAnimation *anim = [ CABasicAnimation animation ];

    anim.
keyPath = @"transform.rotation" ;

    anim.
toValue = @( M_PI * 2 * 3) ;

    anim.
duration = 0.5 ;
   
    anim.
delegate = self ;

    [
_rotationView . layer addAnimation :anim forKey : nil ];  
}

六、实现
CAAnimationDelegate的代理方法
- (
void )animationDidStop:( CAAnimation *)anim finished:( BOOL )flag
{
   
_rotationView . userInteractionEnabled = YES ;

   
// 让选中按钮回到最在上面的中间位置 :
   
CGFloat angle = atan2 ( _selectedButton . transform . b , _selectedButton . transform . a );

   
// 把我们的转盘反向旋转这么多 °
   
_rotationView . transform = CGAffineTransformMakeRotation (-angle);
   
   
dispatch_after ( dispatch_time ( DISPATCH_TIME_NOW , ( int64_t )( 2 * NSEC_PER_SEC )), dispatch_get_main_queue (), ^{
        [
self startRotating ];
    });
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现转盘抽奖功能,你可以使用Vue来创建一个交互式的转盘组件。以下是一个简单的示例代码,可以帮助你开始: 1. 创建一个Vue组件,例如"LuckyDraw": ```javascript <template> <div> <div class="roulette-wheel"> <div v-for="(item, index) in items" :key="index" class="roulette-item"> {{ item }} </div> </div> <button @click="startSpinning">Start Spinning</button> <div v-if="winner" class="winner"> Congratulations! You won: {{ winner }} </div> </div> </template> <script> export default { data() { return { items: ['Prize 1', 'Prize 2', 'Prize 3', 'Prize 4', 'Prize 5'], // 奖项列表 winner: null // 中奖结果 }; }, methods: { startSpinning() { // 模拟抽奖过程,设置一个随机的中奖结果 const randomIndex = Math.floor(Math.random() * this.items.length); this.winner = this.items[randomIndex]; } } }; </script> <style scoped> .roulette-wheel { display: flex; justify-content: center; align-items: center; height: 300px; } .roulette-item { width: 100px; height: 100px; border: 1px solid #000; display: flex; justify-content: center; align-items: center; } button { margin-top: 20px; } .winner { margin-top: 20px; font-weight: bold; } </style> ``` 2. 在你的Vue应用中使用该组件: ```javascript <template> <div> <lucky-draw></lucky-draw> </div> </template> <script> import LuckyDraw from './LuckyDraw.vue'; export default { components: { LuckyDraw } }; </script> ``` 这样,你就可以使用Vue实现一个简单的转盘抽奖功能。当点击"Start Spinning"按钮时,会随机选取一个奖项作为中奖结果,并显示在页面上。你可以根据自己的需求进行样式和功能上的定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值