2009-12-02 3 views
0

Я применяю CAAnimation для перемещения панели инструментов на экране и вне экрана.Продолжительность CAAnimation не применяется

Когда я коснуться SuperView, что пожары следующий метод:

- (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; 
} 

константы kViewerToggleToolbarAnimation, kViewerToolbarHideAnimationDuration и kViewerToolbarShowAnimationDuration определены в других местах :

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 с довольно заметные длительные времена, когда анимация в противном случае запускалась бы, если бы работала должным образом.

Что я делаю неправильно, чтобы запустить анимацию, которая заставляет эти константы продолжительности игнорироваться? Он иначе компилируется и работает нормально, поэтому он не жалуется, что не может найти константы.

ответ

0

Не уверен на 100%, но если вы переносите явную анимацию в транзакцию (что неявно делает +beginAnimations:context:), она будет масштабировать свою продолжительность по продолжительности транзакции.

Попробуйте установить продолжительность через +setAnimationDuration: в UIView вместо этого внутри блока транзакции.