我正在尝试使用隐式动画在CALayer上设置自定义属性:
[UIView animateWithDuration:2.0f animations:^{
self.imageView.myLayer.myProperty = 1;
}];
In -actionForKey:方法我需要返回动画来处理插值。当然,我必须以某种方式告诉动画如何检索动画的其他参数(即持续时间和计时功能)。
- (id<CAAction>)actionForKey:(NSString *)event
{
if ([event isEqualToString:@"myProperty"])
{
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"myProperty"];
[anim setFromValue:@(self.myProperty)];
[anim setKeyPath:@"myProperty"];
return anim;
}
return [super actionForKey:event];
}
}
关于如何实现这一点的任何想法?我尝试在图层属性中查找动画,但找不到任何有趣的内容。我也对图层动画有问题,因为actionForKey:在动画之外被调用。
答案 0 :(得分:4)
我估计你有一个自定义属性和#34; myProperty&#34;您添加到UIView的后备层 - 根据Documentation UIView动画块不支持自定义图层属性的动画,并声明需要使用CoreAnimation:
更改视图拥有的图层与更改视图本身相同, 并且您应用于图层属性的任何动画都尊重 当前基于视图的动画块的动画参数。该 对于您自己创建的图层,情况也是如此。自定义图层 对象忽略基于视图的动画块参数并使用 而是默认的核心动画参数。
如果要自定义图层的动画参数 创建时,必须直接使用Core Animation。
此外,文档声称UIView仅支持一组有限的可动画属性 这是:
Views支持一组基本动画,涵盖许多常见任务。 例如,您可以为视图属性或使用的属性设置动画 过渡动画将一组视图替换为另一组视图。
表4-1列出了可动画的属性 - 具有的属性 UIView类的内置动画支持。
你必须为此创建一个CABasicAnimation。
如果在actionForKey中返回CABasicAnimation,则可以使用CATransactions进行某种解决方法:就像那样
[UIView animateWithDuration:duration animations:^{
[CATransaction begin];
[CATransaction setAnimationDuration:duration];
customLayer.myProperty = 1000; //whatever your property takes
[CATransaction commit];
}];
只需将actionForKey:方法更改为
- (id<CAAction>)actionForKey:(NSString *)event
{
if ([event isEqualToString:@"myProperty"])
{
return [CABasicAnimation animationWithKeyPath:event];
}
return [super actionForKey:event];
}
Github中有一些内容,以防您无法查看:https://github.com/iMartinKiss/UIView-AnimatedProperty
答案 1 :(得分:1)
如果您使用以下内容,我认为您无法访问持续时间:
[UIView animateWithDuration:duration animations:^{
}];
您的代码的其他问题是,如果在动画块中调用代码,则UIView的actionForKey:U的实现仅返回CAAnimation对象。否则返回null以关闭动画。在您的实现中,您始终返回CAAnimation,因此将始终对更改为该属性进行动画处理。
你应该用这个:
[CATransaction begin];
[CATransaction setAnimationDuration:duration];
[CATransaction setAnimationTimingFunction:timingFunction];
customLayer.myProperty = 1000; //whatever your property takes
[CATransaction commit];
然后在actionForKey:方法中,使用[CATransaction animationDuration]
和[CATransaction animationTimingFunction]
来检索当前持续时间和计时功能。
答案 2 :(得分:0)
最简单的方法可能是自定义图层中的其他属性,以便在 myProperty 之前设置。像:
self.imageView.myLayer.myTimingFunction = kCAMediaTimingFunctionEaseInEaseOut;
self.imageView.myLayer.myProperty = 1;
和
-(id<CAAction>)actionForKey:(NSString *)event
{
if ([event isEqualToString:@"myProperty"])
{
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"myProperty"];
[anim setFromValue:@(self.myProperty)];
[anim setKeyPath:@"myProperty"];
[anim setTimingFunction:myTimingFunction];
return anim;
}
return [super actionForKey:event];
}
}
如果您想获取参数,例如持续时间,请在
中设置 [UIView animateWithDuration:2.0f ...
所以在这种情况下持续时间= 2.0f
您可以使用 CATransaction 和 valueForKey 。 CATransaction应该返回上下文的特定值。