UICollectionView滚动到不使用水平方向的项目

时间:2017-01-26 23:11:39

标签: ios swift uicollectionview

我在UICollectionView内有UIViewController并启用了分页功能。出于某些奇怪的原因,collectionView.scrollToItemcollectionview的方向为vertical时起作用,但在方向为horizontal时则不起作用。这有什么我做错了还是这应该发生?

  //Test scrollToItem
  func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let i = IndexPath(item: 3, section: 0)
    collectionView.reloadData()
      collectionView.scrollToItem(at: i, at: .top, animated: true)
      print("Selected")
  }

14 个答案:

答案 0 :(得分:28)

对于这部分:

collectionView.scrollToItem(at: i, at: .top, animated: true)

当滚动方向为horizontal时,您需要使用at: leftat: rightat: centeredHorizontallyat: top用于vertical方向。

答案 1 :(得分:7)

我在流程布局中实现此功能时遇到问题,每个项目都输入了分页。 .centeredHorizo​​ntally对我来说不起作用所以我使用scroll to rect并在滚动之前检查数据:

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<div class="card">
    <div class="card-block">
        <h4 class="card-title">Title</h4>
        <h5>-  smaller that should be beside main title</h5>
        <button class="card-title btn btn-primary">Button</button>
        <p class="card-text">Entry 1</p>
        <p class="card-text">Entry 2</p>
        <p class="card-text">Entry 3</p>
        <p class="card-text">Entry 4</p>
    </div>
</div>

答案 2 :(得分:6)

对于iOS 14

显然,UICollectionView中存在一个新错误,该错误导致启用分页时scrollToItem无法正常工作。解决方法是在调用scrollToItem之前先禁用分页,然后再重新启用它:

collectionView.isPagingEnabled = false
collectionView.scrollToItem(
    at: IndexPath(item: value, section: 0),
    at: .centeredHorizontally,
    animated: true
)
collectionView.isPagingEnabled = true

来源:https://developer.apple.com/forums/thread/663156

答案 3 :(得分:4)

将项目添加到collectionView和reloadData()之后,scrollToItem无法正常工作,因为尚未完成数据的重新加载。 因此,我这样添加了performBatchUpdates:

self.dataSource.append("Test")
self.collectionView.performBatchUpdates ({
    self.collectionView.reloadData()
}, completion: { _ in 
    self.collectionView.scrollToItem(at: IndexPath(item: 3, section: 0),
     at: .centeredHorizontally,
     animated: false)
})

我知道这不是关于这个问题的信息,但是对这个标题将有所帮助。

答案 4 :(得分:4)

我有这个问题:当点击按钮(水平集合滚动到下一个项目)时,它总是返回到第一个有 UI 错误的项目。

原因在这个参数中:myCollection.isPagingEnabled = true

解决方法:滚动到下一项前禁用分页,滚动后启用。

答案 5 :(得分:3)

我尝试了很多东西,但都失败了。这节省了我的时间。

     func scrollToIndex(index:Int) {
       let rect = self.collectionView.layoutAttributesForItem(at: IndexPath(row: index, section: 0))?.frame
       self.collectionView.scrollRectToVisible(rect!, animated: true)
     }

参考:https://stackoverflow.com/a/41413575/9047324

答案 6 :(得分:2)

Swift 4.2

collectionView.scrollToItem(at: IndexPath(item: pageNumber , section: 0), at: .centeredHorizontally, animated: true)
self.collectionView.layoutSubviews() // **Without this effect wont be visible**

答案 7 :(得分:2)

iOS 14+

这太愚蠢了,但它有效。

 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
      self?.collectionView.scrollToItem(at: i, at: .top, animated: true)
 }

答案 8 :(得分:1)

斯威夫特3:

这对我在水平收集视图中起作用。

.SD

您可以选择索引处的所需单元格是否在滚动位置的右侧或左侧。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

//Show 14th row as first row
self.activityCollectionView?.scrollToItem(at: IndexPath(row: 14, section: 0), at: UICollectionViewScrollPosition.right, animated: true)
}

答案 9 :(得分:0)

要滚动项目,不需要reloadData。从代码中删除以下行并尝试。

File "/var/task/main.py", line 48, in get_shadow
res=client.get_thing_shadow(thingName="test_light")
File "/var/runtime/botocore/client.py", line 253, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/var/runtime/botocore/client.py", line 543, in _make_api_call
raise error_class(parsed_response, operation_name)
ClientError: An error occurred (ForbiddenException) when calling the GetThingShadow operation: Forbidden

答案 10 :(得分:0)

对我来说,我必须在主线程上滚动收集视图,

    DispatchQueue.main.async {
        self.collectionView.scrollToItem(at: IndexPath(item: index, section: 0), at: .centeredHorizontally, animated: true)
    }

答案 11 :(得分:0)

快速5 (如果水平动画)

func scrollToIndex(index:Int) {
 self.collectionView?.scrollToItem(at: IndexPath(item: index, section: 0), at: .centeredHorizontally, animated: true)
}

您的示例:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
  
   collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
   print("Selected: \(indexPath.row)")
   collectionView.reloadData()
  }

答案 12 :(得分:0)

有时您可以设置

collectionView.collectionlayout.invalidate()
collectionView.scrollToItem(row:2,section:0)

如果您的网络可能会干扰主线程,则必须避免该操作或在完成此操作之后,必须应用此代码。 例如

self.group.enter()
some thread
self.group.leave()

答案 13 :(得分:0)

如果您在 scrollToItem 之前调用 viewDidLayoutSubviews,这将不起作用。在 scrollToItem 中使用 viewDidLoad 将不起作用。所以在 viewDidLayoutSubviews() 完成后调用这个函数。