昨天做一个时钟小demo,发现了一些问题.

描述能力有限,我封装好了一个时钟框架,朋友们可以参考      https://github.com/qianlishun/ClockView

                点击这里可以直接下载 Download ZIP

有两种定时器可以用于实现,

在这里我最开始使用了NSTimer

   [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];

  

使用过程中发现会有误差,即读取本地系统时间时这一秒的0.99秒读到定义的表盘上也会是0秒.不过也可以把 scheduledTimerWithTimeInterval  设定的很小来解决.

最后使用了CADisplayLink

  // link默认是1/60 秒执行一次
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateTimer)];
//执行定时器 把定时器放在主运行循环中执行
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

获取系统时间

 // 实例化日历对象
NSCalendar *calendar = [NSCalendar currentCalendar];
// 获取当前时间的秒数
NSDateComponents *comps = [calendar components:NSCalendarUnitSecond fromDate:[NSDate date]]; // 获取当前时间的分钟数
NSDateComponents *minute = [calendar components:NSCalendarUnitMinute fromDate:[NSDate date]]; // 获取当前时间的小时数
NSDateComponents *hour = [calendar components:NSCalendarUnitHour fromDate:[NSDate date]];

根据系统时间设置时钟指针旋转

    //秒针
CGFloat angle = degree2angle(comps.second * /);
secHand.affineTransform = CGAffineTransformMakeRotation(angle); // 分针
CGFloat angleM = degree2angle(minute.minute * /);
minHand.affineTransform = CGAffineTransformMakeRotation(angleM); // 时针
CGFloat angleH = degree2angle(hour.hour * + minute.minute/10.0 * );
hourHand.affineTransform = CGAffineTransformMakeRotation(angleH);

最后,秒针的旋转样式是一秒一跳,于是想做一个扫秒式的旋转.

这种秒针旋转样式是一秒一跳

  写在 定时器的监听方法updateTimer里

#define degree2angle(angle)    ((angle) * M_PI / 180)
CGFloat angle = degree2angle(comps.second * /);
secHand.affineTransform = CGAffineTransformMakeRotation(angle);

如果想设置为扫秒,则使用CGAffineTransformRotate,每次刷新都走很小的一个角度,这样看起来就是连续的扫秒

        secHand.affineTransform = CGAffineTransformRotate(secHand.affineTransform, M_PI * /);

这里因为没有使用根据当前系统的秒数来控制旋转, 所以需要在初始化表盘时将秒针位置也初始化为系统时间

// 初始化秒针
- (void)secHandRoll{
// 实例化日历对象
NSCalendar *calendar = [NSCalendar currentCalendar];
// 获取当前时间的秒数
NSDateComponents *comps = [calendar components:NSCalendarUnitSecond fromDate:[NSDate date]];
CGFloat angle = degree2angle(comps.second * /);
//初始化秒针位置
secHand.affineTransform = CGAffineTransformMakeRotation(angle);
}

iOS时钟,秒针扫秒样式的更多相关文章

  1. iOS 绘制一个表盘时钟,秒针效果可以“扫秒/游走”

    最近自己 也尝试写了一个表盘时钟,初衷源于等车时候一个老奶奶问时间,我打开手机,时间数字对我来说相对敏感,但是老奶奶是看不清的,我想识别 还是看表盘 老远 看时针分针角度就可以识别当前时间. 于是我想 ...

  2. 【Win10】时钟精确到秒

    [Win10]时钟精确到秒 前言 想要桌面右下角的时钟"xx:xx:xx"精确到秒,可以使用绿色免费开源软件Dism++,也可以从该软件的代码中读到方法:用注册表实现. 步骤 进入 ...

  3. iOS 时钟动画

    在iOS开发中,定时器NSTimer并不能够准确的出发,通常使用NSTimer只能控制不需要精确处理的操作,而CADisplayLink就是在每次屏幕刷新时,通知系统.CADisplayLink最大的 ...

  4. ios html5 网页取消默认样式

    ios的的默认样式修改成扁平化的样式 重要的一句css  -webkit-appearance: none;  将样式清除 单数会出现将raido的选择按钮也会消失 所以需要对radio的样式进行重新 ...

  5. IOS第六天(2:10秒倒计时)

    ****************10秒倒计时 #import "HMViewController.h" @interface HMViewController () <UIA ...

  6. IOS下移除按钮原生样式 -webkit-appearance

    IOS环境下的按钮都是经过美化的,但通常我们在设计web app的时候不需要这些看上去老土的样式,所以,去除这些显得很有必要. 下面这句代码就是重置这些样式的: -webkit-appearance: ...

  7. 移除IOS下按钮的原生样式

    写WAP页面的时候  一定要加上这组样式,以避免在IOS下面按钮被系统原生样式影响 input,textarea {outline-style:none;-webkit-appearance:none ...

  8. iOS下移除按钮原生样式

    按钮样式,在 Android 手机浏览器中显示正常,但在 iOS Safari 浏览器中会看到按钮显示为圆角样式,设置 border-radius:0; 也不好使. 这是因为iPhone.iPad 设 ...

  9. 设置DevExpress GridControl控件时间列显示时、分、秒样式

    如题,如果Dev GridControl控件绑定DataTable数据源时,DataTable中的某一列为Date类型时,GridControl默认显示样式只显示当前日期,并不会将时.分.秒显示出来. ...

随机推荐

  1. spring boot jar启动

    1.依赖包输出 记得禁用热加载 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactI ...

  2. 解决Android Studio安装过程中“SDK tools directory is missing”的问题

    "SDK tools directory is missing",这是因为安装时你的计算机无法连接到google的服务器(对google服务器的域名地址解析出问题了),无法从goo ...

  3. NSValue的个人想法

    通过下面的代码,又可以将NSValue转换成CGRect,CGPoint等类型的数值. CGRect imageRect = [[self.lockImageRectArray objectAtInd ...

  4. innerHTML的性能问题

    看到一遍文章When innerHTML isn’t Fast Enough,反应了innerHTML在操作量大了以后的性能下降的问题. 并且给出了一个replaceHTML的函数 function  ...

  5. CSS3实现单行、多行文本溢出(省略号的形式出现)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 登录脚本重构Element

    登录脚本重构Element package com.gubai.selenium; import org.openqa.selenium.By; import org.openqa.selenium. ...

  7. dzzoffice网盘应用有着最强大的团队、企业私有网盘功能,并且全开源无功能限制。

    企业,团队多人使用dzzoffice的网盘应用,灵活并且功能强大. 支持个人网盘,机构部门,群组,并可根据使用情况开启关闭.例如可只开启群组功能.   可通过后缀,标签自定义类型进行快捷筛选   全面 ...

  8. C++ 类中的static成员的初始化和特点

    C++ 类中的static成员的初始化和特点 #include <iostream> using namespace std; class Test { public: Test() : ...

  9. MySQL-04 高级特性

    学习要点 MySQL系统函数 MySQL视图 MySQL存储过程 MySQL自定义函数 MySQL触发器 MySQL事务 MySQL事件 MySQL系统函数 数学函数 获取整数的函数:CEIL(x). ...

  10. xshell通过xftp传输Windows文件到Linux:在输入put后,再摁 TAB 键,可显示当前文件夹的文件

    在输入put后,再摁 TAB 键,可显示当前文件夹的文件 sftp:/home/yan> put $Recycle.Bin\              BluestacksCN\         ...