iOS核心動畫(三個動畫類的使用)

核心動畫(三個動畫類的使用)

#####摘要:執行動畫的本質是改變圖層的屬性git

  • 1.Core Animation能夠在Mac OSX和iOS中使用
  • 2.Core Animation的動畫執行過程都是在後臺操做的,不會阻塞主線程
  • 3.Core Animation是直接做用在CALayer上的,並不是UIView
  • 4.架構 #####1.CABasicAnimation
  • 設置動畫屬性(position),告訴動畫執行怎樣的動畫
  • 設置動畫屬性值改變 toValue 從當前默認的開始,告訴動畫屬性怎麼改變
  • duration:動畫時長
  • 動畫有反彈?取消反彈
    • 1> 執行動畫完畢不要移除
    • 2> 設置動畫填充模式,保持最新的位置。
  • CABasicAnimation只能在兩個值之間作動畫,用CAKeyframeAnimation,實現多個值作動畫
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //開啓動畫
    CABasicAnimation *basic=[CABasicAnimation animation];
    //描述哪一個屬性產生動畫
    basic.keyPath=@"position";
    //設置值
    basic.toValue=[NSValue valueWithCGPoint:CGPointMake(200, 450)];
    //設置動畫完成時候再也不移除動畫
    basic.removedOnCompletion=NO;
    //設置動畫執行完成要保持最新的效果
    basic.fillMode=kCAFillModeForwards;
    //添加動畫
    [self.greenView.layer addAnimation:basic forKey:nil];
}

#####補充:github

  • fillMode屬性值(要想fillMode有效,最好設置removedOnCompletion = NO)
  • kCAFillModeRemoved 這個是默認值,也就是說當動畫開始前和動畫結束後,動畫對layer都沒有影響,動畫結束後,layer會恢復到以前的狀態
  • kCAFillModeForwards 當動畫結束後,layer會一直保持着動畫最後的狀態
  • kCAFillModeBackwards 在動畫開始前,只須要將動畫加入了一個layer,layer便當即進入動畫的初始狀態並等待動畫開始。
  • kCAFillModeBoth 這個其實就是上面兩個的合成.動畫加入後開始以前,layer便處於動畫初始狀態,動畫結束後layer保持動畫最後的狀態

#####2.CAKeyframeAnimation數組

  • values:爲NSArray對象。動畫對象會在指定的時間(duration)內,依次顯示values數組中的每個關鍵幀
  • path:能夠設置一個CGPathRef,讓圖層按照路徑軌跡移動。path只對CALayer的anchorPoint和position起做用。若是設置了path,那麼values將被忽略
- (void)drawRect:(CGRect)rect {
    [self.path stroke];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch=[touches anyObject];
    CGPoint p=[touch locationInView:self];
    self.path=[UIBezierPath bezierPath];
    [self.path moveToPoint:p];
}
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch=[touches anyObject];
    CGPoint p=[touch locationInView:self];
    [self.path addLineToPoint:p];
    [self setNeedsDisplay];
}
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //開啓動畫
//    CAKeyframeAnimation *keyFrame=[[CAKeyframeAnimation alloc]init];
    CAKeyframeAnimation *keyFrame=[CAKeyframeAnimation animation];

    keyFrame.keyPath=@"position";
    keyFrame.path=self.path.CGPath;
    keyFrame.duration=1;
    keyFrame.repeatCount=MAXFLOAT;
    //添加動畫
    [self.subviews.firstObject.layer addAnimation:keyFrame forKey:nil];
}

#####3.CATransition #####3.1圖片 #####3.2代碼架構

static int i=2;
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    if (i>3) {
        i=2;
    }
    NSString *imageName=[NSString stringWithFormat:@"%d",i];
    self.imageView.image=[UIImage imageNamed:imageName];

    CATransition *transaction=[CATransition animation];
    transaction.type=@"pageCurl";
    [self.imageView.layer addAnimation:transaction forKey:nil];
    i++;
}

#####4.CAAnimationGroup #####4.1注意併發

  • 動畫組,是CAAnimation的子類,能夠保存一組動畫對象,將CAAnimationGroup對象加入層後,組中全部動畫對象能夠同時併發運行
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    CAAnimationGroup *animGroups=[CAAnimationGroup animation];
    CABasicAnimation *basic=[CABasicAnimation animation];
    CABasicAnimation *basic2=[CABasicAnimation animation];

    //removedOnCompletion無效果
    basic.keyPath=@"position";
    basic.toValue=[NSValue valueWithCGPoint:CGPointMake(150, 400)];
//    basic.removedOnCompletion=NO;
//    basic.fillMode=kCAFillModeForwards;
    //
    basic2.keyPath=@"transform.scale";
    basic2.toValue=@0.5;
//    basic2.removedOnCompletion=NO;
//    basic2.fillMode=kCAFillModeForwards;

    animGroups.animations=@[basic,basic2];
    animGroups.removedOnCompletion=NO;
    animGroups.fillMode=kCAFillModeForwards;
    [self.redView.layer addAnimation:animGroups forKey:nil];
}

#####5.詳細的源碼地址(如下是github地址)動畫

相關文章
相關標籤/搜索