繁体   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