CAAnimation持续时间未应用

时间:2009-12-02 19:27:30

标签: iphone animation core-animation calayer

我正在应用CAAnimation在屏幕上和屏幕外移动工具栏。

当我触摸超级视图时,会触发以下方法:

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [UIView beginAnimations:kViewerToggleToolbarAnimation context:nil];
    if (self.viewerToolbarView.isVisible) {
        self.viewerToolbarView.frame = CGRectMake(0, self.frame.size.height, self.viewerToolbarView.frame.size.width, self.viewerToolbarView.frame.size.height);
        self.viewerToolbarView.isVisible = NO;
    }
    else {
        self.viewerToolbarView.frame = CGRectMake(0, self.frame.size.height - kUIToolbarHeight, self.viewerToolbarView.frame.size.width, self.viewerToolbarView.frame.size.height);
        self.viewerToolbarView.isVisible = YES;
    }
    [UIView commitAnimations];
}

这反过来触发子视图的委托方法:

- (id<CAAction>) actionForLayer:(CALayer *)layer forKey:(NSString *)key {
    id<CAAction> animation = nil;
    if ([key isEqualToString:kViewerToggleToolbarAnimation]) {
        animation = [CABasicAnimation animation];
        if (self.isVisible)
            ((CABasicAnimation*)animation).duration = kViewerToolbarHideAnimationDuration;
        else 
            ((CABasicAnimation*)animation).duration = kViewerToolbarShowAnimationDuration;
        ((CABasicAnimation*)animation).timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
    } 
    else {
        animation = [super actionForLayer:layer forKey:key];
    }
    return animation;
}

常量kViewerToggleToolbarAnimationkViewerToolbarHideAnimationDurationkViewerToolbarShowAnimationDuration在其他地方定义为:

extern NSString * const kViewerToggleToolbarAnimation;
extern CGFloat const kViewerToolbarShowAnimationDuration;
extern CGFloat const kViewerToolbarHideAnimationDuration;
...
NSString * const kViewerToggleToolbarAnimation = @"kViewerToggleToolbarAnimation";
CGFloat const kViewerToolbarShowAnimationDuration = 2.50f;
CGFloat const kViewerToolbarHideAnimationDuration = 2.75f;

问题是我可以在常量文件中增加这些持续时间值,但委托方法会忽略这些持续时间并应用其自身明显短暂的持续时间(大约0.5秒)。

2.5和2.75秒相当长的时间,否则动画会运行,如果它正常工作。

关于触发动画我做错了什么,导致这些持续时间常数被忽略?否则它会编译并运行良好,因此它不会抱怨无法找到常量。

1 个答案:

答案 0 :(得分:0)

不是100%肯定,但如果你在事务中包含显式动画(+beginAnimations:context:隐式执行),它将按照事务的持续时间缩放其持续时间。

尝试在+setAnimationDuration:中通过UIView设置持续时间,而不是在交易块内。