我試圖自動滾動我的文本視圖,並將它重置到頂部,一旦它到達最後。自動滾動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];
}
}
回調方法有錯誤的簽名。看我的答案看到正確的。 – GorillaPatch 2010-11-20 19:08:42
這段代碼有效,那很好。請注意,這是非常低級的代碼。 CoreAnimation會讓事情變得更容易。我承認閱讀文檔需要一些時間,但這是值得的。還有一個問題:爲什麼你直接與CALayer交互?因爲你不直接處理圖層(或者你),我會打電話給[stationInfo setNeedsDisplay]。 – GorillaPatch 2010-11-21 08:35:47
爲什麼您將內容偏移設置爲動畫?你用計時器動畫,所以我不會爲每個2像素步驟使用動畫。真正的問題在於,你在那裏觸發的隱式動畫比你的0.1時間步長要長,這會讓事情變得糟糕。向下滾動時嘗試將其設置爲不帶動畫。也許您的CALayer上的顯示調用也可以省略,這對我來說仍然很奇怪。 – GorillaPatch 2010-11-21 08:39:38