swift 最佳-当isPagingEnabled为true时,UICollectionView水平方向的滚动问题

qoefvg9y  于 10个月前  发布在  Swift
关注(0)|答案(1)|浏览(137)

isPagingEnabled属性设置为true时,我一直试图用水平滚动方式滚动UICollectionView到下一页。我已经研究了好几天了,做了很多研究,但我找不到任何像我这样的病例。如果你已经有这个问题,如果你已经找到了解决方案,这将是伟大的分享你的解决方案与我的方式。以下是我目前的案例;

func sampleTest() {
    let collectionView = app.collectionViews[.sampleCollectionView]
    collectionView.waitUntil(.exists)
    let totalPageCount = collectionView.cells.count
    guard totalPageCount > 0 else {
        XCTFail("No pages could find in collection to take snapshot.")
        return
    }
    for currentPage in 1...totalPageCount {
        snapshot("Page\(currentPage)")
        collectionView.swipeLeft()
    }
}

这里,XCUIElementswipeLeft()方法在我的例子中没有按预期工作。当我调用该方法时,它并不移动到下一页。由于isPagingEnabled = true语句,它稍微滑动并返回。
此外,还有一个问题是collectionView.cells.count计算错误。它总是返回1。我认为问题的原因是关于可重用性。因为其他细胞还没有出队。collectionView.cells.count不像我想的那样工作。

oiopk7p5

oiopk7p51#

我遇到过一个类似的问题,分页在UI测试中表现不佳,因为我的第一个单元格有一个左内容插入,并且居中,而下一个单元格总是窥视视图,因此按collectionView边界的大小滚动并没有给予预期的结果。
相反,我在collectionView上禁用了isPagingEnabled,并使用这些UIScrollViewDelegate方法来“捕捉”要显示的下一个单元格的中心,这取决于用户(或测试)的滑动方式:

var collectionViewContentOffsetXBeforeScrolling: CGFloat = 0.0

记录开始减速时的内容偏移量:

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
  guard scrollView == collectionView else { return }
  collectionViewContentOffsetXBeforeScrolling = scrollView.contentOffset.x
}

将当前视图中最左边或最右边的单元格居中:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
  if scrollView == collectionView {
  
    let visibleIndexPaths = collectionView.indexPathsForVisibleItems.sorted(by: { $0.item < $1.item })
  
    if let rightMostCell = visibleIndexPaths.last, let leftMostCell = visibleIndexPaths.first {
      let indexPathToSelect = collectionView.contentOffset.x > collectionViewContentOffsetXBeforeScrolling ? rightMostCell: leftMostCell
    
      let cellToBeCentered = collectionView.cellForItem(at: indexPathToSelect)
      collectionView.scrollToItem(at: indexPathToSelect, at: .centeredHorizontally, animated: true)
  }
}

最后,我设置了bounces = false来简化逻辑,并防止在collectionView单元格的任意一端调用该方法时出现错误行为。

相关问题