2010-04-03 65 views
7

我有一個包含大圖像的UIScrollView,並使用分頁在圖像之間滾動。爲了節省內存,我只在當前可見的圖像前後加載一個圖像,並在滾動完成後加載/釋放新圖像。UIScrollView中的惰性加載頁面

快速滾動並且不調用scrollViewDidEndDecelerating時會出現此問題。

如何檢測連續滾動?

我可以在每scrollViewDidScroll檢查項目的位置,但這個似乎有點重......

+0

是實現從scrollViewDidEndDragging減速相關的代碼的解決方案:willDecelerate是爲你工作? – spd 2011-03-18 08:35:35

回答

0

我的臨時解決方案是從用戶,直到滾動完成提起手指禁用滾動取消連續滾動。

-(void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 
{ 
    [scrollView setScrollEnabled:NO]; 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [scrollView setScrollEnabled:YES]; 
} 
0

你可以做這樣的事情

-(void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    CGFloat pageWidth = scrollView.frame.size.width; 
    int page = floor((scrollView.contentOffset.x - pageWidth/1.5)/pageWidth) + 1; 
} 

調用此方法在任何時候改變contentoffset是否編程或沒有。

從這種方法中,你可以檢查'page'是否與你當前頁面相同,如果沒有,你知道你需要加載一些東西。這裏的技巧是讓圖像加載而不需要保持滾動視圖的滾動。那是我卡住的地方。

當你中途下頁

0

頁面計算將改變下一個/上如果你還在尋找一個解決方案......這是我做的,它的工作有一個良好的表現真的很不錯也是。

- (void)scrollViewDidEndDragging:(UIScrollView *)sv willDecelerate:(BOOL)decelerate 
{ 
    if (!decelerate) 
    { 
     // load images and unload the ones that are not needed anymore 
     [self someMethod] 
    } 
} 


- (void)scrollViewDidEndDecelerating:(UIScrollView *)sv 
{ 
    // load images and unload the ones that are not needed anymore 
    [self someMethod] 
} 
+0

即使我有和Jean一樣的問題。我嘗試了scrollViewDidEndDragging方法:willDecelerate:但是,每當scrollViewDidEndDecelerating沒有被調用時,scrollViewDidEndDragging:willDecelerate:也不會被調用。我該如何解決這個問題? – spd 2011-03-18 03:49:19

2

也許與自定義單元格內容的表格視圖將更好地爲你,因爲它有很多的邏輯建立在只加載那些可見的一次反對一切細胞。有很多關於如何以各種方式管理表視圖的教程。

0

您必須同時檢查scrollViewDidEndDecelerating和scrollViewDidScroll。 當用戶滑動並釋放它時讓第一個「勢頭」滾動將在和處被調用。如果用戶決定通過點擊tableview(或滾動到最底部,但我不確定)用他的手指停止滾動,則會觸發第二個事件。

0

根據我的經驗,@ jd291是正確的;我使用下面的回調成功地爲大多數地方

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 

但是,唯一的情況下,當一個callback不叫的是,你可能沒有建立delegate正常。