1

他に少なくとも5つの「UIViewアニメーションが機能しない」質問が見つかりました。さらにもう1つ追加するのは嫌です。:(。これは特定のものではないと確信していalphaます。。と同じ問題backgroundColorです。したがって、これは基本的なものです。

これは機能します:

        [self.view viewWithTag:kPlayView].alpha = 0.75;
        [self.view viewWithTag:kCancelView].alpha = 0.75;
        [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor whiteColor];

これはしません(何もしません):

 //kPlayView and kCancelView are subviews of kTapViewTag  
 [UIView animateWithDuration:2.0  animations:^{
        [self.view viewWithTag:kPlayView].alpha = 0.75;
        [self.view viewWithTag:kCancelView].alpha = 0.75;
        [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor whiteColor];

    } ];

なんで?これは、ビューのジェスチャハンドラで呼び出されkTapViewTagます。backgorundColor = [UIColor clearColor]タップジェスチャに応じて、白にフェードし、サブビューのアルファを0.75に変更したいのはこのビューです。

アップデート:

逆に動作します。これは機能します:

       [UIView animateWithDuration:2.0 animations:^{
          [self.view viewWithTag:kPlayView].alpha = 0;
          [self.view viewWithTag:kCancelView].alpha = 0;
          [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor clearColor];
        }];

アニメーションなしで「一時停止/再開」として機能するビューを表示してから、フェードアウトをアニメーション化することができます。これは、フェードインをアニメートしようとしない限り、前後に機能します。

更新2

参考までに、実装全体を次に示します。ここに何かありますか?(私は何度も見ました)。

- (void)didTap:(id)selector
{

    isPaused = (isPaused) ? NO: YES;

    [self.view viewWithTag:kPlayView].userInteractionEnabled = isPaused;
    [self.view viewWithTag:kCancelView].userInteractionEnabled = isPaused;

    if (isPaused)
    {

        [self pauseLayer:self.view.layer];
        [timer1 invalidate];
        [timer2 invalidate];

       [UIView animateWithDuration:2.0  animations:^{
            [self.view viewWithTag:kPlayView].alpha = 0.75;
            [self.view viewWithTag:kCancelView].alpha = 0.75;
            [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor whiteColor];
        } ];
    }
    else
    {
        isPaused = NO;

        [UIView animateWithDuration:2.0 animations:^{
            [self.view viewWithTag:kPlayView].alpha = 0;
            [self.view viewWithTag:kCancelView].alpha = 0;
            [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor clearColor];
        }];

        [self resumeLayer:self.view.layer];
        [self animateNotification];
    }         
}

更新3

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

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

1 に答える 1

1

UIViewアニメーションは、ビューのレイヤーを使用してアニメーションをレンダリングするCoreAnimationの優れた高レベルのラッパーです。レイヤー速度を0に設定すると、uiviewアニメーションの開始を効果的に停止できます。

レイヤータイムを再開すると、中断したところから開始します。一時停止する前と後のアニメーションが合体し、何も起こりません。

アニメーションを作成しないときにアニメーションが反対方向に機能する理由は、アニメーションの設定方法と起動方法が原因です。呼び出す[UIView animate...と、レイヤーに開始時刻と終了時刻などの低レベルのアニメーションが設定されます。作成したコードはすぐに完了し、アニメーションはランループの次の実行で開始されます。ただし、すべてを戻す前に、レイヤーの時間と速度も再開するため、アニメーションを実行する場合は、すべてが通常どおりに進行します。

私の推測では、このようにレイヤーを一時停止するつもりはありません。アニメーションを削除および停止するためのより良い方法が必要です。たとえばUIView、プロパティをもう一度アニメーション化すると停止しCALayerます。また、アニメーションの特定のポイントで特定のレイヤーが画面上のどこにあるかを調べて、実際のレイヤー値を調整して一致させるremoveAllAnimationsことremoveAnimationForKey:もできます。-[CALayer presentationLayer]

于 2012-11-09T22:03:59.743 に答える