簡體   English   中英

UICollectionView在滾動嵌套的UITableView后重置內容偏移量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM