4

上から下へ、またはその逆にアニメーション化するいくつかのUILabelを持つUIViewがあります。一種のAutoqueとしましょう:)私は2つの関数を使用します:

-(void)goUp 
-(void)goDown 

これらの関数は、UIViewアニメーションを必要な位置で開始します。どちらの関数にも、最後に他の関数を呼び出すAnimationDidStopSelectorが定義されています。これはすべてスムーズに機能します。

touchesBeganを使用して画面に触れるとき、現在のアニメーションを一時停止し、touchesMovedイベントを使用してUIViewの垂直位置を変更したいと思います。touchesEndedで、アニメーションを必要な終了位置に再開したいと思います。

そうするための適切な方法は何でしょうか?

トーマス

4

5 に答える 5

7

アニメーションを一時停止および停止するために、UIView にカテゴリを作成しました。

@interface UIView (AnimationsHandler)

- (void)pauseAnimations;
- (void)resumeAnimations;

@end

@implementation UIView (AnimationsHandler)
- (void)pauseAnimations
{
    CFTimeInterval paused_time = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    self.layer.speed = 0.0;
    self.layer.timeOffset = paused_time;
}

- (void)resumeAnimations
{
    CFTimeInterval paused_time = [self.layer timeOffset];
    self.layer.speed = 1.0f;
    self.layer.timeOffset = 0.0f;
    self.layer.beginTime = 0.0f;
    CFTimeInterval time_since_pause = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil] - paused_time;
    self.layer.beginTime = time_since_pause;
}
于 2014-11-01T15:42:14.657 に答える
4

実際、すべてのアニメーションを実装した後UIView、ウラジミールがリンクした質問への回答に基づいて、アニメーションを一時停止することもできます。その後、アニメーションを追加した後CABasicAnimations、アニメーションを一時停止することもできます。一時停止しましたが、どちらも機能しませんでした。これは関連するリンクです。UIViewCABasicaAnimationsUIView

ビュー全体を一時停止したかったので、一時停止self.view.layerするレイヤーとして通過しました。しかし、のことを知らない人のために、あなたが一時停止したいものをCALayer渡してください。view.layerそれぞれUIViewにがありますCALayerので、あなたに関連する一番上のものを渡しview.layerてください。トーマスの場合、あなた自身の答えに基づいて、あなたは一時停止するために通過したいと思うように思われるでしょうself.containerView.layer

これが機能する理由は、UIViewアニメーションがCoreAnimationの上のレイヤーにすぎないためです。少なくともそれは私の理解です。

これが、アニメーションを一時停止する方法を考えている将来の人々に役立つことを願っています。

于 2011-01-13T06:03:22.483 に答える
2

Vladimir、CAAnimations に関する質問は理にかなっています..しかし、「一時停止」する方法を見つけたので、UIView アニメーションを使い続けることができました。

CALayer *pLayer = [self.containerView.layer presentationLayer];
CGRect frameStop = pLayer.frame;
pausedX = frameStop.origin.x;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.01];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];     
// set view properties

frameStop.origin.x = pausedX;
self.containerView.frame = frameStop;
[UIView commitAnimations];

ここで行っているのは、presentationLayer を使用して、アニメーション ビューの現在の x 値を調べることです。その後、元のアニメーションを上書きする新しいアニメーションを実行します。これには必ず AnimationBeginsFromCurrentstate:YES を設定してください。これにより、元のアニメーションがキャンセルされ、アニメーション ビューが目的の位置 (自動的に行われます) ではなく、アニメーション プロセスの現在の位置に配置されます。

これが他の人にも役立つことを願っています! :)

于 2010-07-09T12:32:41.927 に答える
1

UIView を直接使用できるかどうかはわかりませんが、代わりにビューの CALayers をアニメーション化することは間違いなく可能です。CAAnimations の一時停止と再開に関するこの質問を参照してください。

于 2010-07-09T08:39:13.877 に答える
0

それがあなたを助けることを願っています。

- (void)goUP{
    CFTimeInterval pausedTime = [self.layer timeOffset];
    self.layer.speed = 1.0;
    self.layer.timeOffset = 0.0;
    self.layer.beginTime = 0.0;
    CFTimeInterval timeSincePause = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    self.layer.beginTime = timeSincePause;
}

- (void)goDown{
    CFTimeInterval pausedTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    self.layer.speed = 0.0;
    self.layer.timeOffset = pausedTime;
}

Layer animate を呼び出すと、すべてのレイヤー ツリーとサブモード レイヤー アニメーションに影響します。

于 2014-06-12T14:01:00.827 に答える