2012-05-22 117 views
2

我有一個表視圖被分解成字母節。我在每個部分的頁腳中的UIImage View中顯示動畫橫幅,並且需要確定在單擊UIImage View時顯示哪個圖像。我在打電話給startAnimating之前設置了一個計時器。定時器每5秒鐘發射一次,速度與動畫改變的速度相同,但定時器發射速度更快。有時它會在5秒內發射2次或3次。這裏就是我啓動定時器和動畫代碼:NSTimer不應該發射時它應該

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger) section { 

... 

    imgAdBar = [[bannerView alloc]initWithFrame:CGRectMake(footer.frame.origin.x,footer.frame.origin.y,footer.frame.size.width,footer.frame.size.height)]; 

    imgAdBar.image=[UIImage imageNamed:[NSString stringWithFormat:@"%@", [animationArray objectAtIndex:0]]]; 
    [imgAdBar saveBannerArray:animationArray]; 
    [imgAdBar setUserInteractionEnabled:YES]; 
    imgAdBar.animationImages = images; 
    imgAdBar.animationDuration=[images count]*5; 
    imgAdBar.animationRepeatCount=0; 
    timerCount=0; 
    [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(timerRunning:) userInfo:nil repeats:YES]; 
    [imgAdBar startAnimating]; 
    [footer addSubview:imgAdBar]; 
    footer.backgroundColor = [UIColor clearColor]; 

} 
return footer; 
} 

,這裏是選擇:

-(void)timerRunning:(NSTimer*)theTimer 
{ 
NSLog(@"timerCount=%d",timerCount); 

imgAdBar.timerCount=timerCount; 
if (timerCount==numAnimationImages) { 
    timerCount=0; 
} 
NSLog(@"currentImage=%@",[animationArray objectAtIndex:timerCount]); 
timerCount++; 
} 

我打算使用定時器來索引到我的圖像陣列,這樣我可以告訴顯示。任何人都有任何想法,爲什麼它應該不會開火?感謝您的幫助!

+0

在'viewForFooterInSection:'中添加'NSLog'來查看你是否多次調度定時器。如果您希望它與動畫同步觸發,那麼爲什麼不使用動畫結束事件,而是使用委託中的'animationDidStop:'實現? – dasblinkenlight

+0

感謝您的回覆!不幸的是,我現在不在我的Mac前面,但會在下班後嘗試。但是,我認爲你可能會做些什麼。由於我在viewForFooterInSection過程中調用了NSTimer,因此我一次可以在屏幕上顯示多個頁腳。所以,我想我會不知何故必須爲每個部分指定不同的定時器,並且每個部分都有不同的選擇器?或者,我需要將該部分傳遞給選擇器並增加單獨的計數器?對不起,我對ios非常陌生......只要顯示所有圖像,就會調用animationDidStop? – user1292943

+0

它可能觸發了幾次,因爲每個頁腳都會調用viewForFooterInSection方法,並且每次在頁面上顯示頁腳 – Novarg

回答

1

您必須使用NSTimer作爲屬性... 由於viewForFooterInSection多次調用了很多部分,您必須重新初始化之前解除或者你必須檢查null下面是代碼.. 作廢:

NSTimer *timer; // declare in ViewDidLoad 
    // code in viewForFooterInSection 
    [timer invalidate]; 
     timer = [NSTimer scheduledTimerWithTimeInterval: 0.5 
         target: self 
         selector: @selector(handleTimer:) 
         userInfo: nil 
         repeats: YES]; 

檢查零

if (timer == nil) { 

     timer = [NSTimer scheduledTimerWithTimeInterval: 0.5 
               target: self 
               selector: @selector(handleTimer:) 
               userInfo: nil 
               repeats: YES]; 
    } 

希望它應該幫助..

+0

非常感謝Dilip,今天下午我下班回家時會試試這個。 – user1292943

+0

嗨@Dilip Rajkumar,你發佈的絕對有幫助。但是,當屏幕上同時顯示多個部分時,我遇到問題。計時器不會增加,因爲每個部分的頁腳中的代碼使計時器無效。任何想法如何我可以處理這個? – user1292943

+0

哦..剛纔我明白了這個問題..你正試圖在每一部分的頁腳顯示圖像..哪些變化適時..每個頁腳必須以他們自己的方式顯示圖像..請糾正我,如果我我錯了..我會努力,並在幾個小時內讓你知道.. –

1

在你的頭文件

@propterty (nonatomic, retain) NSTimer *someTimer; 

聲明一個NSTimer財產在行,其中你火計時器

someTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(timerRunning:) userInfo:nil repeats:YES]; 

不要忘了釋放它在 - (無效)viewDidUnload

[someTimer release]; 
1

因爲除非有一個點擊,Y你不使用的timerCount值你不需要在定時器上更新它:在開始動畫的時刻存儲時間就足夠了。知道每個圖像顯示五秒鐘後,您可以通過點擊點擊時間與開始動畫的時間之間的差異(以秒爲單位),並將其除以5來計算顯示圖像的索引除以圖像總數的其餘部分。

假設您有10張圖片,每張圖片在循環中顯示五秒鐘。我們還要說動畫已經開始於08:15:51。現在讓我們假設在動畫開始後,點擊08:19:23212秒。除以五之後,您得到42;以十分之一除下其餘部分,你會得到2。因此,您知道用戶已經點擊了動畫循環中的第三個圖像(像往常一樣,索引從零開始)。

+0

這完全有道理@ dasblinkenlight。今天下午我下班回家時,我會試一試。非常感謝你們的幫助!! – user1292943