2017-04-18 129 views
2

我想向後加載我的tableview,這意味着tableView從底部加載並向上滾動以查看更多內容。從底部加載tableview,向上滾動(反向tableview)(iOS)

首先,我試着顛倒了dataSource數組。內容是顛倒的,但它仍然從頂部加載,用戶必須向下滾動以查看更多內容。

我又試圖從底部加載的tableView在viewWillAppear中:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    if (self.conversationTableView.contentSize.height > self.conversationTableView.frame.size.height) { 
     let offset = CGPoint(x: CGFloat(0), y: CGFloat(self.conversationTableView.contentSize.height - self.conversationTableView.frame.size.height)) 
     self.conversationTableView.setContentOffset(offset, animated: true) 
    } 
} 

這種嘗試,但不起作用,因爲我異步下載圖像(我使用NSTextAttachment,填補每個單元內我的UITextView )。每次我的佔位符被替換爲真正下載的圖像時,它會導致tableView內容偏移發生偏移(佔位符的圖像高度幾乎總是小於下載圖像的高度)。因此,以這種方式設置contentOffset不起作用。

如何從底部載入tableView並向上滾動以查看更多內容?

+0

你是什麼意思「從底部負荷」是什麼意思?你想建立一個從底部上來的表格動畫嗎? –

+0

不。當表格加載時,我希望Y偏移量已經在底部。用戶然後滾動查看更多內容 –

+0

你想要反轉tableview的東西嗎?你可以查看這個[extension](https://github.com/marty-suzuki/ReverseExtension)。 – ridvankucuk

回答

10

最好的方法是翻轉tableView和它的單元格。這樣,如果一個單元格的大小發生了變化(由於異步下載等原因),您仍然可以從tableview底部加載,而不是在偏移量處加載。

//In ViewDidLoad 
conversationTableView.transform = CGAffineTransform(rotationAngle: -(CGFloat)(M_PI)); 

//In cellForRowAtIndexPath 
cell.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI)); 

另外:如果你有一個headerView,只需將其設置爲tableView.tableFooterView

var tableHeaderView = UIView(frame: headerFrame) 
tableHeaderView.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI)); 
conversationTableView.tableFooterView = tableHeaderView 

如果你有一個footerView和headerView,只需設置頁眉頁腳和頁腳標題。

編輯: 如果你想翻轉滾動指示:

conversationTableView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, conversationTableView.bounds.size.width - 8.0) 
+0

智能且富有創意的解決方案!對我來說真的很好。我注意到的一件事是,滾動條現在將出現在屏幕的左側,而不是右側。爲了解決這個問題,我調整了conversationTableView.scrollIndicatorInsets。也許值得添加這個答案?即conversationTableView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0,0.0,0.0,conversationTableView.bounds.size.width - 8.0) – Bocaxica

+1

更新了我的答案,謝謝:) –

1

在你viewWillAppear方法,做到以下幾點:

tableView.scrollToRowAtIndexPath(bottomIndexPath, atScrollPosition: .Bottom, 
     animated: true) 

哪裏bottomIndexPath是爲表視圖中的最後一行的indexPath。如果您有一個長度爲n的數組,並且表中只有一個部分,通常這將是IndexPath(item: n-1, section: 0),但一定要檢查您的具體UITableView

這將確保您從tableView的底部開始。完成之後,您需要做的就是確保您的UITableViewDataSource上的cellForRowAtIndexPath方法反向返回數據,您將獲得所需的效果。

+0

如果我不異步下載圖像並將它們放入我的textView(它填充一個單元格),這可以工作。但是,由於我正在下載圖像,因此在調用scrollToRow方法後,單元格高度會發生變化。 –

+0

當圖像下載完成時,你會得到某種回調嗎?您可以在沒有動畫的情況下滾動到當前行的表格/底部底部。 –

+1

是的,但每次下載圖像時更改偏移量並不是解決此問題的最有效方法。如果您好奇,我只是發佈了我的解決方案。感謝您的幫助 –

相關問題