CAAnimation длительность не применяется - PullRequest
0 голосов
/ 02 декабря 2009

Я применяю 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;
}

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

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

1 Ответ

0 голосов
/ 03 декабря 2009

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

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

...