iOS CoreAnimation 프레임 애니메이션 CAdisplayLink

본문 참고:http://www.cnblogs.com/kenshincui/p/3972100.html#autoid- 3 - 0 - 0 총결산:
프레임 애니메이션 CAdisplayLink
애니메이션 효과:
runloop 과 결합 하여 화면 새로 고침 을 할 때마다 이 방법 을 실행 합 니 다 (1 초 에 60 에 가 깝 습 니 다)
이 방법 으로 그림 을 업데이트 하거나 layer 의 특정한 상 태 를 업데이트 하여 애니메이션 효 과 를 실현 하고 애니메이션 의 정체 효 과 를 느끼 지 못 합 니 다.
물론 UIImageView 는 animation Images 의 속성 을 설정 한 다음 startAnimating 방법 으로 이 사진 을 재생 합 니 다.
프레임 마다 애니메이션 효 과 를 얻 을 수 있 지만 큰 성능 문제 가 존재 하고 그림 중간 을 설정 하면 제어 할 수 없습니다.
만 들 었 다.
타이머 NSTimer 를 이용 하여 정시 에 그림 을 업데이트 하 는 것 도 프레임 마다 효 과 를 얻 을 수 있 습 니 다. 이 는 여러 개의 그림 을 한꺼번에 불 러 오 는 것 을 해결 할 수 있 습 니 다.
성능 문제, 재생 도 제어 할 수 있 지만 시스템 이 어떤 방법 을 실행 하기 때문에 애니메이션 을 중단 하고 계속 할 수 있 습 니 다.
질문
이 시스템 은 캐 디 스 플레이 링크 대상 을 제공 합 니 다. 캐 디 스 플레이 링크 는 타이머 로 타이머 와 다 릅 니 다.
예, CADIdsplayLink 의 리 셋 주 기 는 화면 과 완전히 일치 합 니 다. 화면 리 셋 주 기 는 초당 60 회 이 므 로 전혀 느끼 지 못 합 니 다.
애니메이션 의 정체 상황
iOS 프로그램 이 실 행 된 후 메시지 순환 에 들 어 갑 니 다.
사용자 의 입력 을 기다 리 며 캐 디 스 플레이 링크 를 주 실행 순환 대기 열 에 추가 한 후 시간 주
기간 은 주 실행 순환 과 일치 하 며, 주 실행 순환 주 기 는 화면 새로 고침 주기 입 니 다. cadidsplayLink 가 주 실행 에 가입 합 니 다.
줄 순환 대기 열 후 목표 방법 을 순환 적 으로 호출 하여 프레임 애니메이션 을 완성 합 니 다.
여기 서 강조 할 수 밖 에 없 는 것 은 프레임 애니메이션 의 성능 이 반드시 낮 지만 일부 사물 에 대한 운동 은 어 쩔 수 없 이 사용 해 야 한 다 는 것 이다.
프레임 애니메이션, 예 를 들 어 사람의 운동 은 고도 로 복잡 한 운동 으로 기본 애니메이션, 관건 적 인 프레임 애니메이션 은 해결 할 수 없다.
라 고 적 었 다.여러분 은 순환 방법 에서 가능 한 한 알고리즘 의 복잡 도 를 낮 추 는 동시에 순환 과정 에서 메모리 봉 을 확보 해 야 합 니 다.
가 급 적 낮다.다음은 한 물고기의 운동 을 예 로 들 어 한 프레임 씩 애니메이션 을 보 여 드 리 겠 습 니 다.
//
//  LinkViewController.m
//  CAKeyframeAnimation
//
//  Created by     on 16/5/26.
//  Copyright © 2016     . All rights reserved.
//

#import "LinkViewController.h"

#define IMAGE_COUNT 10

@interface LinkViewController ()
{
    CALayer *_layer;
    int _index;
    NSMutableArray *_images;
}

@end

@implementation LinkViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //     
    // layer              ---->     
    self.view.layer.contents = (id)[UIImage imageNamed:@"bg"].CGImage;
    
    //         
    _layer = [[CALayer alloc] init];
    _layer.bounds = CGRectMake(0, 0, 87, 32);
    _layer.position = CGPointMake(self.view.center.x, self.view.center.y);
    [self.view.layer addSublayer:_layer];
    
    //           ,       
    _images = [NSMutableArray array];
    for (int i = 0; i < 10; ++i) {
        NSString *imageName = [NSString stringWithFormat:@"fish%i.png", i];
        UIImage *image = [UIImage imageNamed:imageName];
        [_images addObject:image];
    }
    
    //       
    CADisplayLink *displayLink  = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)];
    
    //             
    [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    
    //      
    [self addAnimation];
    
    // Do any additional setup after loading the view.
}

#pragma mark ----         --- >          
-(void)addAnimation
{
    // 1.       
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 430, 600);
    CGPathAddCurveToPoint(path, NULL, 100, 600, 400, 200, -10, 50);
    animation.path = path;
    
   
    
    animation.repeatCount = HUGE_VALF;
    animation.duration = 8.0;
    animation.removedOnCompletion = NO;
    
    [_layer addAnimation:animation forKey:@"fishAnimation"];
    
     CGPathRelease(path);
    
}

#pragma mark ---                (    60 )
- (void)step

{
    //             
    static int a = 0;
    if (++a % 10  == 0) {
        UIImage *image = _images[_index];
        _layer.contents = (id)image.CGImage; //     
        _index = (_index + 1) % IMAGE_COUNT;
    }
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

좋은 웹페이지 즐겨찾기