iOS Core Animation(五)- 隐式动画

CATransaction事务

动画执行的时间取决于当前事务的设置,动画类型取决于图层行为

  • begin 入栈([CATransaction setDisableActions:YES];)
  • commit 出栈
  • setAnimationDuration 设置当前事务的动画时间(默认0.25秒)
  • setCompletionBlock 添加动画完成的代码块
    [CATransaction begin];
    [CATransaction setAnimationDuration:1.0];
    [CATransaction setCompletionBlock:^{
        CGAffineTransform transform = self.colorLayer.affineTransform;
        transform = CGAffineTransformRotate(transform, M_PI_2);
        self.colorLayer.affineTransform = transform;
    }];
    CGFloat red = arc4random() / (CGFloat)INT_MAX;
    CGFloat green = arc4random() / (CGFloat)INT_MAX;
    CGFloat blue = arc4random() / (CGFloat)INT_MAX;
    self.colorLayer.backgroundColor = [UIColor colorWithRed:red
                                                      green:green
                                                       blue:blue
                                                      alpha:1.0].CGColor;
    [CATransaction commit];
  • UIView关联的图层禁用了隐式动画,对图层做动画的唯一方法就是使用UIView的动画函数([UIView beginAnimations:nil context:nil];[UIView commitAnimations];)或者继承UIView,覆盖-actionForLayer:forKey:方法,或者使用显示动画。(可直接使用方法:+animateWithDuration:animations:)
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1];
    CGFloat red = arc4random() / (CGFloat)INT_MAX;
    CGFloat green = arc4random() / (CGFloat)INT_MAX;
    CGFloat blue = arc4random() / (CGFloat)INT_MAX;
    self.colorLayer.backgroundColor = [UIColor colorWithRed:red
                                                      green:green
                                                       blue:blue
                                                      alpha:1.0].CGColor;
    [UIView commitAnimations];
  • 对于单独存在的图层,我们可以通过实现图层的actionForLayer:forKey:委托方法,或者提供一个actions字典来控制隐式动画(CATransition推进过渡)
    self.colorLayer = [CALayer layer];
    self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
    self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
    CATransition *transition = [CATransition animation];
    transition.type = kCATransitionPush;
    transition.subtype = kCATransitionFromLeft;
    self.colorLayer.actions = @{@"backgroundColor": transition};
    [self.layerView.layer addSublayer:self.colorLayer];
  • 呈现图层 presentationLayer
    呈现图层实际是对模型图层的复制,它的属性值代表任何指定时刻的当前外观效果,即你可以通过呈现图层的值来获取当前屏幕上真正显示的值
    实现基于定时器的动画,可以通过呈现图层获取某一时刻的图层位置
    如果想让做动画的图层响应用户输入,可以使用呈现图层调用-hitTest:判断是否被点击

上一篇:iOS Core Animation(四)
下一篇:iOS Core Animation(六)

你可能感兴趣的:(iOS Core Animation(五)- 隐式动画)