9

現在の値を表し、継続的に上向きにカチカチ音をたて続ける UIImageView のアニメーション セットがあります...理想的には停止することはありません。 scrollView の動きが完全に止まると、再び起動します。要素の再描画はすべてメインスレッドで発生するため、これはスレッドの問題が原因であると思います。最初は UIView アニメーションを試し、次にコアアニメーションでさえ効果がありませんでした...私のケーキを食べて食べる方法はありますか?

ありとあらゆる助けをいただければ幸いです

コードは続きます

- (void)TestJackpotAtRate:(double)rateOfchange
{
    double roc = rateOfchange;

    for (int i = 0; i < [_jackPotDigits count]; ++i)
    {
        roc = rateOfchange/(pow(10, i));

        UIImageView *jackpotDigit = [_jackPotDigits objectAtIndex:i];

        float foreveryNseconds = 1/roc;

        NSDictionary *dict = @{@"interval"      :   [NSNumber numberWithFloat:foreveryNseconds],
                           @"jackPotDigit"  :   jackpotDigit
                           };

        [NSTimer scheduledTimerWithTimeInterval:foreveryNseconds target:self selector:@selector(AscendDigit:) userInfo:dict repeats:YES];
    }
}

-(void)AscendDigit:(NSTimer*)timer
{
    NSDictionary *dict = [timer userInfo];

    NSTimeInterval interval = [(NSNumber*)[dict objectForKey:@"interval"] floatValue];
    UIImageView *jackpotDigit = [dict objectForKey:@"jackPotDigit"];

    float duration = (interval < 1) ? interval : 1;

    if (jackpotDigit.frame.origin.y < -230 )
    {
        NSLog(@"hit");
        [timer invalidate];
        CGRect frame = jackpotDigit.frame;
        frame.origin.y = 0;
        [jackpotDigit setFrame:frame];

        [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(AscendDigit:) userInfo:dict repeats:YES];
    }

    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^
     {
         CGRect frame = [jackpotDigit frame];

         double yDisplacement = 25;

         frame.origin.y -= yDisplacement;

         [jackpotDigit setFrame:frame];

     }
                      completion:^(BOOL finished)
     {

     }];

}
4

2 に答える 2

30

danypataがこのスレッドを介して私のコメントで指摘したように、UIScrollView がスクロールされている間、カスタム UI 要素が更新されません。これは、アニメーション スレッドではなく NStimer スレッド、または誰かが明確にできる場合はその両方に関係しています。いずれにせよ、スクロールするとき、すべてのスクロール イベントがメイン ループを排他的に使用するように見えます。解決策は、アニメーションを実行するために使用しているタイマーをUITrackingLoopModeである同じループ モードにすることです。スクロールと...

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:foreveryNseconds target:self selector:@selector(AscendDigit:) userInfo:dict repeats:YES];

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

多田。

于 2013-05-15T08:25:31.887 に答える