27

ビューを上から下にスライドさせようとしています。これは大したことではありません、私はこれに使用CABasicAnimationしました。問題は、ビューを削除したいときです。このアニメーションを使用します。

CABasicAnimation *animation;
animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setDelegate:self];
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(self.view.layer.position.x, 0 - self.view.bounds.size.height / 2)];
animation.fromValue = [NSValue valueWithCGPoint:self.view.layer.position];
animation.autoreverses = NO;
animation.repeatCount = 0;
animation.duration = 0.25;
animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
[self.view.layer  addAnimation:animation forKey:@"moveX"];

これは、ビューを完全にアニメーション化します。しかし、アニメーションが終了すると、私のビューが再び表示されます。だから私はこの行を追加しました:

[self.view removeFromSuperview];

これによりビューが削除されますが、アニメーションはありません。そこで、このデリゲートに削除コードを追加することにしました。

-(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag

これで、アニメーションが機能し、ビューが消えますが、アニメーションの後でビューが表示され、次にanimationDidStopデリゲートが呼び出されてビューが消えるような、ビューの表示と非表示が速くなることがあります。これは明らかにひどいことです。私は何が間違っているのですか?

4

6 に答える 6

66

これらのプロパティを設定したい場合があります。これらにより、アニメーションの最後にプレゼンテーションが保持されます。

animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;

次に、「animationDidStop:」メソッドを使用して、アニメーションの最後でビューを削除できます。

-(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag {
    if (animation == [containerView.layer animationForKey:@"moveX"]) {
        // remove view here, add another view and/or start another transition
    }
}
于 2008-10-30T16:05:38.563 に答える
15

Apple のサンプル「MoveMe」によると、これ ( removedOnCompletion ) は機能するはずですが、機能していないようです。

したがって、コードの後に​​次の行を追加します。

[self.view.layer  addAnimation:animation forKey:@"moveX"];
self.view.layer.position = [animation.toValue CGPointValue];

これにより、アニメーションの実行後にレイヤーが適切に配置されます。

于 2008-10-22T22:41:15.470 に答える
3

アニメーション グループで複数のアニメーションを実行すると、この問題が発生しました。個々のアニメーションではなく、アニメーション グループ自体にいくつかのプロパティを設定する必要がありました。

CAAnimationGroup *animGroup = [CAAnimationGroup animation];

// MAKE SURE YOU HAVE THESE TWO LINES.
animGroup.removedOnCompletion = NO;
animGroup.fillMode = kCAFillModeForwards;

animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, nil];
animGroup.duration = tAnimationDuration;
[tImageView.layer addAnimation:animGroup forKey:nil];
于 2013-02-25T20:02:23.563 に答える
0

Rob が提案するように、ビューを非表示に設定する必要があります。

プロパティのプロパティについては、既にコードに含まれているように、ObjC 2.0 スタイルに固執します。

set.view.hidden = YES;
于 2008-10-22T17:04:48.440 に答える
0

これも私を噛んだ。アニメーションの removedOnCompletion フラグを NO に設定します。デフォルトは YES です。これは、アニメーションが完了すると削除され、ビューが初期状態に戻ることを意味します。

于 2008-10-22T17:31:43.877 に答える
-2

ビューの非表示プロパティを YES に設定できますか?

私はそれが次のようになると思います:

self.view.hidden = YES;

しかし、それは次のようになります。

[self.view setHidden:YES];

私は、プロパティのプロパティにアクセスする適切な方法を理解するのにかなり不自由であることがわかりました。

于 2008-10-22T16:46:16.760 に答える