2014-03-26 36 views
1

我正尝试在自定义类中创建一个动画,该动画将在像所有UIView元素一样的动画块中触发。获取自定义类中的动画持续时间

我的课:

@interface SmileyFace : NSObject 
@property (strong, nonatomic) uicolor* color; 
@end 

我改变了色彩搭配:

[UIView animateWithDuration:3 animations:^{ 
      myView.frame = newFrame; 
      smileyView.color = [uicolor redcolor]; 
     }]; 

现在,在属性颜色的二传手, 我需要找出是否应该动画,并添加一个自定义动画:

-(void)setColor:(UIColor *)color 
{ 
    _color = color; 
    NSLog(@"new frame"); 
    if ([CATransaction animationDuration] > 0) 
     [self changeColor:color withAnimationWithDuration:[CATransaction animationDuration]]; 
    else 
     [self changeColor:color]; 
} 

由于我的对象是一个自定义对象,我不是确定如何访问动画的持续时间。 从CAtransaction,我总是得到0.25作为持续时间。

任何帮助将不胜感激!

+0

SmileyFace为什么不从UIView继承? –

+0

因为它实际上不是一个视图,而是一个通信机制,它不能从UIView继承,但行为非常相似 –

+0

那么动画究竟是如何工作的呢?是什么'presentationSmiley'? –

回答

0

由于视图并未使用事务来完成动画,因此您无法从事务中获取持续时间,因此它使用委托方法向该图层提供动画。这显然不适用于你,因为你的自定义对象不是视图。

可以询问一些其他类似的属性(如的backgroundColor)的作用的观点,看它是否返回CAAnimation在这种情况下,你可以从中读取时间,或者如果它返回在这种情况下你NSNull不应该动画。虽然这会起作用,但我认为这是一个丑陋而且很冒险的解决方案。 (我甚至不会向你展示代码,因为我不想鼓励人们在没有完全理解的情况下这样做(即能够自己编写代码))

既然你的SmileyFace甚至不是一个视图(我不知道你为什么要制作一些甚至不是视图的动画),我认为这是一个更清晰的解决方案,以揭示如果持续时间大于0时可用于触发动画的方法。

CGFloat duration = 3.0; 
[UIView animateWithDuration: duration animations:^{ 
    myView.frame = newFrame; 
    [smileyView setColor:[UIColor redColor] duration:duration]; 
}];