Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIcollectionView scrollToitemAtIndexPath不适用于不可见的单元格_Ios_Swift_Uicollectionview_Uicollectionviewcell - Fatal编程技术网

Ios UIcollectionView scrollToitemAtIndexPath不适用于不可见的单元格

Ios UIcollectionView scrollToitemAtIndexPath不适用于不可见的单元格,ios,swift,uicollectionview,uicollectionviewcell,Ios,Swift,Uicollectionview,Uicollectionviewcell,我不熟悉iOS和Swift 已成功创建一个UICollectionView,其中包含自定义布局属性和可重用的自定义单元格,用于计算图像的高度。 太好了。工作正常,我可以手动滚动。一切都好 问题是我想通过编程方式滚动到第n个indexPath,但ScrollToItemAtIndePath似乎只适用于可见的 因此,我需要2列图片,在iphone 5S上显示9张图片。 图像总数为31 因此,使用collectionView的ScrollToItemAtIndexPath最多可用于第9项 然而,当我尝

我不熟悉iOS和Swift

已成功创建一个UICollectionView,其中包含自定义布局属性和可重用的自定义单元格,用于计算图像的高度。 太好了。工作正常,我可以手动滚动。一切都好

问题是我想通过编程方式滚动到第n个indexPath,但ScrollToItemAtIndePath似乎只适用于可见的

因此,我需要2列图片,在iphone 5S上显示9张图片。 图像总数为31

因此,使用collectionView的ScrollToItemAtIndexPath最多可用于第9项

然而,当我尝试按编程方式进一步滚动时,比如说第12次滚动,它不起作用。 奇怪的是,如果手动滚动,然后调用代码,它就会工作。 所以我调试了一下,发现只有前9个单元格是用高度计算的。 这就是问题所在吗?如果是这样的话,我怎样才能让它工作呢

我尝试过使用DidLayoutSubView和其他视图的建议,但都不起作用

目前,我正在使用didSelectItemAtIndexPath collectionView函数以编程方式滚动

编辑:

即使我硬编码索引路径的编号(例如12),它仍然不起作用。 如果需要更多信息,请告诉我

我是不是遗漏了什么


非常感谢。

您应该在视图中调用scrollToItemAtIndexPath方法。这样,cellForItemAtIndexPath就已经被调用了

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

    collectionView.scrollToItemAtIndexPath(NSIndexPath(forRow: index, inSection: 0), atScrollPosition: .CenteredVertically, animated: false)

}

起初我对Lilo的答案投了赞成票,但我注意到将代码添加到ViewDidAspect会导致我的水平collectionView突然滚动/动画到我希望滚动到的索引

正确的方法

在视图中将出现,在调用
collectionView.scrollToItem
之前,调用
view.layoutifneed()
,场景出现时不会出现突然的视觉滚动

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    view.layoutIfNeeded() // call this before you call scrollToItem

    let lastItemIndex = NSIndexPath(forItem: item, inSection: 0)
    collectionView.scrollToItem(at: lastItemPath, at: .centeredHorizontally, animated: false)

}

当我尝试滚动到不可见的单元格并在indexPath中获取该单元格时,这对我很有帮助:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    collectionView.scrollToItem(at: indexPath, at: .centeredVertically, animated: false)
    view.layoutIfNeeded()
    // here you can get a cell
}

请在问题中添加一些代码。你想什么时候滚动?您的代码滚动到给定NSIndexPath的效果如何?您能否澄清“目前,我正在使用didSelectItemAtIndexPath collectionView函数以编程方式滚动”的含义?这可能与您的问题有关。另外,是的,请将一些代码发布到help@beeef谢谢你的快速回复,这是滚动的代码。@DougMead谢谢你的回复。我有一个来自另一个ViewController的导航,它传递了一个要在此UICollectionView中使用的对象数组,以及导航完成时导航到哪个索引的信息。然而,这并没有起到很好的作用,我通过使用didSelectItemAtIndexPath,尝试导航到特定的indexPath.Hmm,使它变得简单了一点。didLayoutSubviews()会被多次调用(甚至在滚动时可能会被重复调用),因此这可能不是最佳选择。另外,我注意到您将滚动位置设置为中间位置。为了清楚起见(如果你还不知道的话),UICollectionView使用的是空白。因此,如果您试图滚动到最后一个项目,例如,它将不会滚动到中心。它将保留在底部。滚动在视图中不起作用。很遗憾,它将出现。即使我事先调用view.layoutifneed()。然而,我的代码库是客观的C。这有关系吗?@ErayAlparslan它在Swift中对我有效,我不能在Obj-C上发言。尝试viewDidLayoutSubviews,但使用bool确保它运行一次。对于ex var didLayoutSubviewsRun=false,则在viewDidLayoutSubviews中,如果为false,则将其更改为true,然后添加cv.scrollToItem afterwards感谢您的响应。当我在主线程中滚动它时,它对我很有效。如果答案对我有效,那么它将帮助其他人。干杯!
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    collectionView.scrollToItem(at: indexPath, at: .centeredVertically, animated: false)
    view.layoutIfNeeded()
    // here you can get a cell
}