UI进阶之模拟时钟指针案例
2015-12-04 15:56
1261 查看
前言:在看到这个案例后,自己先要对它产生基本的认知.就是做这个案例需要用到那些知识,先在脑海里产生一个框架,以及对于一些知识的运用,知识点的串联.还有就是看到案例之后,不要盲目的去敲代码,要先理清思路,只要思路顺了,代码很快就可以搞定.
CALayer介绍
1.在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本框、一个Label,一 个图片等等,这些都是UIView.2.其实 UIView之所以能够显示到屏幕上面,完全是因为他内部存在图层Layer.
3.在创建UIView时,UIView会自动创建一个图层(Layer),就是UIView的Layer属性.
4.当UIView需要显示到屏幕上面时,系统会自动调用drawRect方法进行绘图,并且会将所有内容绘制在自己的图层 上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示.
5.UIView本身不具备显示功能,是它内部的层才有显示功能.
6.CALayer的常见属性:
@property CGFloat borderWidth;//边框的宽度
@property CGColorRef borderColor;//边框的颜色
@property CGColorRef backgroundColor; //背景颜色
@property float opacity;//透明度
@property CGColorRef shadowColor; //阴影颜色
@property float shadowOpacity;//阴影透明度
@property CGSize shadowOffset;//阴影偏移量
@property CGFloat shadowRadius;//阴影半径
@property(strong) id contents;//CALayer包含的内容(图片之类的)
@property CGFloat cornerRadius;
@property CGRect bounds;
@property CGPoint position;
@property CGPoint anchorPoint;//定位点,锚点
@property CATransform3D transform;
@property(getter=isHidden) BOOL hidden;
@property(readonly) CALayer *superlayer;
@property(copy) NSArray *sublayers;
@property BOOL masksToBounds;//是否裁剪边框
7.使用 CALayer的”定位点(锚点)”实现一个时钟动画(通过 UIView 来实现,目的是为了说明控件的 center 其实就是 CALayer的 position, 通过修改了 position其实就修改了 center 的含义了)
* 注意: 在使用 Quartz2D 绘图的时候, 对绘图上下文的旋转是对坐标系的旋转, 通过 UI 控件的 transform 对控件做旋转是按照 Center 来旋转的。
* 注意: 控件的 center 属性, 其实就是对应的 CALayer的 postion。所以控件的 center并不是永远表示控件的中心点。
解决不准确的问题:(我试验后延迟了一秒,很不容易发现)
• 通过 NSTimer 实现的动画可能造成卡顿、不连贯的情况(NSTimer 不准确)
• CADisplayLink 表示”显示连接”, 与显示器的刷新频率相关。
• 显示器每秒钟刷新60次(60HZ)(电视新闻上拍的电脑显示器就不清楚,原因刷新频率不一样)
• 通过 CADisplayLink 来解决
不说那么多啦,直接上代码
#import "ViewController.h" @interface ViewController () @property (nonatomic, weak) UIView * secondView;//秒针 @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //1.创建表盘 CALayer * clockLayer = [CALayer layer]; //1.1设置大小和位置 clockLayer.bounds = CGRectMake(0, 0, 150, 150); clockLayer.position = self.view.center; //1.2设置内容图片(contents包含图片,先设置[UIImage imageNamed:@"clock"].CGImage,这时系统会提示 Implicit conversion of C pointer type 'CGImageRef _Nullable' (aka 'struct CGImage *') to Objective-C pointer type 'id _Nullable' requires a bridged cast,这时不要害怕,就点击__bridge id _Nullable,意思是需要进行桥连,就OK啦); clockLayer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"clock"].CGImage); //1.3把时钟图层添加到视图上面 [self.view.layer addSublayer:clockLayer]; //2.创建秒针 UIView * secondView = [[UIView alloc] init]; //2.1设置秒针的大小和位置 secondView.bounds = CGRectMake(0, 0, 1, 50); secondView.center = self.view.center; //2.2修改锚点(一般锚点默认为CGPointMake(0.5,0.5),这里需要改变y值即可) secondView.layer.anchorPoint = CGPointMake(0.5, 1); //2.3设置颜色 secondView.backgroundColor = [UIColor redColor]; [self.view addSubview:secondView]; self.secondView = secondView; //开启定时器 // NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fire) userInfo:nil repeats:YES]; // [timer fire]; //3.连接CADispalyLink CADisplayLink * link = [CADisplayLink displayLinkWithTarget:self selector:@selector(fire)]; //3.1添加到主运行循环 [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; } //触发方法 - (void) fire { //1.获取当前日历(类方法 + (NSCalendar *)currentCalendar; // user's preferred calendar用户推荐的日历) NSCalendar * currentCalendar = [NSCalendar currentCalendar]; //2.获取当前时间 NSDate * currentDate = [NSDate date]; //3.获取时间的一部分 NSDateComponents * components = [currentCalendar components:NSCalendarUnitSecond fromDate:currentDate]; //4.获取当前秒 NSInteger second = components.second; //5.获取当前秒针要旋转的弧度 CGFloat angle = 2 * M_PI * second / 60 ; //6.让秒针转起来 // self.secondView.transform = CGAffineTransformRotate(self.secondView.transform, angle); self.secondView.transform = CGAffineTransformMakeRotation(angle); }
这是我运行的截图
*搭建完时钟后的截图*搭建完秒针后的截图
*全部搞定后的截图
相关文章推荐
- GUI - Web前端开发框架
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 评价ui设计作品好坏的八个标准(界面/交互设计研究)
- 关于指针的一些事情
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- C# Pointer指针应用实例简述
- 为Yahoo! UI Extensions Grid增加内置的可编辑器
- C++智能指针实例详解
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- Cocos2d-x UI开发之文本类使用实例
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- 详解C++中的指针、数组指针与函数指针
- C++中字符串以及数组和指针的互相使用讲解