2017-05-22 110 views
0

後頂部我有動力單元的高度在我的tableView的UITableView動態細胞高度滾動調用reloadData

tableView.rowHeight = UITableViewAutomaticDimension 
tableView.estimatedRowHeight = 100 

我想要做的一樣WhatsApp的應用程序(分頁),我想加載25 25行,所以當在頂部的用戶滾動,我想加載新的數據,但我想保持滾動的同一位置,這裏是我做過什麼

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if isMore && scrollView.contentOffset.y == 0 { 
     loadMore() // function that add new data in my model 
     self.tableView.reloadData() 
    } 
} 

我已經是後我達到我的tableview的頂部它調用reloadData但問題tableView滾動到UP

我測試器這樣的一些其他的解決方案:

var cellHeights: [IndexPath : CGFloat] = [:] 

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    cellHeights[indexPath] = cell.frame.size.height 
} 

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { 
    guard let height = cellHeights[indexPath] else { return 70.0 } 
    return height 
} 

但仍然沒有工作

+0

默認情況下,表視圖上的'.reloadData()'不會**改變表的滾動位置。也許在你的'loadMore()'或其他一些函數正在改變表視圖​​屬性? – DonMag

+0

是的,因爲我使用動態單元格高度UITableViewAutomaticDimension – OuSS

+0

嗯...你說*「當用戶滾動頂部,我想加載新的數據」* ...所以你想添加行上面的第零行? – DonMag

回答

0

如果你重裝表中添加更多的數據,下面的函數調用重載然後後保留滾動位置。

tableview.scrollToRow(at: indexPath, at: .middle, animated: true) 

here indexPath是重新加載前的最後一個單元格的indexPath。

+0

這個功能不保持完全相同的位置 – OuSS

+0

你可以嘗試通過更改UITableViewScrollPosition? – user3608500

+0

我如何獲得這個職位? – OuSS

0

tableView:cellForRowAt當您檢測到indexPath正在接近最後一個元素(當indexPath.row越來越接近yourArray.count)時,查詢更多項目。當你有它們時,把它們添加到你的數據源(數組,或者任何它,你擁有表中所有對象的地方)並重新加載表視圖。表格視圖應該顯示新的項目,並且用戶可以繼續滾動而不做特別的事情。

您不應該等到tableView:cellForRowAt被調用爲最後一個單元格,因爲如果您需要調用服務器來獲取更多的項目,用戶將不得不等待。 Whatsapp的滾動速度很快,因爲他們在滾動到最後一個元素之前下載了這些項目(前一段時間它在最後停止了,但現在它們可能會提前獲取新項目)。

請記住,25個項目可能太少,它的網絡速度很慢,用戶可能會滾動顯示更多項目之前所需的項目,並且需要等待,這不是一個好的用戶體驗。模擬一個慢速的網絡連接,看看你的應用程序聯繫服務器時是否有足夠的25個項目滾動瀏覽(取決於網絡速度,請求和響應大小,服務器響應你的請求的速度等)。

+0

是我所做的只是即時通訊測試indexPath.row == 0因爲我想加載數據在頂部而不是像whatsapp底部,但問題是因爲我有動態單元格高度'UITableViewAutomaticDimension'當我調用tableview的reloadData,滾動的位置總是在行= 0像它重繪表 – OuSS

0

我在消息傳遞應用程序中遇到了同樣的問題。下面是我如何解決它:

  1. 在數據源陣列分配一個唯一messageId消息

  2. cellForRow:中,我將第一行的messageId保存在名爲messageIdFirst的變量中。

    if(indexPath.row == 0){ 
        messageIdFirst = message.id! 
    } 
    
  3. loadMore()方法中,我檢查哪個當前indexpath行具有相同的MESSAGEID在現在更新的數據源陣列。

    if(message.id == messageIdFirst){ 
        previousTopIndexPath = i 
    } 
    

    ,其中i是在數據源陣列,其指數,其具有相同的messageId.

  4. 現在,我滾動到previousTopIndexPath這樣的:

    tableview.scrollToRow(at: previousTopIndexPath, at: .middle, animated: true)

注1:A這是不是在UITableView高效工作,我最終使用相同的解決方案使用UICollectionView

注2:雖然這並順利工作,我知道必須存在一個更清潔的方式來做到這一點。