我試圖從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。
謝謝你的建議邁克爾!我絕對會使第一個計時器無效,並且真正爲變換的休息感到興奮。解釋「塊保留週期」是否會太麻煩? – Max
自我對象保留塊,當你在塊內引用自己時,塊也保留自己,當兩個對象保持對方時,最終產生一個保留週期,並且兩個對象都不會釋放。請參閱http://stackoverflow.com/questions/7853915/how-do-i-avoid-capturing-self-in-blocks-when-implementing-an-api –
Michael,非常有幫助。我現在完全明白了,非常感謝你!我將改變這些漫長的動畫鏈,看看我能否擺脫這個循環。 – Max