iOS时钟开发案例分享

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

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

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

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

iOS时钟开发案例分享

然后在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时钟开发案例分享

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

时间: 2016-04-05

iOS开发中使用UIScrollView实现图片轮播和点击加载

UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播 二.实现代码 storyboard中布局 代码: 复制代码 代码如下: #import "YYViewController.h" @interface YYViewController () <UIScrollViewDelegate> @property (weak, nonatomic) IBOutlet UIScrollView *scrollview; /**  *  页码  */ @pro

iOS开发中导航控制器的基本使用教程

多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个view时,可以用一个大的view去管理1个或者多个小view,控制器也是如此,用1个控制器去管理其他多个控制器 比如,用一个控制器A去管理3个控制器B.C.D.控制器A被称为控制器B.C.D的"父控制器":控制器B.C.D的被称为控制器A的"子控制器" 为了便于管理控制器,iOS提供了2个

简单讲解iOS应用开发中的MD5加密的相关使用

一.简单说明 1.说明 在开发应用的时候,数据的安全性至关重要,而仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题. 如:可以利用软件(比如Charles)设置代理服务器,拦截查看手机的请求数据 "青花瓷"软件 因此:提交用户的隐私数据时,一定不要明文提交,要加密处理后再提交 2.常见的加密算法 MD5 \ SHA \ DES \ 3DES \ RC2和RC4 \ RSA \ IDEA \ DSA \ AES 3.加密算法的选择 一般公司都会有一套自己的加密方案,按照公司

iOS开发中UIDatePicker控件的使用方法简介

iOS上的选择时间日期的控件是这样的,左边是时间和日期混合,右边是单纯的日期模式. 您可以选择自己需要的模式,Time, Date,Date and Time  , Count Down Timer四种模式. 本篇文章简单介绍下PickerDate控件的使用 1.新建一个Singe View Application,命名为DatePickDemo,其他设置如图 2.放置控件 打开ViewController.xib,拖拽一个DatePicker控件放到界面上,再拖拽一个Button控件放到界面上

iOS应用开发中实现页面跳转的简单方法笔记

作为新手写的笔记,方便自己记忆: 从android转过来iOS的,对于页面的跳转,找了很多资料,现在记录一下页面跳转的方法. 1.用navigationController 2.直接跳(刚刚在网上找到的,不太熟,有错莫怪) 1.建一个RootViewController,在delegate.h 复制代码 代码如下: @property (strong, nonatomic) UIViewController *viewController; @property (strong, nonatomi

iOS开发中使用UILabel设置字体的相关技巧小结

一.初始化 复制代码 代码如下: UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, 40, 120, 44)];      [self.view addSubview:myLabel]; 二.设置文字 1.设置默认文本 复制代码 代码如下: NSString *text = @"标签文本"; myLabel.text = text; 效果: 2.设置标签文本(此属性是iOS6.0之后才出现,如若不是必要,不

iOS开发中音频工具类的封装以及音乐播放器的细节控制

一.控制器间数据传递 两个控制器之间数据的传递 第一种方法: 复制代码 代码如下: self.parentViewController.music=self.music[indexPath.row]; 不能满足 第二种做法:把整个数组传递给它 第三种做法:设置一个数据源,设置播放控制器的数据源是这个控制器.self.parentViewController.dataSource=self;好处:没有耦合性,任何实现了协议的可以作为数据源. 第四种做法:把整个项目会使用到的音频资源交给一个工具类去

iOS开发中WebView的基本使用方法简介

1.使用UIWebView加载网页 运行XCode 4.3,新建一个Single View Application,命名为WebViewDemo. 2.加载WebView 在ViewController.h添加WebView成员变量和在ViewController.m添加实现 复制代码 代码如下: #import <UIKit/UIKit.h> @interface ViewController : UIViewController {     UIWebView *webView; } @e

iOS应用开发中导航栏按钮UIBarButtonItem的添加教程

1.UINavigationController导航控制器如何使用 UINavigationController可以翻译为导航控制器,在iOS里经常用到. 我们看看它的如何使用: 下面的图显示了导航控制器的流程.最左侧是根视图,当用户点击其中的General项时 ,General视图会滑入屏幕:当用户继续点击Auto-Lock项时,Auto-Lock视图将滑入屏幕.相应地,在对象管理上,导航控制器使用了导航堆栈.根视图控制器在堆栈最底层,接下来入栈的是General视图控制器和Auto-Lock

IOS中快速集成短信SDK验证开发(SMSSDK),IOS开发中如何设置手机短信验证码

嘿嘿..sdk是别人的,我只是下载来集成一下. smssdk下载网站:http://www.mob.com/(也有其他很多网站有类似SDK,譬如https://www.juhe.cn/等等,可以自行百度,我在这里就演示一下MOB官网的) 此网站号称smssdk免费,可是进去一看........ 每天免费20条,上限登记了才永久免费.不多说了,开始...... 官网集成文档http://wiki.mob.com/ [1~3步]我就截图官方文档了,傻瓜式操作 [4.1]:先看官网说明: [4.2]再

Android实现基于ZXing快速集成二维码扫描功能

二维码扫描现在是一直比较多的应用场景,android的开源项目ZXing提供了完整.成熟的解决方案,如果仅仅是出于快速开发的目的,可以根据自己的项目需要,把ZXing官方提供的项目稍加裁剪,就可以快速的集成到自己的项目中.下面详细演示和介绍如何实现基于ZXing官方提供的源码,快速集成二维码扫描功能到自己项目中的解决方案. (第1步):到ZXing官方主页下载最新的项目代码包,ZXing在github的官方主页:https://github.com/zxing,下载后解压.解压后根目录下有若干项

android-使用环信SDK开发即时通信功能(附源码下载)

最近项目中集成即时聊天功能,挑来拣去,最终选择环信SDK来进行开发,选择环信的主要原因是接口方便.简洁,说明文档清晰易懂.文档有Android.iOS.和后台服务器端,还是非常全的. 环信官网:http://www.easemob.com/ 本篇文章目的主要在于说明环信Demo如何实现即时通信的.我在集成环信SDK到我们自己开发的app之前,研究了一下环信demo的代码,看了两三天的样子,基本搞清楚来龙去脉,但是只是清楚来龙去脉,要说到里面的细节可能得深一步研究,但是这就够了,已经可以把demo

简述MySQL分片中快速数据迁移

推荐阅读:MySQL 数据库跨操作系统的最快迁移方法 mysql 备份与迁移 数据同步方法 操作实践背景: travelrecord表定义为10个分片,尝试将10个分片中的2个分片转移到第二台MySQL上,并完成记录, 要求最快的数据迁移做法,中断业务时间最短 思路一利用mysqldump: 在这里我们只针对mysql innodb engine,而且配置bin-log的数据库进行分析.因为是将10个分片中的两个分片进行迁移,其实就是数据库的迁移过程,就是将10个数据库中的两个数据迁移到另外一台

手机短信轰炸(图)

手机和网络早已密不可分,通过网络,可以直接发送信息到手机上,只是现在已经没有 免费发送短信的网站,如果想通过网站发送短信到手机上,必须先注册用户,确认后才可以 发送信息,只是那样以来,呵呵,发一条信息就是一毛钱,呵呵,我可没那么多钱.呵呵 是不是很纳闷啊,呵呵 好了,我来仔细说说. 首先分析网上可以发送手机短信的网站结构.特别是他们如何确认用户已经注册成功呢. 一般说来有如下步骤: 1.用户认可网站提出的服务协议 2.用户进入注册页面,填写自己的手机号码 3.由服务器接受用户提交的手机号码,并发

java实现发送手机短信

本文主要研究了JAVA语言发送手机,分享给大家,供大家参考,具体内容如下 JAVA发送手机短信,流传有几种方法: (1)使用webservice接口发送手机短信,这个可以使用sina提供的webservice进行发送,但是需要进行注册; (2)使用短信mao的方式进行短信的发送,这种方式应该是比较的常用,前提是需要购买硬件设备,呵呵; (3)使用中国网建提供的SMS短信平台,我的这个小的demo,是基于这个行是发送的. 说明:java实现发送手机短信 /** * 说明:java实现发送手机短信

python实现发送和获取手机短信验证码

首先为大家分享python实现发送手机短信验证码后台方法,供大家参考,具体内容如下 1.生成4位数字验证码 def createPhoneCode(session): chars=['0','1','2','3','4','5','6','7','8','9'] x = random.choice(chars),random.choice(chars),random.choice(chars),random.choice(chars) verifyCode = "".join(x) s

asp.net中几种常用的身份验证方法总结

前言 在B/S系统开发中,经常需要使用"身份验证".因为web应用程序非常特殊,和传统的C/S程序不同,默认情况下(不采用任何身份验证方式和权限控制手段),当你的程序在互联网/局域网上公开后,任何人都能够访问你的web应用程序的资源,这样很难保障应用程序安全性.通俗点来说:对于大多数的内部系统.业务支撑平台等而言,用户必须登录,否则无法访问和操作任何页面.而对于互联网(网站)而言,又有些差异,因为通常网站的大部分页面和信息都是对外公开的,只有涉及到注册用户个人信息的操作,或者网站的后台

感恩节比较实用的经典手机短信30条

感恩节_经典手机短信_30条,方便大家,合适发给朋友.亲人和同事等任何人.祝大家感恩节快乐.: 感恩节就是我告诉你我爱你的时候. 孩子们,感恩节这时刻,我们要说:我们都爱你们. 我不会说什么话,只想对你说我也会帮助别人. 大恩大德,铭记在心. 让我怎样感谢你,当我走向你的时候,我原想收获一缕春风,你却给了我整个春天. 滴水之恩,来日我当涌泉相报. 患难见真知,谢谢你帮我度过难关! 感谢的话毋宁多言,总之,你是我一生的知己好友! 天地间有一种东西叫雪,从天而降,落地而化:人世间有一种东西叫爱,自吸

Android利用zxing快速集成二维码扫描的实例教程

前言 大家应该都还记得,以前的我们常见的都是条形扫码,自从微信使用二维码扫描后,现在市场上基本都用二维码扫描,基本上每一个项目都会有一个二维码扫描,这篇就简单快速的实现一个扫描效果,让我们对二维码的扫描有一个初步的认识和让我们的项目可以快速的集成二维码扫描的功能.下面话不多说了,来一起看看详细的介绍吧. 实现方法: 1.首先我们需要导入一些依赖库,在我们的gradle文件里 2.集成之后我们就可以直接用了,代码很简单. 通过调用这些方法我们就可以实现扫描,这里说一下这些方法的作用,setDesi