2010-12-06 56 views
4

我遇到了一個奇怪的滾動問題,我希望有人能幫我試圖找出原因。問題使用內容插入滾動表格視圖

我已經包含了我認爲與該問題相關的部分代碼,但很高興能夠更新此帖以及其他任何需要的內容。

我已經在tableview的內容嵌入區實現了一個拉來刷新視圖。刷新會觸發一個Async NSURLConnection,它從Web服務器提取數據,解析相關信息並根據需要刷新表。

這就是刷新過程揭開序幕:

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

    if (scrollView.contentOffset.y <= - 65.0f && !self.reloading) { 
     self.reloading = YES; 
     [self reloadTableViewDataSource]; 
     [refreshHeaderView setState:EGOOPullRefreshLoading]; 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:0.2]; 
     self.tableView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f); 
     [UIView commitAnimations]; 
    } 
} 

問題是,如果我開始滾動,而內容插圖是「看得見」(即重裝過程中)我得到這個怪異的行爲在我的桌子部分做不要一直滾動到頂部 - 請參閱屏幕截圖,以便清楚地瞭解我在此處描述的內容。

我在下面列出了幾個截圖,清楚地標識了目前正在發生的事情。

有沒有人遇到過這個?關於我應該看什麼來嘗試修復它的任何想法?

提前許多感謝, 羅格

alt text

這是結果,如果我開始滾動表。圖像頂部的橙色位是實際的導航欄,我期望表格部分(日期爲2010年12月1日)。

alt text

回答

1

這不是預期的行爲?你設置了tableView的contentInset,這個例子和這個例子中的scrollView相同,因此tableView將它的內容按給定的頁邊空白。選項卡視圖底部與部分標題之間的距離爲60px(視網膜屏幕截圖中爲120px),因此此值與contentInset.top值完全匹配。

我假設你在刷新後重置contentInset0.f;刷新完成後,您的錯誤行爲會消失嗎?

+0

也許我不明白內容插入功能,但我的問題是當滾動發生,而插圖仍然不是零。 tsbleviewcells的行爲和預期的一樣,我希望標題部分也能跟上,但是他們會停留在插圖?! – Rog 2011-01-09 12:40:41

+0

我檢查了一個示例項目。雖然`contentInset`使內容如預期的那樣向內移動,`clipsToBounds`不會將它夾在插入內容,也可能會出現這種情況。因此,在滾動瀏覽實際區域時,單元格可見,但標題被固定爲`origin.x = 0.f`,這是您設置`contentInset`後查看它的位置。 – Pascal 2011-01-09 23:24:59

0

在我看來,tableView正在做你正在問它的東西。我不認爲這是一個錯誤。

您正在從頂部向下移動插入物,但您永遠不會重新提起它。你可以嘗試一個else語句來反轉你在if語句中做什麼。

另外,你有沒有考慮改變你的視圖層次?你可以從tabView中取出標籤,把它們放在屏幕的頂部,並在下面的tableView?那麼你根本不用擔心設置插入。只是一個想法,我沒有看到應用程序的其餘部分。

8

我想你在scrollViewDidScroll方法中有類似if (self.reloading) return;的東西?如果你開始重裝

if (self.reloading) { 
    if (scrollView.contentOffset.y > -60.0 && scrollView.contentOffset.y < 0.0 && insetOnReload) { 
     [self.tableView setContentInset:UIEdgeInsetsMake(-scrollView.contentOffset.y, 0.0, 0.0, 0.0)]; 
    } 
    else if (scrollView.contentOffset.y >= 0.0 && insetOnReload) { 
     [self.tableView setContentInset:UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)]; 
     insetOnReload = NO; 
    } 
    return; 
} 

設置insetOnReloadYES:您可以將它添加到解決您的問題。

0

只需將contentOffset設置爲y點1像素以上或以下,它就不會這樣做。

CGPoint pt = scrollView.contentOffset; 
scrollView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f); 

scrollView.contentOffset = CGPointMake(pt.x, pt.y-1);