1

Macアプリで、ページコントロールが一部のビューを入れ替える簡単なアニメーション設定があります。必要なページングのようなアニメーションを取得するのに非常に近いですが、少し問題があります。ページングは​​機能し、新しいページは正しく所定の位置にアニメーション化されますが、アニメーションの前の最初のページも新しいページに置き換えられます。早めに新しいページに変更するのではなく、押し出されているビューを同じままにしていきたいと思います。これは、3秒のアニメーション時間に減速された問題を示すビデオです。コードは次のとおりです。

UASourceView *previousSourceView = [self.sourceViewContainer.subviews objectAtIndex:0];
NSInteger previousIndex = [self.sourceViews indexOfObjectIdenticalTo:previousSourceView];

CATransition *pushTransition = [CATransition animation];
[pushTransition setType:kCATransitionPush];
[pushTransition setSubtype:(previousIndex < index) ? kCATransitionFromRight : kCATransitionFromLeft];
[pushTransition setDuration:PANEL_PAGE_SWIPE_ANIMATION_DURATION];
[pushTransition setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[pushTransition setRemovedOnCompletion:YES];

[CATransaction begin];
[self.sourceViewContainer replaceSubview:previousSourceView with:sourceView];
[CATransaction commit];

[sourceView.layer addAnimation:pushTransition forKey:@"push"];

self.sourceViewContainerすべてのアニメーションで新しいサブビューが置き換えられる固定コンテナビューがあります。上記のように、問題は、previousSourceViewがすぐにに置き換えられsourceView 同様にプッシュされることです。すぐに交換をやめるのを手伝ってください。どこが間違っているのですか?

*iOSこのコードはプラットフォームに依存しないため、タグが追加されていることに注意してください。

4

1 に答える 1

1

私はCAAnimationBlocksを使用して同様の問題を解決しました(これはオリジナルのフォークであり、作者は私があまり気にしない方向に移動しました)。

アイデアは、完了ブロックで実際の切り替え(アニメーションなし)を設定して実行することremovedOnCompletionですNO。これはOSXでのみテストされています(すでに完了ブロックをサポートしているiOS用の別のソリューションが必要になる場合があります)。fillModekCAFillModeForwards

これが私のコードの使用例です。チェス盤の駒を動かして、また元に戻します。

CABasicAnimation *moveAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
moveAnimation.fromValue = [NSValue valueWithPoint:[self _pointForSquare:move.from()]];
moveAnimation.toValue = [NSValue valueWithPoint:[self _pointForSquare:move.to()]];
moveAnimation.duration = _animateSpeed / 1000.0;
moveAnimation.autoreverses = YES;
moveAnimation.removedOnCompletion = NO;
moveAnimation.fillMode = kCAFillModeForwards;
moveAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
moveAnimation.completion = ^(BOOL finished)
{
    [pieceLayer removeAnimationForKey:@"movePiece"];
    [self _setPieceLayer:pieceLayer toPiece:piece];
    [pieceLayer setNeedsDisplay];
};

[pieceLayer addAnimation:moveAnimation forKey:@"movePiece"];
于 2012-11-09T14:25:14.807 に答える