2012-06-20 32 views
0

我試圖從CGAffineTransformMakeTranslation()UIImageView(一個手指的圖片)從右到左動畫。此動畫將重複,直到用戶執行滑動操作,並在教程中移動用戶。所有這一切都已經順順當當工作如下:NSTimers和NSRunLoops的不穩定行爲

[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,並且(更可怕)計時器不會無效時,我調用該方法失效。在調試時,我發現第二個計時器正在調用第二個選擇器,但不是表現(例如,不會翻譯,並且第二個手指的速度太快)。

我假設我需要以某種方式關閉NSRunLoop時,我第一次打電話?這是第一次使用NSRunLoop,所以我爲我的無知道歉。任何幫助非常appricated。

回答

1

那麼,你肯定有一個塊保留週期正在進行。您需要使用__block或__weak說明符。請參閱Blocks and Variables。您的問題可能與內存問題有關。

確保在完成後使第一個定時器無效。

爲了安全起見,您可能還想在嘗試轉換之前重置UIImageView上的轉換。你可以這樣做:

finger.transform = CGAffineTransformIdentity; 
+0

謝謝你的建議邁克爾!我絕對會使第一個計時器無效,並且真正爲變換的休息感到興奮。解釋「塊保留週期」是否會太麻煩? – Max

+1

自我對象保留塊,當你在塊內引用自己時,塊也保留自己,當兩個對象保持對方時,最終產生一個保留週期,並且兩個對象都不會釋放。請參閱http://stackoverflow.com/questions/7853915/how-do-i-avoid-capturing-self-in-blocks-when-implementing-an-api –

+0

Michael,非常有幫助。我現在完全明白了,非常感謝你!我將改變這些漫長的動畫鏈,看看我能否擺脫這個循環。 – Max