iOS實現轉盤效果
阿新 • • 發佈:2020-04-19
本文例項為大家分享了iOS實現轉盤效果的具體程式碼,供大家參考,具體內容如下
Demo下載地址: iOS轉盤效果
功能:實現了常用的iOS轉盤效果,輪盤抽獎效果的實現,轉盤可以暫停,旋轉,已經快速旋轉抽獎,選中的效果指向正上方。
效果圖:
工程檔案目錄:
核心程式碼:
// // ViewController.m // 轉盤效果 // // Created by llkj on 2017/8/31. // Copyright © 2017年 LayneCheung. All rights reserved. // #import "ViewController.h" #import "WheelView.h" @interface ViewController () @property (nonatomic,weak) WheelView *wheelV; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; WheelView *wheelV = [WheelView wheelView]; wheelV.center = self.view.center; self.wheelV = wheelV; [self.view addSubview:wheelV]; } - (IBAction)rotation:(id)sender { [self.wheelV rotation]; } - (IBAction)stop:(id)sender { [self.wheelV stop]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
WheelView檔案
// // WheelView.h // 轉盤效果 // // Created by llkj on 2017/8/31. // Copyright © 2017年 LayneCheung. All rights reserved. // #import <UIKit/UIKit.h> @interface WheelView : UIView + (instancetype)wheelView; - (void)rotation; - (void)stop; @end
// // WheelView.m // 轉盤效果 // // Created by llkj on 2017/8/31. // Copyright © 2017年 LayneCheung. All rights reserved. // #import "WheelView.h" #import "WheelBtn.h" #define angle2Rad(angle) ((angle) / 180.0 * M_PI) @interface WheelView ()<CAAnimationDelegate> @property (weak,nonatomic) IBOutlet UIImageView *contentV; @property (nonatomic,weak) UIButton *selectBtn; @property (nonatomic,strong) CADisplayLink *link; @end @implementation WheelView - (CADisplayLink *)link { if (_link == nil) { CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)]; [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; _link = link; } return _link; } + (instancetype)wheelView { return [[[NSBundle mainBundle] loadNibNamed:@"WheelView" owner:nil options:nil] lastObject]; } - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self = [[[NSBundle mainBundle] loadNibNamed:@"WheelView" owner:nil options:nil] lastObject]; } return self; } - (void)awakeFromNib { [super awakeFromNib]; CGFloat btnW = 68; CGFloat btnH = 143; CGFloat angle = 0; //載入原始大圖片 UIImage *oriImage = [UIImage imageNamed:@"LuckyAstrology"]; //載入原始選中的大圖片 UIImage *oriSelImg = [UIImage imageNamed:@"LuckyAstrologyPressed"]; CGFloat X = 0; CGFloat Y = 0; CGFloat sacle = [UIScreen mainScreen].scale; CGFloat clipW = oriImage.size.width / 12.0 * sacle; CGFloat clipH = oriImage.size.height * sacle; for (int i = 0; i < 12; i ++) { WheelBtn *btn = [WheelBtn buttonWithType:UIButtonTypeCustom]; btn.bounds = CGRectMake(0,btnW,btnH); //按鈕正常狀態圖片 X = i * clipW; //給定一張圖片擷取指定區域內的圖片 CGImageRef clipImg = CGImageCreateWithImageInRect(oriImage.CGImage,CGRectMake(X,Y,clipW,clipH)); [btn setImage:[UIImage imageWithCGImage:clipImg] forState:UIControlStateNormal]; //按鈕選中狀態圖片 CGImageRef clipSelImg = CGImageCreateWithImageInRect(oriSelImg.CGImage,clipH)); [btn setImage:[UIImage imageWithCGImage:clipSelImg] forState:UIControlStateSelected]; [btn setBackgroundImage:[UIImage imageNamed:@"LuckyRototeSelected"] forState:UIControlStateSelected]; btn.layer.anchorPoint = CGPointMake(0.5,1); btn.layer.position = CGPointMake(self.bounds.size.width * 0.5,self.bounds.size.height * 0.5); btn.transform = CGAffineTransformMakeRotation(angle2Rad(angle)); angle += 30; [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; [self.contentV addSubview:btn]; //預設第一個按鈕選中 if (i == 0) { [self btnClick:btn]; } } } - (void)btnClick:(UIButton *)btn { //1.讓當前選中的按鈕取消選中 self.selectBtn.selected = NO; //2.讓當前點選的按鈕成為選中狀態 btn.selected = YES; //3.當前點選的按鈕成為選中狀態 self.selectBtn = btn; } - (void)rotation { self.link.paused = NO; } - (void)stop { self.link.paused = YES; } - (void)update { self.contentV.transform = CGAffineTransformRotate(self.contentV.transform,M_PI / 300.0); } - (IBAction)start:(id)sender { //快速轉幾圈 CABasicAnimation *anim = [CABasicAnimation animation]; anim.keyPath = @"transform.rotation"; anim.toValue = @(M_PI * 4); anim.duration = 0.5; anim.repeatCount = 1; anim.delegate = self; [self.contentV.layer addAnimation:anim forKey:nil]; } - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { CGAffineTransform transform = self.selectBtn.transform; //獲取當前選中按鈕的旋轉角度 CGFloat angle = atan2(transform.b,transform.a); //動畫結束時當前選中的按鈕指向最上方 self.contentV.transform = CGAffineTransformMakeRotation(-angle); } @end
WheelBtn.m
// // WheelBtn.m // 轉盤效果 // // Created by llkj on 2017/8/31. // Copyright © 2017年 LayneCheung. All rights reserved. // #import "WheelBtn.h" @implementation WheelBtn - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { CGRect rect = CGRectMake(0,self.bounds.size.width,self.bounds.size.height * 0.5); if (CGRectContainsPoint(rect,point)) { // 在指定的範圍內 return [super hitTest:point withEvent:event]; } else { return nil; } } //取消按鈕高亮狀態做的事 - (void)setHighlighted:(BOOL)highlighted { } //返回當前按鈕中的image位置和尺寸 - (CGRect)imageRectForContentRect:(CGRect)contentRect { return CGRectMake((contentRect.size.width - 40) *0.5,20,40,48); } //返回當前按鈕中的Label位置和尺寸 //- (CGRect)titleRectForContentRect:(CGRect)contentRect{ // //} @end
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。