2011-08-01 19 views
1

可能性の重複:
UIScrollView pauses NSTimer until scrolling finishesScrollviewスレッドタイマーiphone

私はscrollviewと日付までのカウントダウンを表示するラベルを持っています。私はカウントダウンを稼いだが、スクロールビューを上下にドラッグするたびにカウントダウンが止まったが、私の指を離すと再び動き始めた。私はそれがmuti-threadingと関係していることを知っています。ここに私のコードです

-(void) viewdidload 
{ 
    timer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES]; 
} 

-(void)updateLabel { 


    NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

    NSDateComponents *countdown = [calender 
            components:(NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) 
            fromDate:[NSDate date] 
            toDate:destDate 
            options:0]; 

    timerCountDown.text = [NSString stringWithFormat:@"%dday %dh %dm %ds", [countdown day],[countdown hour],[countdown minute],[countdown second]]; 
} 

答えて

0

あなたは次の方法でテキストをUILabelに設定します。

NSString *cntTime = [NSString stringWithFormat:@"%dday %dh %dm %ds", [countdown day],[countdown hour],[countdown minute],[countdown second]]; 
[timerCountDown performSelectorOnMainThread:@selector(setText:) withObject:cntTime waitUntilDone:YES]; 

編集:

方法は-(void)viewDidLoadでなければなりません。また

、いくつかの時間に間隔を与え、1秒、

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES]; 

そして、uは任意のUIScrollViewDelegateメソッドを実装していると言いますか?代わりに、スレッドまたはものではありませんを追加するすべての問題を通過するの

+0

私が試したが、それはうまくいきませんでした:( – kevin

+0

は私の編集した答え – Ilanchezhian

+0

をチェックし、私は問題は 'updateLabel'がスクロール中に呼び出されていないことであると思ったいかなるscrollviewdelegate – kevin

1

、これを簡単に:指ダウン/ touchesBeganで

  1. 。 Bからの録音や指アップ/ touchesEndedで ミリ秒(A)
  2. に現在の時間を節約する(?)を記録するか、再度 現在の時間を節約する(B)
  3. マイナスA /逃したためには、中 時間を一時停止しましたその後、タイマーの時間から減算します。

この問題は、画面上の時計がスクロール中に一時停止しますが、離すとすぐに更新または再表示されます。

これはスレッドの方法よりも簡単な方法で問題を解決したいと考えています。 LH

0

Nideoの回答は良いです(厳密なカウントダウンを進めていれば、表示している値がどのようになるか予測できます)。しかし、ランダムに起こっているイベントの数を表示する必要があるかもしれません。スクロールビューのデリゲートメソッドscrollViewDidScroll:を実装し、そのソースからデータを更新することができます(つまり、updateLabelを呼び出します)。また、UIScrollViewをサブクラス化してtouchesBegan:/ touchesMoved:/ touchesEnded:を実装し、表示された値をそれぞれリフレッシュし、イベントをスーパーに渡して通常のタッチ操作を可能にすることもできます。