1

xcode 4.6 にアップグレードするまで正常に動作していたアプリがあります。xcode 4.6 のアップグレード後、ios4 での実行時にタッチ イベントが受信されません (ios5 および ios6 で正常に動作します)。IBにスイッチを追加してみました(接続せず、追加しただけです)。ios5 および ios6 デバイスのシミュレーターでスイッチを切り替えることができますが、ios4 ではスイッチを動かすことさえできません。

タイマーで実行される小さなアニメーションがあります。

- (void)setFoamSize:(float)foamSize
{    
    // foamSize is a number between 0 - 100.  0 is min foam size; 100 is max foam size

    // NSLog(@"setFoamSize %f", foamSize);

    float centerX, centerY;
    float minHeight, minWidth;
    float maxHeight, maxWidth;
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    {
        centerX     = 70.0;
        centerY     = 102.0f;

        minWidth    = 51.0f;
        minHeight   = 37.0f;

        maxWidth    = 111.0f;
        maxHeight   = 86.0f;
    }
    else
    {
        centerX     = 158.0f;
        centerY     = 151.0f;

        minWidth    = 74.0f;
        minHeight   = 64.0f;

        maxWidth    = 320.0f;
        maxHeight   = 271.0f;
    }


    float height = ((maxHeight - minHeight) * foamSize + minHeight);
    float width  = ((maxWidth  - minWidth)  * foamSize + minWidth);

    float x = centerX - width / 2;
    float y = centerY - height / 2;

    float alpha  = MIN(1.0, ((1.0 - 0.7) * foamSize + 0.7));

    @autoreleasepool {

        [UIView animateWithDuration:1.0
                              delay:0.0
                            options: UIViewAnimationOptionCurveLinear
                         animations:^{
                             imageViewFoam.frame = CGRectMake(x, y, width, height);
                             imageViewFoam.alpha = alpha;
                         }
                         completion:^(BOOL finished){
                         }];
    }

}

このアニメーションをコメント アウトすると、iOS 4 でタッチ イベントが受信されます。アニメーションはすべての iOS で動作し、画面のごく一部を占めます (つまり、ボタンやスイッチに重なっていません)。

このアニメーションがタッチ イベントに干渉するのはなぜですか?

更新

画像の変更をanimateWithDurationの外に移動すると、すべてが機能します(つまり、ios4でタッチイベントが受信されます)

imageViewFoam.frame = CGRectMake(x, y, width, height);
imageViewFoam.alpha = alpha;


@autoreleasepool {

    [UIView animateWithDuration:1.0
                          delay:0.0
                        options: UIViewAnimationOptionCurveLinear
                     animations:^{
                        //imageViewFoam.frame = CGRectMake(x, y, width, height);
                        //imageViewFoam.alpha = alpha;
                     }
                     completion:^(BOOL finished){
                     }];
}

更新 2

アニメーションは 1 秒ごとに開始されます (したがって、持続時間も 1 秒で、画像は比較的滑らかに成長します。わずかにギザギザしていますが、それが私が望む効果です)。

いずれにせよ、持続時間を 0.5 秒に変更すると、アニメーションの間にオブジェクトが触れられた場合にタッチ イベントが機能します (ただし、アニメーション中に触れられた場合は機能しません)。

そのため、animationWithDuration が実際に何かをアニメートしている間、そのタッチ イベントは iOS4 では無視されるようです。

4

1 に答える 1

3

オプション UIViewAnimationOptionAllowUserInteraction を追加しました

@autoreleasepool {

    [UIView animateWithDuration:1.0
                          delay:0.0
                        options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction)
                     animations:^{
                        imageViewFoam.frame = CGRectMake(x, y, width, height);
                        imageViewFoam.alpha = alpha;
                     }
                     completion:^(BOOL finished){
                     }];
}

ここでmmcの答えに感謝します

Apple docsによると、アニメーションは imageViewFoam のユーザー操作のみを無効にする必要があります

アニメーション中は、このプロパティの値に関係なく、アニメーションに関係するすべてのビューでユーザー操作が一時的に無効になります。アニメーションを構成するときに UIViewAnimationOptionAllowUserInteraction オプションを指定することで、この動作を無効にすることができます。

だから、なぜ物事がうまくいかなかったのか分かりません。いずれにせよ、オプションを追加することで問題が解決しました。

于 2013-02-25T00:30:26.617 に答える