0

UIImageViewを使用して、 (指の写真)を右から左にアニメーション化しようとしていCGAffineTransformMakeTranslation()ます。このアニメーションは、ユーザーがスワイプを実行するまで繰り返され、ユーザーはチュートリアルに沿って移動します。これらはすべて、次のようにすでに順調に機能しています。

[UIView animateWithDuration:1.0 animations:^ {
    self.finger.alpha = 1.0; 
}completion:^(BOOL finished) {
    CGAffineTransform originalTransform = self.finger.transform;
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^ {

        self.finger.transform = CGAffineTransformMakeTranslation(-200, 0);
        self.finger.alpha = 0.0;

        }completion:^(BOOL finished) {

            self.finger.transform = originalTransform;
            NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(repeatSwipeAnimation1) userInfo:nil repeats:YES];
            self.swipeTimerForFinger1 = timer;
            NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
            [runLoop addTimer:self.swipeTimerForFinger1 forMode:NSDefaultRunLoopMode];
            [self.swipeTimerForFinger1 fire];


            }];

        }];

そしてセレクター:

-(void)repeatSwipeAnimation1 {
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^ {
    self.finger.alpha = 1.0;
}completion:^(BOOL finished) {
    CGAffineTransform originalTransform = self.finger.transform;
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^ {
        self.finger.transform = CGAffineTransformMakeTranslation(-200, 0);
        self.finger.alpha = 0.0;
    }completion:^(BOOL finished) {
        self.finger.transform = originalTransform;

    }];
}];
}

指は美しく動き、移動します。

問題は、別のタイマーを使用しての指でこれを実行したい場合です。私はまったく同じコードを持っていますが、タイマーの指とセレクターが異なります。

何が起こるかというと、タイマーのセレクターがUIImageView を変換せ、(さらに恐ろしいことに) 無効にするメソッドを呼び出してもタイマーが無効になりません。デバッグ時に、2 番目のタイマーが 2 番目のセレクターを呼び出していることがわかりますが、動作していません (たとえば、翻訳せず、2 番目の指のフェードインが速すぎるなど)。

私が想定しているのは、最初に呼び出すときに NSRunLoop をオフにする必要があるということですか? NSRunLoop を使用するのはこれが初めてなので、無知で申し訳ありません。どんな助けも非常に役に立ちます。

4

1 に答える 1

1

確かに、ブロック保持サイクルが進行中です。__blockまたは__weak指定子のいずれかを使用する必要があります。ブロックと変数を参照してください。問題はメモリの問題に関連している可能性があります。

完了したら、必ず最初のタイマーを無効にしてください。

安全のために、UIImageViewを変換する前に、変換をリセットすることもできます。あなたはそのようにそれをすることができます:

finger.transform = CGAffineTransformIdentity;
于 2012-06-21T01:15:22.870 に答える