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

iOS时钟开发案例分享

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

本文实例为大家介绍了iOS时钟开发过程,供大家参考,具体内容如下

思路就是利用CALayer的隐式动画来实现。因为UIView的非根层也就是手动创建的layer在其属性发生变化时会默认会产生动画效果,这些属性也叫作可动画属性。比如bounds、backgroundColor、position。

时钟里面表盘就是一个UIView,而三根针就是三个手动创建的layer。

先在storyboard上弄一个UIImageView,设置表盘图片

然后在viewDidLoad中初始化三根针,并设置定时器,获取当前时间,将当前时间对应的时针分针秒针分别指向对应的角度。

//
// ViewController.m
// 时钟效果
//
// Created by Daniel on 16/4/7.
// Copyright © 2016年 Daniel. All rights reserved.
//
 
#define kClockWH _clockView.bounds.size.width
 
//一秒钟秒针转多少度
#define preSecondA 6
 
//一分钟分针转多少度
#define preMinuteA 6
 
//一小时时针转多少度
#define preHourA 30
 
//每分钟时针转多少度
#define preHourMinute 0.5
 
//每秒钟分针转多少度
#define preMinuteSecond 0.1
 
#define angle2raditon(a) ((a) / 180.0 * M_PI)
 
#import "ViewController.h"
 
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *clockView;
 
/** 秒针 */
@property(nonatomic, strong) CALayer *secondL;
 
/** 分针 */
@property(nonatomic, strong) CALayer *minuteL;
 
/** 时针 */
@property(nonatomic, strong) CALayer *hourL;
 
@end
 
@implementation ViewController
 
- (void)viewDidLoad {
 [super viewDidLoad];
  
 //添加时针
 [self setUpHourLayer];
  
 //添加分针
 [self setUpMinuteLayer];
 
 //添加秒针
 [self setUpSecondLayer];
  
 //添加定时器
 [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
  
 //开始运行时就获取时间,这样在启动时就不会有停顿的感觉
 [self timeChange];
  
}
 
- (void)timeChange {
  
 //获取当前系统时间
 NSCalendar *calendar = [NSCalendar currentCalendar];
  
 NSDateComponents *cmp = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]];
  
 //获取秒
 NSInteger secOnd= cmp.second;
  
 //获取分
 NSInteger minute = cmp.minute;
  
 //获取小时
 NSInteger hour = cmp.hour;
  
 //计算秒针转多少度
 CGFloat secOndA= second * preSecondA;
  
 //计算分针转多少度
 CGFloat minuteA = minute * preMinuteA + second * preMinuteSecond;
  
 //计算时针转多少度
 CGFloat hourA = hour * preHourA + minute * preHourMinute;
  
 //旋转秒针
 _secondL.transform = CATransform3DMakeRotation(angle2raditon(secondA), 0, 0, 1);
  
 //旋转分针
 _minuteL.transform = CATransform3DMakeRotation(angle2raditon(minuteA), 0, 0, 1);
  
 //旋转时针
 _hourL.transform = CATransform3DMakeRotation(angle2raditon(hourA), 0, 0, 1);
  
}
 
#pragma mark - 初始化时针
- (void)setUpHourLayer {
  
 CALayer *hourL = [CALayer layer];
  
 //设置秒针背景色
 hourL.backgroundColor = [UIColor blackColor].CGColor;
  
 //设置秒针锚点
 hourL.anchorPoint = CGPointMake(0.5, 1);
  
 //设置秒针锚点在父控件的位置
 hourL.position = CGPointMake(kClockWH * 0.5, kClockWH * 0.5);
  
 hourL.cornerRadius = 4;
  
 //设置秒针bounds
 hourL.bounds = CGRectMake(0, 0, 4, kClockWH * 0.5 - 40);
  
 //把秒针添加到clockView图层上
 [_clockView.layer addSublayer:hourL];
  
 _hourL = hourL;
  
}
 
 
#pragma mark - 初始化分针
- (void)setUpMinuteLayer {
  
 CALayer *minuteL = [CALayer layer];
  
 //设置秒针背景色
 minuteL.backgroundColor = [UIColor blackColor].CGColor;
  
 //设置秒针锚点
 minuteL.anchorPoint = CGPointMake(0.5, 1);
  
 //设置秒针锚点在父控件的位置
 minuteL.position = CGPointMake(kClockWH * 0.5, kClockWH * 0.5);
  
 minuteL.cornerRadius = 4;
  
 //设置秒针bounds
 minuteL.bounds = CGRectMake(0, 0, 4, kClockWH * 0.5 - 20);
  
 //把秒针添加到clockView图层上
 [_clockView.layer addSublayer:minuteL];
  
 _minuteL = minuteL;
  
}
 
#pragma mark - 初始化秒针
- (void)setUpSecondLayer {
  
 CALayer *secOndL= [CALayer layer];
  
 //设置秒针背景色
 secondL.backgroundColor = [UIColor redColor].CGColor;
  
 //设置秒针锚点
 secondL.anchorPoint = CGPointMake(0.5, 1);
  
 //设置秒针锚点在父控件的位置
 secondL.position = CGPointMake(kClockWH * 0.5, kClockWH * 0.5);
  
  
 //设置秒针bounds
 secondL.bounds = CGRectMake(0, 0, 1.5, kClockWH * 0.5 - 20);
  
 //把秒针添加到clockView图层上
 [_clockView.layer addSublayer:secondL];
  
 _secOndL= secondL;
  
}
 
 
@end

效果图:

以上就是本文的全部内容,希望对大家学习IOS程序设计有所帮助。


推荐阅读
  • 题目描述了一个病毒检测问题,要求使用AC自动机算法统计目标文本中多个模式串的出现次数。 ... [详细]
  • 本文旨在介绍在iOS平台进行直播技术开发前的准备工作,重点讲解AVFoundation框架的基本概念和使用方法。通过对AVFoundation的深入理解,开发者能够更好地掌握直播应用中的音视频处理技巧。 ... [详细]
  • 本文介绍了一个使用C++编写的简单程序,该程序能在控制台上绘制出一个心形图案,并附带一句温馨的情话。通过调整控制台的颜色设置,使图案更加吸引人。 ... [详细]
  • 本文提供了手势解锁功能的详细实现方法和源码下载链接。通过分析手势解锁的界面和逻辑,详细介绍如何在iOS应用中实现这一功能。 ... [详细]
  • 在使用Firefox浏览器打开本地HTML文件时,尝试调用Canvas的drawImage方法可能会遇到NS_ERROR_NOT_AVAILABLE错误。本文探讨了这一问题的原因及解决方案。 ... [详细]
  • C语言编程课程第十二课
    本课程将深入探讨C语言中的数组操作与基本算法实现,包括最大最小值交换、数组旋转以及约瑟夫环问题等经典案例分析。 ... [详细]
  • iOS开发中解决‘_OBJC_CLASS_$_JPUSHService’引用错误的方法
    本文详细探讨了在iOS开发过程中遇到的‘_OBJC_CLASS_$_JPUSHService’引用错误,并提供了一系列有效的解决方案。 ... [详细]
  • 如何使用Ionic3框架创建首个混合开发应用
    混合开发是指结合原生(Native)与网页(Web)技术进行移动应用开发的方法。本文将详细介绍如何利用Ionic3这一流行的混合开发框架,从环境搭建到创建并运行首个应用的全过程。 ... [详细]
  • 题目链接:请点击这里。本题将图形视为波动,其中波峰被淹没时部分数减少,而波谷被淹没时部分数增加。因此,需要预先处理所有波峰和波谷的位置。特别地,图形的两端点需要特殊处理,可以通过设置边界条件来简化问题。 ... [详细]
  • Python库在GIS与三维可视化中的应用
    Python库极大地扩展了GIS的能力,使其能够执行复杂的数据科学任务。本文探讨了几个关键的Python库,这些库不仅增强了GIS的核心功能,还推动了地理信息系统向更高层次的应用发展。 ... [详细]
  • 一款专为电脑维修店设计的U盘启动盘制作工具,支持多种操作系统安装与维护。 ... [详细]
  • 本文详细介绍如何在 macOS 上编译 FFmpeg 3.1.1,并将其集成到 iOS 项目中,包括必要的环境配置和代码示例。 ... [详细]
  • 本题来自 BZOJ2004,链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2004。题目要求计算特定条件下的方案数,采用动态规划(DP)解决。由于任意两站间的距离不超过 p,因此每 p 个站点中所有的公交车都必须至少停靠一次。 ... [详细]
  • 2014年4月17日,深入研究了邵杨的代码库,发现代码中的注释较为稀少,影响了理解的效率。同时,学习了一些Eclipse的高效操作技巧。 ... [详细]
  • 深入理解BIO与NIO的区别及其应用
    本文详细探讨了BIO(阻塞I/O)和NIO(非阻塞I/O)之间的主要差异,包括它们的工作原理、性能特点以及应用场景,旨在帮助开发者更好地理解和选择适合的I/O模型。 ... [详细]
author-avatar
我恨数学忆万年丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有