在學(xué)習(xí)CADisplayLink之前先來(lái)了解一個(gè)詞 "刷新率"
所謂“刷新率”,指的是屏幕每秒鐘刷新的次數(shù),也叫場(chǎng)頻或垂直掃描頻率,屏幕顯示器上,每個(gè)熒光點(diǎn)都由于受到電子束的擊打而發(fā)光,不過(guò)熒光點(diǎn)發(fā)光的時(shí)間很短,所以要不斷地有電子束擊打熒光粉使之持續(xù)發(fā)光.顯像管內(nèi)部的電子槍在掃描時(shí)是從第一行的最左端至最右端,然后再?gòu)牡诙械淖钭蠖藪呙柚磷钣叶?接下來(lái)是第三行达舒、第四行……直至掃描到右下角,此時(shí)整個(gè)屏幕都已經(jīng)掃描了一遍,也就是完成了一次刷新.理論上講,只要刷新率達(dá)到85Hz,也就是每秒刷新85次,人眼就感覺(jué)不到屏幕的閃爍了,但實(shí)際使用中往往有人能看出85Hz刷新率和100Hz刷新率之間的區(qū)別,所以從保護(hù)眼睛的角度出發(fā),刷新率仍然是越高越好.
CADisplayLinks方法
實(shí)例化一個(gè)CADisplayLink對(duì)象
+(CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel;
把CADisplayLink對(duì)象添加到runloop之后,每當(dāng)屏幕需要刷新的時(shí)候,runloop就會(huì)調(diào)用CADisplayLink綁定的target上的selector
-(void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode;
銷(xiāo)毀計(jì)時(shí)器
-(void)invalidate;
CADisplayLinks屬性
1.duration:只讀屬性,每幀之間的時(shí)間,也就是屏幕每次刷新的時(shí)間間隔(IOS設(shè)備是每秒鐘屏幕刷新60次);
2.frameInterval: 可以讀寫(xiě)的屬性,設(shè)置多少幀調(diào)用一次selector事件,默認(rèn)為1,也就是1幀調(diào)用一次selector事件.iOS設(shè)置IOS設(shè)備是每秒鐘屏幕刷新60次,也就是每秒60幀,那么默認(rèn)就是每秒調(diào)用60次. 例如設(shè)置 frameInterval=2 那么就是每?jī)蓭{(diào)用一次,也就是變成了每秒調(diào)用30次.
3.pause :控制CADisplayLink開(kāi)始和暫停的開(kāi)關(guān)
4.timestamp:只讀屬性 獲取上一次selector被執(zhí)行的時(shí)間
/**
*
CADisplayLink是一個(gè)能讓我們和屏幕的刷新率相同頻率進(jìn)行操作的定時(shí)器
原理:CADisplayLink以特定的模式注冊(cè)到runloop之后,每當(dāng)屏幕需要刷新的時(shí)候,runloop就會(huì)調(diào)用CADisplayLink綁定的target上的selector事件,這時(shí)target可以讀到CADisplayLink的每次調(diào)用的時(shí)間戳,用來(lái)準(zhǔn)備下一幀顯示需要的數(shù)據(jù).
屬性:
(1)duration:只讀屬性,每幀之間的時(shí)間,也就是屏幕每次刷新的時(shí)間間隔(IOS設(shè)備是每秒鐘屏幕刷新60次);
(2)frameInterval: 可以讀寫(xiě)的屬性,設(shè)置多少幀調(diào)用一次selector事件,默認(rèn)為1,也就是1幀調(diào)用一次selector事件.iOS設(shè)置IOS設(shè)備是每秒鐘屏幕刷新60次,也就是每秒60幀,那么默認(rèn)就是每秒調(diào)用60次. 例如設(shè)置 frameInterval=2 那么就是每?jī)蓭{(diào)用一次,也就是變成了每秒調(diào)用30次.
(3)pause :控制CADisplayLink開(kāi)始和暫停的開(kāi)關(guān)
(4)timestamp:只讀屬性 獲取上一次selector被執(zhí)行的時(shí)間
CADisplayLink 不能被繼承
*/
#import "CADisplayLinkController.h"
@interface CADisplayLinkController ()
{
CGFloat _moveY;
}
@property (nonatomic,strong) CADisplayLink *timer;
@property (nonatomic,strong) UIView *moveV;
@end
@implementation CADisplayLinkController
-(UIView *)moveV
{
if (!_moveV) {
_moveV = [[UIView alloc]init];
_moveV.frame = CGRectMake(100, 100, 50, _moveY);
_moveV.backgroundColor = [UIColor redColor];
}
return _moveV;
}
- (void)viewDidLoad {
[super viewDidLoad];
_moveY = 30;
self.view.backgroundColor = [UIColor cyanColor];
[self.view addSubview:self.moveV];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setTitle:@"開(kāi)始" forState:UIControlStateNormal];
[button setTitle:@"暫停" forState:UIControlStateSelected];
button.selected = NO;
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
button.frame = CGRectMake(300, 100, 100, 20);
[self.view addSubview:button];
[button addTarget:self action:@selector(moveClick:) forControlEvents:UIControlEventTouchUpInside];
self.timer = [CADisplayLink displayLinkWithTarget:self selector:@selector(move)];
self.timer.paused = YES;
[self.timer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
-(void)moveClick:(UIButton *)sender
{
sender.selected = !sender.selected;
self.timer.paused = !self.timer.paused;
}
-(void)move
{
_moveY+=5;
if (_moveY>=200) {
_moveY=30;
}
self.moveV.frame = CGRectMake(100, 100, 50, _moveY);
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
最后各位客官 小弟要是哪里有講的不好或者講的不合理的地方請(qǐng)留言告訴我 我會(huì)及時(shí)更正的 謝謝~