핵심 애니메이션(Core Animation)

4598 단어
  • xcode5 이후 버전이 아니라면 먼저 추가QuartzCore.framework와 대응하는 프레임워크 도입
  • 개발 단계:
  • 1.일단 CALayer
  • 가 있어야 돼요.
  • 2.CAAnimation 객체를 초기화하고 애니메이션 관련 속성 설정
  • 3.CALayer의addanimation:forKey:방법을 호출하여 CAAnimation 대상을 CALayer에 추가하면 애니메이션을 실행할 수 있습니다
  • 4.CALayer의 removeAnimationForKey: 방법으로 CALayer의 애니메이션을 중지할 수 있음

  • CALayer에서 애니메이션의 일시 중지 및 복원


    OC 구문
    #pragma mark  CALayer 
    -(void)pauseLayer:(CALayer*)layer
    {
        CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    
        //  CALayer 
          layer.speed = 0.0;
        //  CALayer pausedTime 
        layer.timeOffset = pausedTime;
    }
    
    #pragma mark  CALayer 
    -(void)resumeLayer:(CALayer*)layer
    {
        CFTimeInterval pausedTime = layer.timeOffset;
        // 1.  CALayer 
          layer.speed = 1.0;
        // 2.  
          layer.timeOffset = 0.0;
        // 3.  
          layer.beginTime = 0.0;
        // 4.  ( CACurrentMediaTime()-pausedTime)
        CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
        // 5.  ( timeSincePause)
          layer.beginTime = timeSincePause;
    }
    
    

    문법
    import UIKit
    
    extension CALayer {
        func pauseAnimation() {
            let pauseTime = convertTime(CACurrentMediaTime(), fromLayer: nil)
            speed = 0.0
            timeOffset = pauseTime
        }
    
        func resumeAnimation() {
            // 1. 
            let pauseTime = timeOffset
    
            // 2. 
            speed = 1.0
            timeOffset = 0.0
            beginTime = 0.0
    
            // 3. 
            let startTime = convertTime(CACurrentMediaTime(), fromLayer: nil) - pauseTime
            beginTime = startTime
        }
    }
    

    CAKeyframeAnimation의 간단한 사용

  • 키프레임 애니메이션도 CAPropertyAnimation의 하위 클래스이다. CABasicAnimation와는 달리 CABasicAnimation는 한 수치(fromValue에서 다른 수치toValue로만 바꿀 수 있고 CAKeyframeAnimation는 한 NSArray를 사용하여 이 수치를 저장
  • 한다.
  • 속성 설명:
  • values: 위의 NSArray 객체입니다.안의 요소를 키프레임이라고 합니다.애니메이션 대상은 지정한 시간 (duration) 내에values 그룹의 키 프레임
  • 을 순서대로 표시합니다.
  • path: 도면층이 경로 경로에 따라 이동하도록 CGPathRef, CGMutablePathRef를 설정할 수 있습니다.path는 CALayer의anchorPointposition에만 작용한다.path가 설정되어 있으면 values는 무시됩니다
  • .
  • keyTimes: 대응하는 관건 프레임에 대응하는 시간점을 지정할 수 있다. 그 수치 범위는 0에서 1.0이고 키Times의 모든 시간값은values의 모든 프레임에 대응한다.keyTimes를 설정하지 않으면 각 키 프레임의 시간은 균등하게 나뉜다
  • CABasicAnimation는 2개의 키프레임만 있는 CAKeyframeAnimation
  • 으로 볼 수 있다.
    예제 코드
    - (NSArray *)fishArray {
    
        if (_fishArray == nil) {
    
            // 
            NSMutableArray *tempArray = [NSMutableArray array];
            for (int i= 0; i < 10; i++) {
                NSString *name = [NSString stringWithFormat:@"fish%d",i];
                UIImage *image = [UIImage imageNamed:name];
                [tempArray addObject:image];
            }
            _fishArray = tempArray;
        }
        return _fishArray;
    }
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        //  
        self.view.layer.contents = (id)[UIImage imageNamed:@"bg"].CGImage;
    
        // layer
        CALayer *fishL = [CALayer layer];
        fishL.frame = CGRectMake(100, 288, 89, 40);
        fishL.contents = (id)[UIImage imageNamed:@"fish0"].CGImage;
        [self.view.layer addSublayer:fishL];
        self.fishL = fishL;
    
        [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(change) userInfo:nil repeats:YES];
    
    
    
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
        // 
        CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
        anim.keyPath = @"position";
    
        UIBezierPath *path = [UIBezierPath bezierPath];
        [path moveToPoint:CGPointMake(100, 288)];
        [path addLineToPoint:CGPointMake(100, 100)];
        [path addQuadCurveToPoint:CGPointMake(300, 400) controlPoint:CGPointMake(300, 20)];
        [path addLineToPoint:CGPointMake(100, 288)];
        // 
        anim.path = path.CGPath;
        // 
    //    anim.rotationMode = @"autoReverse";
        anim.rotationMode = kCAAnimationRotateAutoReverse;
        // 
        anim.calculationMode = @"cubicPaced";
    
        anim.repeatCount = HUGE;
    
        anim.duration = 5;
    
        // 
        [self.fishL addAnimation:anim forKey:@"fish"];
    
    
    }
    
    static int _fishIndex = 0;
    - (void)change {
        _fishIndex++;
        if (_fishIndex == 10) {
            _fishIndex = 0;
        }
        UIImage *image = self.fishArray[_fishIndex];
        self.fishL.contents = (id)image.CGImage;
    }
    

    좋은 웹페이지 즐겨찾기