ios - 終了 - uiview.animate options




UIViewアニメーションをキャンセルしますか? (10)

iOS 4以降では、2番目のアニメーションでUIViewAnimationOptionBeginFromCurrentStateオプション使用して 、最初のアニメーションを短くカットします。

例として、アクティビティー・インディケーターを持つビューがあるとします。 潜在的に時間のかかるアクティビティが始まる間にアクティビティインジケータをフェードインし、アクティビティが終了するとフェードインします。 以下のコードでは、アクティビティインジケータが表示されたビューをactivityViewと呼びactivityView

- (void)showActivityIndicator {
    activityView.alpha = 0.0;
    activityView.hidden = NO;
    [UIView animateWithDuration:0.5
                 animations:^(void) {
                     activityView.alpha = 1.0;
                 }];

- (void)hideActivityIndicator {
    [UIView animateWithDuration:0.5
                 delay:0 options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^(void) {
                     activityView.alpha = 0.0;
                 }
                 completion:^(BOOL completed) {
                     if (completed) {
                         activityView.hidden = YES;
                     }
                 }];
}

それが進行中にUIViewアニメーションをキャンセルすることは可能ですか? あるいは、私はCAレベルに落とさなければなりませんか?

つまり、私はこのようなことをやったことがあります(アニメーションアクションを終了することもできます)。

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];

しかし、アニメーションが完了してアニメーションが終了したイベントを取得する前に、そのアニメーションをキャンセルしたい(それを省略)。 これは可能ですか? 周りをグーグルで回っている人は、何の答えも出さずに同じ質問をしている人が2,3人いると思っています。


この返答をお返しして申し訳ありませんが、iOS 10ではちょっと変わったところで取り消しが可能ですし、正常にキャンセルすることもできます。

iOS 10以降、 UIViewPropertyAnimatorアニメーションをキャンセルできます!

UIViewPropertyAnimator(duration: 2, dampingRatio: 0.4, animations: {
    view.backgroundColor = .blue
})
animator.stopAnimation(true)

trueを渡すとアニメーションがキャンセルされ、キャンセルした場所で停止します。 完了メソッドは呼び出されません。 ただし、falseを渡すと、アニメーションを終了する責任があります。

animator.finishAnimation(.start)

アニメーションを終了して現在の状態(.current)または初期状態(.start)または終了状態(.end)に進むことができます。

ところで、後で一時停止して再起動することもできます...

animator.pauseAnimation()
animator.startAnimation()

注:急なキャンセルを望まない場合は、アニメーションを元に戻したり、一時停止後にアニメーションを変更することもできます。


アニメーションをキャンセルするには、現在アニメーション化されているプロパティをUIViewアニメーションの外に設定するだけです。 それはどこでもアニメーションを停止し、UIViewは今定義した設定にジャンプします。


スティーブンダーリントンのソリューションの迅速なバージョン

UIView.beginAnimations(nil, context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(0.1)
// other animation properties

// set view properties
UIView.commitAnimations()

ビュープロパティの代わりに定数を変更して制約をアニメーション化する場合、他のメソッドはiOS 8で動作しません。

アニメーションの例:

self.constraint.constant = 0;
[self.view updateConstraintsIfNeeded];
[self.view layoutIfNeeded];
[UIView animateWithDuration:1.0f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     self.constraint.constant = 1.0f;
                     [self.view layoutIfNeeded];
                 } completion:^(BOOL finished) {

                 }];

溶液:

制約の変更やそのサブレイヤの影響を受けるビューのレイヤーからアニメーションを削除する必要があります。

[self.constraintView.layer removeAllAnimations];
for (CALayer *l in self.constraintView.layer.sublayers)
{
    [l removeAllAnimations];
}

上記のどれも私のために解決されていませんが、これはUIViewました: UIViewアニメーションはプロパティをすぐに設定し、アニメーション化します。 プレゼンテーションレイヤーがモデル(設定されたプロパティ)と一致すると、アニメーションが停止します。

私は自分の問題を解決しました。「私はあなたが見える場所からアニメートしたい」(「あなた」という意味のビュー)です。 それが欲しいなら、

  1. QuartzCoreを追加します。
  2. CALayer * pLayer = theView.layer.presentationLayer;

位置をプレゼンテーションレイヤーに設定する

UIViewAnimationOptionOverrideInheritedDurationを含むいくつかのオプションを使用します

しかし、Appleのドキュメンテーションはあいまいなので、使用したときに他のアニメーションを実際に上書きするか、単にタイマーをリセットするかはわかりません。

[UIView animateWithDuration:blah... 
                    options: UIViewAnimationOptionBeginFromCurrentState ... 
                    animations: ^ {
                                   theView.center = CGPointMake( pLayer.position.x + YOUR_ANIMATION_OFFSET, pLayer.position.y + ANOTHER_ANIMATION_OFFSET);
                   //this only works for translating, but you get the idea if you wanna flip and scale it. 
                   } completion: ^(BOOL complete) {}];

それは今のところまともな解決策でなければなりません。


特定のビューのすべてのアニメーションを直ちに停止する最も簡単な方法は、次のとおりです。

QuartzCore.frameworkにプロジェクトをリンクします。 あなたのコードの始めに:

#import <QuartzCore/QuartzCore.h>

今、ビューの死んでいるすべてのアニメーションをトラックで止めたいときは、これを言う:

[CATransaction begin];
[theView.layer removeAllAnimations];
[CATransaction commit];

ミドルラインはすべて単独で動作しますが、ランループが終了するまでに遅延があります(「再描画の瞬間」)。 この遅延を防ぐには、図のように明示的なトランザクションブロックでコマンドをラップします。 この動作は、現在のランループのこのレイヤーに対して他の変更が行われていない場合にのみ有効です。


状態を元の状態または最終状態に戻すことなくアニメーションを一時停止するには:

CFTimeInterval paused_time = [myView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
myView.layer.speed = 0.0;
myView.layer.timeOffset = paused_time;

私は同じ問題を抱えています; APIには、特定のアニメーションを取り消すものはありません。 ザ

+ (void)setAnimationsEnabled:(BOOL)enabled

すべてのアニメーションを無効にするので、私にとってはうまくいきません。 2つのソリューションがあります。

1)アニメーションオブジェクトをサブビューにします。 次に、そのビューのアニメーションを取り消す場合は、そのビューを削除するか非表示にします。 非常にシンプルですが、アニメーションなしでサブビューを再表示する必要がある場合は、アニメーションを表示しないで再作成する必要があります。

2)アニメーションを1つだけ繰り返し、必要に応じてデリゲートセレクタを使ってアニメーションを再開させます。

-(void) startAnimation {
NSLog(@"startAnim alpha:%f", self.alpha);
[self setAlpha:1.0];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationRepeatCount:1];
[UIView setAnimationRepeatAutoreverses:YES];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(pulseAnimationDidStop:finished:context:)];
[self setAlpha:0.1];
[UIView commitAnimations];
}

- (void)pulseAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
if(hasFocus) {
    [self startAnimation];
} else {
    self.alpha = 1.0;
}
}

-(void) setHasFocus:(BOOL)_hasFocus {
hasFocus = _hasFocus;
if(hasFocus) {
    [self startAnimation];
}
}

2)の問題は、アニメーションが現在のアニメーションサイクルを終了するのを遅らせることです。

お役に立てれば。


CALayer * pLayer = self.layer.presentationLayer;
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView animateWithDuration:0.001 animations:^{
    self.frame = pLayer.frame;
}];






uiviewanimation