2010-11-19 116 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值錯誤?

編輯:

ISSUE SOLVED!我堅持使用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 2010-11-20 19:08:42

+0

這段代碼有效,那很好。請注意,這是非常低級的代碼。 CoreAnimation會讓事情變得更容易。我承認閱讀文檔需要一些時間,但這是值得的。還有一個問題:爲什麼你直接與CALayer交互?因爲你不直接處理圖層(或者你),我會打電話給[stationInfo setNeedsDisplay]。 – GorillaPatch 2010-11-21 08:35:47

+0

爲什麼您將內容偏移設置爲動畫?你用計時器動畫,所以我不會爲每個2像素步驟使用動畫。真正的問題在於,你在那裏觸發的隱式動畫比你的0.1時間步長要長,這會讓事情變得糟糕。向下滾動時嘗試將其設置爲不帶動畫。也許您的CALayer上的顯示調用也可以省略,這對我來說仍然很奇怪。 – GorillaPatch 2010-11-21 08:39:38

回答

1

您還可以使用CoreAnimation並直接爲邊界屬性設置動畫。首先對滾動進行動畫處理,然後在動畫完成的代理回調中重置內容偏移量。

回調方法必須有簽名

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

你也可以使用新的基於塊的方法,如果你的目標的iOS 4.0及以上。然後有兩個要傳遞的塊:第一個塊指定要動畫的內容,第二個塊指定動畫結束時要執行的操作。

+ (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 2010-11-19 20:49:27

+0

解決方案將離開您的計時器並使用CoreAnimation。你完成後會得到一個回調,在這裏你設置的內容偏移量爲(0,0) – GorillaPatch 2010-11-19 20:51:25

+0

我很高興保持計時器 - 它檢測到結束確定,但如果我將偏移重置爲0,0它又跳來跳去。 – Pripyat 2010-11-19 21:07:41