[英]UICollectionView resets content offset after scrolling a nested UITableView
我在Storyboard上創建了一個UICollectionView,並且連接到控制器的委托,面向水平滾動。 每個UICollectionViewCell都有一個UITableView,委托給同一個控制器。 Collection視圖已分頁。 一次可見約3.5個細胞。
如果我在集合視圖上水平滾動以便現在“分頁”超過1個長度,然后嘗試垂直滾動包含的UITableView,則UICollectionView UNINTENTIONALLY內容偏移將通過設置動畫到內容偏移量0,0來重置。 保持觸摸事件,並且出隊的單元繼續其滾動動作。 當用戶滾動tableview時,我不希望重置集合視圖
使用iPad模擬器
這是一張示例圖片。 每列都是包含UITableView的UICollectionViewCell。 列中的每一行都是UITableViewCell。 如果我不是UICollectionView的0的內容集,並且我在任何TableView上滾動,則集合視圖會動畫回到內容偏移量為0,0
有點過時的答案,但可能會幫助別人。 首先在collectionView中設置scrollView委托以返回主視圖控制器。
在視圖控制器中聲明:
private var scrollViewOffset: CGPoint = CGPointZero
在主視圖控制器中添加以下代碼:
func scrollViewDidScroll(scrollView: UIScrollView) {
if scrollView == self.tableView {
return
}
self.scrollViewOffset = scrollView.contentOffset
for cell in self.tableView.visibleCells {
(cell as! MyCell).collectionView.contentOffset = scrollView.contentOffset
}
}
完成這一部分之后,下一部分就是您所缺少的部分:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: MyCell = tableView.dequeueReusableCellWithIdentifier("CellID", forIndexPath: indexPath) as! MyCell
cell.delegate = self
cell.collectionView.reloadData()
cell.collectionView.layoutIfNeeded() // THIS PART IS NEEDED IN ORDER NOT TO SCROLL TO 0, 0 OFFSET
return cell
}
並在:
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
let cell: MyCell = cell as! MyCell
cell.collectionView.contentOffset = self.scrollViewOffset
}
MyCell的內容應該是這樣的:
protocol MyCellDelegate {
func scrollViewDidScroll(scrollView: UIScrollView)
}
class MyCell: UITableViewCell, UICollectionViewDelegate, UICollectionViewDataSource {
var delegate: MyCellDelegate? = nil
// Do collection view display logic here
// ...
// After that implement scrollview delegate
func scrollViewDidScroll(scrollView: UIScrollView) {
if (self.delegate != nil) {
self.delegate?.scrollViewDidScroll(scrollView)
} else {
print("Missing delegate init")
}
}
}
這個答案適用於Xcode 7.3
我上次檢查時,嵌套滾動視圖在iOS中有未定義的滾動行為。 您可以通過擴展(或子類化)表或集合視圖來覆蓋行為以適合您的目的,並通過檢查內容更改器方法中的發送方(或發送方標識符)來忽略某些事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.