9

UIView にいくつかのレイヤーを追加して、一種のアニメーションを作成しました。これらのレイヤーは、スクリプトによって表示または非表示に設定されます。

スクリプトは、プロトコルを実装するオブジェクトに基づいています。

// the general protocol for a step
@protocol ActionStep 
-(void) applyForTime:(int)playtime;
-(void) reset;
@end

タイマーで、ステップ オブジェクトを反復処理します。

NSEnumerator* enumerator = [ScriptObjects objectEnumerator];
id obj;

while ( obj = [enumerator nextObject] )
{
  id <ActionStep> step = obj;
  [step applyForTime:currentmilliseconds];
}

1 つのスクリプト オブジェクトは次のオブジェクトです。

@interface LayerStep : NSObject <ActionStep> 
{
  int mTimeOffset;
  CGPoint mOffset;
  float mAlpha;
  LayerObject* mTheLayer;
  bool mPrepared;
}
-(id)initWithLayerObject: (LayerObject*) theLayer Milliseconds:(int) milliseconds     Offset:(CGPoint) offset Alpha:(float)alpha;

@end

最後に、レイヤーにプロトコルを実装します。

-(void) applyForTime:(int)playtime
{
  if ( mPrepared )  // has the step already been executed?
  {
    if ( playtime >= mTimeOffset )
    {
      [mTheLayer setAlpha:mAlpha];     //   AssignedLayer.opacity = alpha;
      [mTheLayer setPosition:mOffset]; //   AssignedLayer.position = offset;
      mPrepared = false;
    }
  }
}

ステップで変更を適用すると、トランジションが発生します。

この移行を無効にする方法はありますか? 現在、CoreAnimation 呼び出しはまったく使用しておらず、プロパティ自体のみを使用しています (コードを参照)。

4

2 に答える 2

36

レイヤーの「アニメーション化可能な」プロパティの 1 つを変更すると、Apple のドキュメントで暗黙的なアニメーションと呼ばれるものが作成されます。

この件に関する Xcode ドキュメントを引用するには:

Core Animation の暗黙的なアニメーション モデルは、アニメート可能なレイヤー プロパティへのすべての変更が段階的かつ非同期的であることを前提としています。動的にアニメーション化されたシーンは、レイヤーを明示的にアニメーション化することなく実現できます。アニメート可能なレイヤー プロパティの値を変更すると、レイヤーは古い値から新しい値への変更を暗黙的にアニメートします。アニメーションの実行中に新しいターゲット値を設定すると、アニメーションは現在の状態から新しいターゲット値に遷移します。

内部では、システムは変更を行う CAAnimation を生成します。

他のポスターが言ったように、 setAnimationDuration を使用してアニメーションを瞬時に発生させることができます。これにより、アニメーションをオフにする効果があります。ただし、システムがまだアニメーションを生成していると思われます。

暗黙的なレイヤーアニメーションをオフにする公式の方法は、使用することです

[CATransaction begin];
[CATransaction setDisableActions: YES];
//layer changes
[CATransaction commit];

編集:

Swift 3 では、このコードは次のようになります。

CATransaction.begin()
CATransaction.setDisableActions(true)
//layer changes
CATransaction.commit()
于 2012-04-14T22:55:41.827 に答える
3

変更を行っているコードをラップするだけです。

[CATransaction begin];
[CATransaction setAnimationDuration:0];

[thelayer setAlpha:0];

[CATransaction commit];
于 2012-04-14T17:34:18.760 に答える