iOS CoreAnimation 프레임 애니메이션 CAdisplayLink
프레임 애니메이션 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.