【问题标题】:UICollectionView resets content offset after scrolling a nested UITableViewUICollectionView 在滚动嵌套的 UITableView 后重置内容偏移量
【发布时间】:2015-11-18 11:47:19
【问题描述】:

设置:

我在 Storyboard 上创建了一个 UICollectionView,并将委托连接到控制器,面向水平滚动。每个 UICollectionViewCell 内部都有一个 UITableView,委托给同一个控制器。集合视图是分页的。一次可见大约 3.5 个单元格。

问题:

如果我在集合视图上水平滚动,现在“分页”超过 1 个长度,然后尝试垂直滚动包含的 UITableView,UICollectionView 内容偏移会通过动画设置为 0,0 的内容偏移来重置。保持触摸事件,并且出队的单元格继续其滚动动作。我不希望在用户滚动表格视图时重置集合视图

注意:

使用 iPad 模拟器

这是一张示例图片。每列都是一个包含 UITableView 的 UICollectionViewCell。列中的每一行都是一个 UITableViewCell。如果我不在 UICollectionView 的内容偏移量 0,0 处,并且我在任何 TableView 上滚动,则集合视图将动画回具有 0,0 的内容偏移量

【问题讨论】:

    标签: ios objective-c uitableview uiscrollview uicollectionview


    【解决方案1】:

    有点过时的答案,但可能会帮助某人。 首先在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

    【讨论】:

      【解决方案2】:

      上次我检查时,嵌套滚动视图在 iOS 中具有未定义的滚动行为。您可以通过扩展(或子类化)表或集合视图并通过检查内容修改器方法中的发送者(或发送者的标识符)来忽略某些事件来覆盖行为以满足您的目的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多