幸运大转盘

一.搭建框架框架

1. 设置整个view的背景图片   @“LuckyBackground”ide

  有三种设置方式oop

 1>拖一个imageView到控制器中 给imageView设置图片动画

 2>设置view的背景颜色 用到方法 spa

self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"LuckyBackground"]];代理

3>设置view上layer的内容(本次采用此方法)orm

self.view.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"LuckyBackground"].CGImage);继承


2.设置上面的星座按钮索引

1>图片名称 LuckyThreeButton 在这里直接拖上去 设置frame图片

2>设置按钮的大小(按钮大小为67*67) 并给按钮设置 高亮状态下的图片(图片名称 LuckyMidPressed


3.设置中间的转盘

 1>用xib来建立中间的转盘按钮 并建立一个类来管理

往里面拖一个UIView设置大小为(286*286) 


拖下面这张图片作背景图片

再拖下面这张锯齿图片用来放button

二.用代码添加转盘上的星座

1.分析

能被选中 说明每一个星座都是按钮

在哪一个方法里面设置按钮?怎么设置按钮呢?

1>在哪一个方法里面设置按钮?

  • 在控制器中在 - (void)viewDidLoad 中添加子控件

  • 在xib中在 -(void)awakeFromNib 中添加子控件 

2>怎么设置按钮呢?

  •  分析 每一个按钮大小都同样 只有位置不同 可是他们的位置分布有规律  考虑用for循环来建立按钮   按钮大小(68*143)而后将每一个按钮按照必定角度旋转 

  •  而后设置锚点 和中心点 让按钮的下面的中心点 在    XIB  view的中心点上

btn.center =self.center

btn.layer.anchorPoint=CGPointMake(0.5, 1)

  • 旋转每一个按钮 旋转角度为

     CGFloat angle = 2*M_PI/12 * i;

btn.transform = CGAffineTransformMakeRotation(angle);


  • 给按钮设置正常状态下的图片

图片是一整张连在一块儿的 因此要把图片进行裁决  而后再把裁剪后的图片设置上去

  • 用一个返回值为UIImage的方法去裁剪图片

- (UIImage*)clipimage:(NSString * )imageName andindex:(NSInteger)index


  • (NSString * )imageName 表示要裁剪的图片的名称

  • (NSInteger)index 把索引传过去(由于裁剪图片时的X值和它的索引有关)

  • CGImageRef imageRef = CGImageCreateWithImageInRect(img.CGImage, rect); 表示在某个区域里面获取图片 获得的时一个像素位图

  • 设置好button的图片后会发现图片是这样的

太大了 图片都挤到一块儿了 

 建立一个类继承UIButton 重写

- (CGRect)imageRectForContentRect:(CGRect)contentRect

这个方法 (这个是返回button里面图片大小的方法,重写此方法 能够使button里面的图片变小)

- (CGRect)imageRectForContentRect:(CGRect)contentRect{
   
CGFloat w = 44;
   
CGFloat h = 47;
   
CGFloat y = 30;
   
CGFloat x = (contentRect.size.width - w) * 0.5;
   
   
CGRect rect =CGRectMake(x,y , w, h);
   

    return rect;

  

}


而后咱们建立button的时候 就用这个类去建立

(图片变小了)

  • 而后设置btn的选中状态的图片 和背景图片 

选中状态下的图片也是一张 因此也须要裁剪 调用裁剪图片的那个方法便可

按钮基本设置好了  要把按钮添加到锯齿图片上

[self.wheelImage addSubview:btn];

点击星座 要让按钮变成选中状态 所以咱们须要给按钮添加一个监听方法 来设置他被选中了 仍是没有被选中

 [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];


而后去实现这个监听方法

- (void)btnClick:(UIButton * )sender{
   
//把上一次选中的按钮恢复为no
   
self.slectedBtn.selected = NO;
   
// 设置本次选中的按钮
    sender.
selected = YES;
   
//传给标记按钮
   
self.slectedBtn = sender;

}


  • 而后让图片一直匀速旋转 

  • 定时器方法有2个 一个上NSTimer (效果很差) 因此咱们选择第二种 CADisplayLink (每秒刷新60次);

// view匀速旋转;
- (
void)rotation{
   
//设置一个定时器
   
CADisplayLink * link =[CADisplayLink displayLinkWithTarget:self selector:@selector(nextTime)];
   

    [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];


    //后面转盘进行动画时 要让定时器中止 须要拿到定时器变量 所以用一个全局变量来保存

    self.link = link;

}

而后实现nextTime这个方法

在这个方法里面实现让转盘持续转动

- (void)nextTime{

   

内容


}


三. 给转盘添加动画


点击这个按钮后 给转盘添加动画 (这个按钮本身在xib里面添加 记住是添加在xib的view上 而不是锯齿图片上 不然按钮会和图片一块儿旋转  按钮大小(81*81)

分析:1.按下以后 是否是要中止转盘的匀速运动 (中止定时器) [self.link invalidate];

     2.执行动画的时候 是否是要让按钮不能点击

     

 加动画的几个步骤

1.建立动画

2.设置属性

  •  动画要执行的操做---> 旋转  transform.rotation; 

  •  动画要旋转的角度 旋转到----> toValue (旋转2*M_PI 就是是旋转一圈 减去当前按钮的角度 就能让按钮旋转完毕后 停在12点方向)

  • 执行动画的持续时间  

  • 不能移除动画 否则动画执行完毕后 选中的按钮会回到初始的frame

  • 设置代理 实现代理方法 让动画执行完毕后 弹出警示框

  • 设置动画样式先快后慢  ani.timingFunction= [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];

3.把动画添加到要做用的layer上(记住是layer上);

四 .  弹出警示框

1.在动画代理方法里面去实现

2.有2种方法去弹出 警示框 

  • UIAlertView(已通过时 可是用起来比较简单)

  • UIAlertController(比较复杂 须要用到代理 让控制器去弹出警示框)

3.点击警示框的肯定按钮后 让定时器启动 转盘匀速转动

相关文章
相关标签/搜索