2010-11-19 11 views
0

私はテキストビューを自動的にスクロールし、最後に到着したらトップに戻そうとしています。自動スクロールUITextView問題

私はこのコードを使用します。その結果

-(void)scrollTextView 
{ 

    CGPoint scrollPoint = stationInfo.contentOffset; 

    scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 2); 

    if (scrollPoint.y == originalPoint.y + 100) 
    { 
     NSLog(@"Reset it"); 

     scrollPoint = CGPointMake(originalPoint.x, originalPoint.y); 
     [stationInfo setContentOffset:scrollPoint animated:YES]; 

     [scroller invalidate]; 
     scroller = nil; 

     scroller = [NSTimer 
        scheduledTimerWithTimeInterval:0.1 
        target:self 
        selector:@selector(scrollTextView) 
        userInfo:nil 
        repeats:YES]; 

    } 
    else 
    { 
     [stationInfo setContentOffset:scrollPoint animated:YES]; 
    } 

} 

を、テキストビューは乱暴周りにジャンプしますが、私はかなり理由を知りません。テキストビューが最下部にあることを検出するより良い方法はありますか? scrollPointの値を間違って設定していますか?

編集:

問題が解決しました!私はNSTimerに固執しました - 欠けているキーはレイヤーのために-displayを呼び出していました。

-(void)scrollTextView 
    { 
     //incrementing the original point to get movement 
     originalPoint = CGPointMake(0, originalPoint.y + 2); 
     //getting the bottom 
     CGPoint bottom = CGPointMake(0, [stationInfo contentSize].height); 
     //comparing the two to detect a reset 
     if (CGPointEqualToPoint(originalPoint,bottom) == YES) 
     { 
      NSLog(@"Reset"); 
      //killing the timer 
      [scroller invalidate]; 
      scroller == nil; 
      //setting the reset point 
      CGPoint resetPoint = CGPointMake(0, 0); 
      //reset original point 
      originalPoint = CGPointMake(0, 0); 
      //reset the view. 
      [stationInfo setContentOffset:resetPoint animated:YES]; 
      //force display 
      [stationInfo.layer display]; 

      scroller = [NSTimer 
         scheduledTimerWithTimeInterval:0.1 
         target:self 
         selector:@selector(scrollTextView) 
         userInfo:nil 
         repeats:YES]; 
     } 
     else 
     { 
      [stationInfo setContentOffset:originalPoint animated:YES]; 
     } 


} 
+0

コールバックメソッドのシグネチャが間違っています。私の答えを見て、正しいものを見てください。 – GorillaPatch

+0

このコードは正常に動作します。これは非常に低レベルのコードであることに気をつけてください。 CoreAnimationは本当に簡単になりました。私は、ドキュメントを読むのには時間がかかることは認めていますが、それはそれだけの価値があります。 1つの質問が残っています。なぜあなたはCALayerと直接対話しますか?あなたが直接層を扱っていないので(あるいはあなたに)私は[stationInfo setNeedsDisplay]と呼ぶでしょう。 – GorillaPatch

+0

なぜコンテンツのオフセットをアニメーションに設定するのですか?あなたはあなたのタイマーでアニメートしているので、私は各2ピクセルステップのアニメーションを使用しません。本当の問題は、あなたがそこでトリガーしている陰的なアニメーションが0.1タイムステップよりも長くなっていることです。これは物事をひどく混乱させるでしょう。下にスクロールするときにアニメーションなしで設定してください。また、CALayerのディスプレイコールを省略することもできますが、これはまだ私には奇妙に見えます。 – GorillaPatch

答えて

1

また、CoreAnimationを使用してboundsプロパティを直接アニメーション化することもできます。最初にスクロールをアニメートし、デリゲートのコールバックで、アニメーションの終了後にコンテンツのオフセットをリセットします。

コールバックメソッドを使用すると、iOSの4.0をターゲットにして上記されている場合にも、新たなブロックベースの方法を使用することができます署名

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 

を持っている必要があります。次に、渡されるブロックが2つあります。最初はアニメーションを指定し、2番目のブロックではアニメーションが終了したら何をするかを指定します。

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion 

コードを一行に崩壊よりも、あなたの問題:

[stationInfo animateWithDuration:10.f delay:0.f options:0 animations:^{ 
    [stationInfo setContentOffset:CGPointMake(0, [stationInfo contentSize].height)]; 
} completion:^(BOOL finished){ 
    if (finished) [stationInfo setContentOffset:CGPointMake(0,0)]; 
}]; 

は正直に言うと、私は、正確なブロック構文の約100%を確認していないが、これは、それがどのように動作するかをです。

+0

リセットすると原因が発生する可能性があります。そのため、正しくリセットする方法を尋ねました。/ – Pripyat

+0

解決方法は、タイマーを離れてCoreAnimationを使用することです。あなたはそれが完了したらコールバックを取得し、これでコンテンツのオフセットを(0,0)に設定します。 – GorillaPatch

+0

私はタイマーを保持してうれしく思います - それは終了OKを検出しますが、私は0,0にリセットそれは再び周りにジャンプします。 – Pripyat

関連する問題