小编rom*_*rom的帖子

为什么动画自定义CALayer属性会导致其他属性在动画期间为零?

我有一个自定义CALayer(比如CircleLayer),包含自定义属性(半径和色调).该图层在其drawInContext:方法中呈现自身.

- (void)drawInContext:(CGContextRef)ctx {
    NSLog(@"Drawing layer, tint is %@, radius is %@", self.tint, self.radius);

    CGPoint centerPoint = CGPointMake(CGRectGetWidth(self.bounds)/2, CGRectGetHeight(self.bounds)/2);

    CGContextMoveToPoint(ctx, centerPoint.x, centerPoint.y);
    CGContextAddArc(ctx, centerPoint.x, centerPoint.y, [self.radius doubleValue], radians(0), radians(360), 0);
    CGContextClosePath(ctx);

    /* Filling it */
    CGContextSetFillColorWithColor(ctx, self.tint.CGColor);
    CGContextFillPath(ctx); 
}
Run Code Online (Sandbox Code Playgroud)

我希望半径可以动画,所以我已经实现了

+ (BOOL)needsDisplayForKey:(NSString *)key {
    if ([key isEqualToString:@"radius"]) {
        return YES;
    }
    return [super needsDisplayForKey:key];
}
Run Code Online (Sandbox Code Playgroud)

动画的执行方式如下:

CABasicAnimation *theAnimation=[CABasicAnimation animationWithKeyPath:@"radius"];
theAnimation.duration=2.0;
theAnimation.fromValue=[NSNumber numberWithDouble:100.0];
theAnimation.toValue=[NSNumber numberWithDouble:50.0];
theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

[circleLayer addAnimation:theAnimation forKey:@"animateRadius"];

circleLayer.radius = [NSNumber numberWithDouble:50.0];
Run Code Online (Sandbox Code Playgroud)

drawInContext:在动画期间按预期调用以重绘圆圈,但是一旦动画开始,色调就会设置为nil,并在动画结束时恢复到原始值.

我得出结论,如果我想动画一个自定义属性并希望其他属性在动画期间保持其值,我也必须为它们设置动画,我发现它根本不方便.

目的不是增长/缩小一个圆圈,我知道我可以使用转换.它只是用一个简单的例子来说明动画单个自定义属性的问题,而不必为所有其他属性设置动画.

我做了一个简单的项目来说明这个问题,你可以在这里找到: 说明问题的示例项目 …

iphone null animation properties calayer

16
推荐指数
1
解决办法
2908
查看次数

在CATransaction中为自定义CALayer属性设置动画

到目前为止,我已经能够动画我的CALayer子类的自定义属性,感谢+ (BOOL)needsDisplayForKey:(NSString *)keyCABasicAnimations.

然而事实证明链接动画可能变得非常棘手,因为所有代码都在一个animationDidStop:finished:方法中进行.

所以我想切换到,CATransactions因为它们支持新的块语法,这将允许我指定一个完成块+ (void)setCompletionBlock:(void (^)(void))block.

但在我看来,它CATransaction只能为所谓的"动画属性"制作动画,并且它不适用于我的自定义图层属性,即使needsDisplayForKey:实现了该方法.

那么有没有办法在CALayer动画制作自定义属性CATransaction

编辑: 我的意图是做一些事情:

[CATransaction begin];
[CATransaction setAnimationDuration:0.5];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[CATransaction setCompletionBlock:^{
    NSLog(@"blabla");
}];

myLayer.myProperty = newValue;

[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

myProperty值的更新newValue未设置动画.我试图actionForLayer:forKey:在管理myLayer的视图中实现 返回一个CABasicAnimation.但actionForLayer:forKey:永远不会用钥匙打电话myProperty.是的,myLayer它不是view.layer一个子层,是的,我将委托设置myLayer为包含视图.

iphone core-animation properties catransaction

8
推荐指数
1
解决办法
1万
查看次数