热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

iOS开发实现转盘功能

这篇文章主要为大家详细介绍了iOS开发实现转盘功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了iOS实现转盘功能的具体代码,供大家参考,具体内容如下

今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看

ViewController

#pragma mark - 如果要旋转那就第一考虑锚点 核心动画看到的都是假象 真实的位置并没有发生改变

//
// ViewController.m
// 5-网易转盘的实现
//
// Created by Jordan zhou on 2018/10/10.
// Copyright © 2018年 Jordan zhou. All rights reserved.
//

#import "ViewController.h"
#import "ZZWheelView.h"

@interface ViewController ()
/** 展示的view */
@property (nonatomic, strong) ZZWheelView *wheelView;

@end

@implementation ViewController

- (IBAction)start:(id)sender {
 [self.wheelView start];
}

- (IBAction)stop:(id)sender {
 [self.wheelView pause];
}

#pragma mark - 懒加载
- (ZZWheelView *)wheelView
{
 if (!_wheelView) {
 _wheelView = [ZZWheelView wheelView];
 _wheelView.center = self.view.center;
 }
 return _wheelView;
}

- (void)viewDidLoad {
 [super viewDidLoad];

 [self.view addSubview:self.wheelView];
}
@end

ZZWheelView

//
// ZZWheelView.h
// 5-网易转盘的实现
//
// Created by Jordan zhou on 2018/10/10.
// Copyright © 2018年 Jordan zhou. All rights reserved.
//

#import 

@interface ZZWheelView : UIView
+ (instancetype)wheelView;

- (void)start;

- (void)pause;
@end


// ZZWheelView.m
// 5-网易转盘的实现
//
// Created by Jordan zhou on 2018/10/10.
// Copyright © 2018年 Jordan zhou. All rights reserved.
//

#import "ZZWheelView.h"
#import "ZZWheelButton.h"

@interface ZZWheelView()
@property (weak, nonatomic) IBOutlet UIImageView *centerView;
@property (nonatomic, weak) UIButton *selBtn;
@property (nonatomic, strong) CADisplayLink *link;
@end

@implementation ZZWheelView
#pragma mark - 懒加载
- (CADisplayLink *)link
{
 if (_link == nil) {
 _link = [CADisplayLink displayLinkWithTarget:self selector:@selector(angleChange)];
 [_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
 }
 return _link;
}

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

#warning - 注意这个方法只是加载xib的时候会调用,但是并没有连好线
//- (instancetype)initWithCoder:(NSCoder *)aDecoder
//{
// if (self = [super initWithCoder:aDecoder]) {
// NSLog(@"-%@",_centerView);
// }
// return self;
//}

- (void)awakeFromNib
{
 [super awakeFromNib];
 
 _centerView.userInteractiOnEnabled= YES;
 
 CGFloat btnW = 68;
 CGFloat btnH = 143;
 CGFloat wh = self.bounds.size.width;
 
 // 加载大图片
 UIImage *bigImage = [UIImage imageNamed:@"LuckyAstrology"];
 
 // 加载大图片
 UIImage *selBigImage = [UIImage imageNamed:@"LuckyAstrologyPressed"];
 
 // 获取当前使用的图片像素和点的比例
 CGFloat scale = [UIScreen mainScreen].scale;
 CGFloat imageW = bigImage.size.width / 12 * scale;
 CGFloat imageH = bigImage.size.height * scale;
 // CGImageRef image:需要裁减的图片
 // rect:裁减区域
 // 裁减区域是以像素为基准
 // CGImageCreateWithImageInRect(CGImageRef image, CGRect rect)
 
 // 添加按钮
 for (int i = 0; i <12; i++) {
 ZZWheelButton *btn = [ZZWheelButton buttonWithType:UIButtonTypeCustom];
 
 // 设置按钮的位置
 btn.layer.anchorPoint = CGPointMake(0.5, 1);
 
 btn.bounds = CGRectMake(0, 0, btnW, btnH);
 
 btn.layer.position = CGPointMake(wh * 0.5, wh * 0.5);
 
 // 按钮的旋转角度
 CGFloat radion = (30 * i) / 180.0 * M_PI;
 
 btn.transform = CGAffineTransformMakeRotation(radion);
 
 [_centerView addSubview:btn];
 
 // 加载按钮的图片
 // 计算裁减区域
 CGRect clipR = CGRectMake(i * imageW, 0, imageW, imageH);
 
 // 裁减图片
 CGImageRef imgR = CGImageCreateWithImageInRect(bigImage.CGImage, clipR);
 
 UIImage *image = [UIImage imageWithCGImage:imgR];
 
 // 设置按钮的图片
 [btn setImage:image forState:UIControlStateNormal];
 
 // 设置选中状态下图片
 imgR = CGImageCreateWithImageInRect(selBigImage.CGImage, clipR);
 
 image = [UIImage imageWithCGImage:imgR];
 
 // 设置按钮的图片
 [btn setImage:image forState:UIControlStateSelected];
 
 // 设置选中背景图片
 [btn setBackgroundImage:[UIImage imageNamed:@"LuckyRototeSelected"] forState:UIControlStateSelected];
 
 // 监听按钮的点击
 [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
 
 // 默认选中第一个
 if (i == 0) {
  [self btnClick:btn];
 }
 }
}

- (void)btnClick:(UIButton *)btn
{
 _selBtn.selected = NO;
 btn.selected = YES;
 _selBtn = btn;
}

#pragma mark - 开始旋转
- (void)start
{
 self.link.paused = NO;
}

// 1.搞个定时器,每隔一段时间就旋转一定的角度,1秒旋转45°

#pragma mark - 暂停旋转
- (void)pause
{
 self.link.paused = YES;
}

#pragma mark - 每隔一段时间旋转一定的角度
- (void)angleChange
{
 // 每一次调用旋转多少 45 \ 60.0
 CGFloat angle = (45 / 60.0) * M_PI / 180.0;
 
 _centerView.transform = CGAffineTransformRotate(_centerView.transform, angle);
}

#pragma mark - 点击开始选号的时候
- (IBAction)startPicker:(id)sender {
 
 // 不需要定时器旋转
 self.link.paused = YES;
 
 // 中间的转盘快速的旋转,并且不需要与用户交互
 CABasicAnimation *anim = [CABasicAnimation animation];
 anim.keyPath = @"transform.rotation";
 anim.toValue = @(M_PI * 2 * 3);
 anim.duration = 0.5;
 anim.delegate = self;
 
 [_centerView.layer addAnimation:anim forKey:nil];
 
 // 点击哪个星座,就把当前星座指向中心点上面
 
 // M_PI 3.14
 // 根据选中的按钮获取旋转的度数,
 // 通过transform获取角度
 CGFloat angle = atan2(_selBtn.transform.b, _selBtn.transform.a);
 
 // 旋转转盘
 _centerView.transform = CGAffineTransformMakeRotation(-angle);
}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
 self.link.paused = NO;
 });
}
@end

ZZWheelButton

//
// ZZWheelButton.m
// 5-网易转盘的实现
//
// Created by Jordan zhou on 2018/10/10.
// Copyright © 2018年 Jordan zhou. All rights reserved.
//

#import "ZZWheelButton.h"

@implementation ZZWheelButton

// 寻找最合适的view
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
 CGFloat btnW = self.bounds.size.width;
 CGFloat btnH = self.bounds.size.height;
 
 CGFloat x = 0;
 CGFloat y = btnH / 2;
 CGFloat w = btnW;
 CGFloat h = y;
 CGRect rect = CGRectMake(x, y, w, h);
 if (CGRectContainsPoint(rect, point)) {
 return nil;
 }else{
 return [super hitTest:point withEvent:event];
 }
}

// 设置UIImageView的尺寸
// contentRect:按钮的尺寸
- (CGRect)imageRectForContentRect:(CGRect)contentRect
{
 // 计算UIImageView控件尺寸
 CGFloat imageW = 40;
 CGFloat imageH = 46;
 CGFloat imageX = (contentRect.size.width - imageW) * 0.5;
 CGFloat imageY = 20;
 return CGRectMake(imageX, imageY, imageW, imageH);
}

// 取消高亮状态
- (void)setHighlighted:(BOOL)highlighted{}
@end

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


推荐阅读
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 如何在PHPcms网站中添加广告
    本文详细介绍了在PHPcms网站后台添加广告的方法,涵盖多种常见的广告形式,如百度广告和Google广告,并提供了相关设置的步骤。同时,文章还探讨了优化网站流量的SEO策略。 ... [详细]
  • 当iOS设备越狱后,某些插件可能会导致系统崩溃(白苹果)。此时,可以通过进入安全模式来排查并删除有问题的插件。本文将详细介绍如何通过特定按键组合进入不加载MobileSubstrate的安全模式,并提供相关背景知识。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 如何优化2060显卡设置以提升《Apex英雄》游戏体验
    《Apex英雄》作为一款热门的战术竞技游戏,吸引了大量玩家。本文将探讨如何通过优化GeForce RTX 2060显卡设置,确保在《Apex英雄》中获得最佳性能和流畅的游戏体验。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
author-avatar
小赖小燕_380
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有