IOS开发基础之大转盘案例

本案例使用xib加载的,以及核心动画的使用。动态按钮的使用和创建。等知识。

源码在我的主页资源下。欢迎下载。
核心代码在这。

//  LJRotateView.h
//  37-大转盘
//
//  Created by 鲁军 on 2021/2/27.
//
#import <UIKit/UIKit.h>
@interface LJRotateView : UIView
+(instancetype)rotateView;
-(void)startRotate;
@end
//
//  LJRotateView.m
//  37-大转盘
//
//  Created by 鲁军 on 2021/2/27.
//#import "LJRotateView.h"@interface LJRotateView () <UIAlertViewDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *rotateImage; //锯齿图片
@property(nonatomic,weak)UIButton *currentButton;@property(nonatomic,strong)CADisplayLink *link;
- (IBAction)pickNumber:(id)sender;@end
@implementation LJRotateView-(void)startRotate{CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(rotate)];[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];self.link =link;
}
//1 秒调用60s
-(void)rotate{// NSLog(@"");self.rotateImage.transform= CGAffineTransformRotate(self.rotateImage.transform, 2*M_PI/60/10);}+ (instancetype)rotateView{return [[NSBundle mainBundle] loadNibNamed:@"LJRotateView" owner:nil options:nil][0];
}
- (void)awakeFromNib{[super awakeFromNib];//设置父控件可交互self.rotateImage.userInteractionEnabled = YES;for(int i=0;i<12;++i){//  UIButton *btn = [[UIButton alloc] init];UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];btn.tag=i;//  btn.backgroundColor = [UIColor redColor];UIImage *image = [UIImage imageNamed:@"LuckyAstrology"];image = [self clipImageWithImage:image withIndex:i];[btn setImage:image forState:UIControlStateNormal];UIImage *imagePress = [UIImage imageNamed:@"LuckyAstrologyPressed"];imagePress = [self clipImageWithImage:imagePress withIndex:i];[btn setImage:imagePress  forState:UIControlStateSelected];[btn setBackgroundImage:[UIImage imageNamed:@"LuckyRototeSelected"] forState:UIControlStateSelected];//btn内部 imageView 往上偏移[btn setImageEdgeInsets:UIEdgeInsetsMake(-50, 0, 0, 0)];btn.userInteractionEnabled=YES;//btn.isUserInteractionEnabled=YES;[self.rotateImage addSubview:btn];[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];}
}-(void)btnClick:(UIButton *)sender{self.currentButton.selected = NO;sender.selected = YES;self.currentButton = sender;}-(void)layoutSubviews{[super layoutSubviews];for (int i=0; i<self.rotateImage.subviews.count; ++i) {UIButton *btn = self.rotateImage.subviews[i];btn.frame = CGRectMake(0, 0, 68, 143);btn.center = self.rotateImage.center;//锚点btn.layer.anchorPoint = CGPointMake(0.5, 1);//计算一个按钮的夹角CGFloat angle = 2*M_PI / 12;btn.transform = CGAffineTransformMakeRotation(angle*i);}
}
-(UIImage*)clipImageWithImage:(UIImage *)image withIndex:(NSInteger)index{//计算 rectCGFloat w=image.size.width / 12*[UIScreen mainScreen].scale;CGFloat h=image.size.height*[UIScreen mainScreen].scale;CGFloat x=index * w;CGFloat y=0;CGImageRef  imageRef = CGImageCreateWithImageInRect(image.CGImage,CGRectMake(x, y, w, h));return [[UIImage alloc] initWithCGImage:imageRef scale:2.3 orientation:UIImageOrientationUp];
}
- (IBAction)pickNumber:(id)sender {if([self.rotateImage.layer animationForKey:@"keys"]){return;//如果存在,就return掉,后面的都不执行}self.link.paused = YES;CABasicAnimation *anim=[[CABasicAnimation alloc] init];anim.keyPath = @"transform.rotation";//计算 需要减去的角度CGFloat angle =2*M_PI / 12 *self.currentButton.tag;anim.toValue = @(5*M_PI*2 - angle);//圈anim.duration = 3;//设置时间anim.fillMode =kCAFillModeForwards;anim.removedOnCompletion=NO;[self.rotateImage.layer addAnimation:anim forKey:@"keys"];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(anim.duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{self.rotateImage.transform = CGAffineTransformMakeRotation(-angle);UIAlertController *alert=[UIAlertController alertControllerWithTitle:@"温馨提示" message:@"" preferredStyle:UIAlertControllerStyleAlert];/* UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"12332" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];[alert1 show];*///移除核心动画[self.rotateImage.layer removeAnimationForKey:@"keys"];});}- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{self.link.paused = NO;}
@end
//
//  ViewController.m
//  37-大转盘
//
//  Created by 鲁军 on 2021/2/27.
//#import "ViewController.h"
#import "LJRotateView.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.view.layer.contents=(__bridge id)[UIImage imageNamed:@"LuckyBackground"].CGImage;LJRotateView *rotateView = [LJRotateView rotateView];rotateView.center=self.view.center;[self.view addSubview:rotateView];//  [rotateView startRotate];}- (BOOL)prefersStatusBarHidden{return YES;
}@end

IOS开发基础之大转盘案例相关推荐

  1. IOS开发基础之团购案例17-xib和UITableView两种方式实现

    IOS开发基础之团购案例17-xib和UITableView两种方式实现 Design By Johnson Shanghai 实现效果 系统和Xcode版本 注意的细节 关键性的代码 // // V ...

  2. IOS开发基础之模拟科技头条项目案例32

    IOS开发基础之模拟科技头条项目案例32 说说这个项目的技术要点核心 ,首先是异步网络请求,block的回调,sdWebImage的使用.各个控件的使用,NSDate日期的转换.自动适配屏幕工作,模型 ...

  3. IOS开发基础之摇奖机案例

    IOS开发基础之摇奖机案例 // ViewController.m // 33-摇奖机器 // Created by 鲁军 on 2021/3/9. #import "ViewControl ...

  4. IOS开发基础之画板案例软件的开发

    IOS开发基础之画板案例软件的开发 值此元宵佳节,我依然在学习IOS,几天没有更新博客了.今天更新了一下. 源码在我的主页里面. info.plist里面加入这样的代码,防止截图的时候有问题 < ...

  5. IOS开发基础之核心动画 基础动画、关键帧、组动画案例

    IOS开发基础之核心动画 基础动画.关键帧.组动画案例 案例源码在我的主页里.实现效果图 // // ViewController.m // 30-核心动画 // // Created by 鲁军 o ...

  6. IOS开发基础之手势解锁项目案例

    IOS开发基础之手势解锁项目案例 项目最终实现效果. 由于缺少红色的error背景图.我自己从安卓项目找到一个手势解锁,然后通过ps添加粉红色的红圈,才得以解决.为了分享给大家源码,github和本地 ...

  7. IOS开发基础之UI基础的团购源码完整版本

    IOS开发基础之UI基础的团购源码完整版本 // // ViewController.m // 17-团购案例 // // Created by 鲁军 on 2021/2/4. //#import & ...

  8. Unity 4.x 2D游戏开发基础教程大学霸第一更

    Unity 4.x 2D游戏开发基础教程 大学霸 第1章  Unity及其组成的介绍 本书主要讲解的是,如何使用Unity开发2D游戏.但在开始讲解之前,最好先熟悉一下Unity这个工具.本章会首先介 ...

  9. IOS开发基础之NSURLSession的使用

    IOS开发基础之NSURLSession的使用 服务器我们选用的是tomcat服务器. 所有项目info.plist加入 <key>NSAppTransportSecurity</k ...

最新文章

  1. 为什么需要IP地址?—Vecloud微云
  2. linux添加永久变量,linux中永久性变量和临时变量的设置
  3. OpenCASCADE:Foundation Classes之数学原语和算法
  4. 68张机械原理动图,够你看一晚上了!
  5. 六元均匀直线阵的各元间距为_实验二 均匀直线阵
  6. MS SQL入门基础:系统数据库
  7. css文件如何设置scss,Webpack - 如何将scss编译成单独的css文件?
  8. 评测任务征集 | 全国知识图谱与语义计算大会(CCKS 2022)
  9. virtual box一直正在加载文件_如何用Band-in-a-box进行民乐编曲
  10. HarmonyOS 生态最重的拼图,手机开发者 Beta 版终于到来
  11. 每天只睡 4 小时!大佬们都这么拼吗?
  12. keras实现DCGAN生成mnist原代码
  13. (转)让页面自动滚动到刷新页面之前的控件处,减少页面刷新带来的不便。
  14. 前端下载svg格式图片
  15. 关于急救和医学常识,告诉我们你想知道什么?
  16. 文件内容读取相关操作
  17. PHP RGB图片模式转换CMYK模式图片
  18. 【跨境电商】5个最佳免费极简主义WordPress主题(一)
  19. (3) 二分频VHDL描述
  20. 达梦8上安装ODBC

热门文章

  1. windows获取硬件设备的guid_Windows编程技术:提权技术(下)
  2. 一个亿的融资在一家芯片初创公司可以烧多久?
  3. 什么?电路板上还要喷漆?
  4. PHP不读取Excel空行,phpexcel中遇到空单元格不跳过
  5. linux 安装python_Linux/Mac/Windows的Rstudio安装Python模块总报错,怎么破?
  6. java transaction cn_GitHub - cnzebra/tcc-transaction: tcc-transaction是TCC型事务java实现
  7. BUUCTF--- LFI-------本地文件包含(Local File Include)
  8. invoke方法是做啥的_使用 NLog 给 Asp.Net Core 做请求监控
  9. 64位内核开发第二讲.内核编程注意事项,以及UNICODE_STRING
  10. DataTable的Merge\COPY\AcceptChange使用说明