0

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

定数kViewerToggleToolbarAnimationkViewerToolbarHideAnimationDurationおよび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 秒は、アニメーションが適切に機能していた場合に実行されるかなり長い時間です。

これらの期間定数が無視される原因となるアニメーションの起動について、私は何が間違っていますか? それ以外の場合はコンパイルして正常に実行されるため、定数が見つからないことについて不平を言うことはありません。

4

1 に答える 1

0

100%確実ではありませんが、トランザクションで明示的なアニメーションをラップすると (+beginAnimations:context:暗黙的にラップされます)、トランザクションの期間によって期間がスケーリングされます。

代わりに、トランザクション ブロック内+setAnimationDuration:で期間を設定してみてください。UIView

于 2009-12-03T12:04:51.460 に答える