我在UICollectionView
内有UIViewController
并启用了分页功能。出于某些奇怪的原因,collectionView.scrollToItem
在collectionview
的方向为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")
}
答案 0 :(得分:28)
对于这部分:
collectionView.scrollToItem(at: i, at: .top, animated: true)
当滚动方向为horizontal
时,您需要使用at: left
,at: right
或at: centeredHorizontally
。 at: top
用于vertical
方向。
答案 1 :(得分:7)
我在流程布局中实现此功能时遇到问题,每个项目都输入了分页。 .centeredHorizontally对我来说不起作用所以我使用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)
显然,UICollectionView
中存在一个新错误,该错误导致启用分页时scrollToItem
无法正常工作。解决方法是在调用scrollToItem
之前先禁用分页,然后再重新启用它:
collectionView.isPagingEnabled = false
collectionView.scrollToItem(
at: IndexPath(item: value, section: 0),
at: .centeredHorizontally,
animated: true
)
collectionView.isPagingEnabled = true
答案 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)
}
答案 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()
完成后调用这个函数。