Ios Swift-UICollection在项目稍微滚动时回缩过快

Ios Swift-UICollection在项目稍微滚动时回缩过快,ios,swift,uiscrollview,uicollectionview,Ios,Swift,Uiscrollview,Uicollectionview,我正试图使UICollectionView捕捉回它附近任何项目单元格的中心, 但问题是,当我稍微移动它一点时,它会太快地回到细胞中心,而细胞中心看起来并不平滑, 是否可以忽略或禁用滚动,除非用户滑动到下一个项目,而不是使scrollview捕捉到相同的项目 这是我的抓拍代码 func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset:

我正试图使UICollectionView捕捉回它附近任何项目单元格的中心, 但问题是,当我稍微移动它一点时,它会太快地回到细胞中心,而细胞中心看起来并不平滑,
是否可以忽略或禁用滚动,除非用户滑动到下一个项目,而不是使scrollview捕捉到相同的项目

这是我的抓拍代码

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

    let layout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    let cellWidthIncludingSpacing = layout.itemSize.width + layout.minimumLineSpacing
    var offset = targetContentOffset.pointee

    let index = (offset.x + scrollView.contentInset.left ) / cellWidthIncludingSpacing
    let roundedIndex = round(index)

    self.lastContentOffset = scrollView.contentOffset.x
    offset = CGPoint(x: roundedIndex * cellWidthIncludingSpacing - scrollView.contentInset.left, y: -scrollView.contentInset.top)

    targetContentOffset.pointee = offset


}
func-scrollViewWillendDraging(scrollView:UIScrollView,withVelocity:CGPoint,targetContentOffset:UnsafemeutablePointer){
让layout=self.collectionView.collectionViewLayout为!UICollectionViewFlowLayout
让cellWidthIncludingSpacing=layout.itemSize.width+layout.minimumLineSpacing
var offset=targetContentOffset.pointee
let index=(offset.x+scrollView.contentInset.left)/cellWidthIncludingSpacing
设roundedIndex=四舍五入(索引)
self.lastContentOffset=scrollView.contentOffset.x
偏移量=CGPoint(x:roundedIndex*单元格宽度,包括间距-scrollView.contentInset.left,y:-scrollView.contentInset.top)
targetContentOffset.pointee=偏移量
}
编辑: 这就是它从物理设备恢复的方式。 它在这里比较慢,因为它是gif


由于您正在直接设置contentOffset,因此它会自动恢复。相反,您应该调用UIScrollViewMethod,并将动画设置为true。如果您仍然不喜欢这些结果,那么请考虑实现UICLoeDebug布局方法,然后布局会自动地返回到您返回的点。

它的回扣,因为您正直接设置内容偏移量。相反,您应该调用UIScrollViewMethod,并将动画设置为true。如果你仍然不喜欢这些结果,那么考虑一下,实现UICLoeDebug布局方法,然后布局会自动地返回到你返回的点。-如果你用手指而不是鼠标,它可能会感觉更正确。@luk2302是的,我用过,而且它仍然会很快恢复,看起来有点像laggy。请记住,我使用的是UIScrollView.DecelerationRate.fast。我想通过更新UICollectionViewFlowLayout,你会有更好的控制,一个很好的例子是:“是否可以忽略或禁用滚动,除非用户滑动到下一个项目,而不是使scrollview捕捉到同一项目?”。。。因此,如果用户开始一个手势,比如说到目前为止只拖动了一厘米,你是说你根本不想让它移动,根本不给用户反馈他们的手势被识别了吗?你是说你根本不想让拖拽动作被识别,而只想让拖拽动作被识别?@Rob我的意思是如果用户拖拽速度很快,你就会移动到另一个项目,我真的很想增加滑动手势识别器我正在考虑,如果我没有摆脱拉格的回击,你有没有在实际的设备上用实际的手指作为输入“设备”进行测试-如果你用手指而不是鼠标,它可能会感觉更正确。@luk2302是的,我用过,而且它仍然会很快恢复,看起来有点像laggy。请记住,我使用的是UIScrollView.DecelerationRate.fast。我想通过更新UICollectionViewFlowLayout,你会有更好的控制,一个很好的例子是:“是否可以忽略或禁用滚动,除非用户滑动到下一个项目,而不是使scrollview捕捉到同一项目?”。。。因此,如果用户开始一个手势,比如说到目前为止只拖动了一厘米,你是说你根本不想让它移动,根本不给用户反馈他们的手势被识别了吗?你是说你根本不想让拖动手势被识别,而只想让滑动手势被识别?@Rob我的意思是如果用户拖动速度很快,就会移动到另一个项目,我真的很想添加滑动手势识别器,我正在考虑,如果我没有摆脱那个拉格的回拍,我尝试了setContentOffset(:动画:)在上面相同的代码中,有时它会捕捉到项目的中心,有时它什么也不做,targetContentOffsetForProposedContentOffset:WithCrollingVelocity:我使用了上面相同的代码,但返回了偏移量,并用collectionView替换每个scrollView,用collectionView.contentOffset替换targetContentOffset.pointee,但我似乎做错了什么,因为它没有做任何事情您实现的ScrollViewWillendDraging与targetContentOffsetForProposedContentOffset:with CrollingVelocity:不同。在ScrollViewWillendDraging中,您可以手动设置偏移并取消设置偏移。如果您在targetContentOffsetForProposedContentOffset:WithCrollingVelocity:中返回建议的偏移量,则集合视图将减速并设置动画到您返回的位置。我在上面的同一代码中尝试设置ContentOffset(u:animated:),有时它会捕捉到项目的中心,有时它什么也不做,targetContentOffsetForProposedContentOffset:WithCrollingVelocity:我使用了上面相同的代码,但返回了偏移量,并用collectionView替换每个scrollView,用collectionView.contentOffset替换targetContentOffset.pointee,但我似乎做错了什么,因为它没有做任何事情您实现的ScrollViewWillendDraging与targetContentOffsetForProposedContentOffset:with CrollingVelocity:不同。在ScrollViewWillendDraging中,您可以手动设置偏移并取消设置偏移。如果在targetContentOffsetForProposedContentOffset:WithCrollingVelocity:中返回建议的偏移量,则集合视图将减速并设置动画到返回的位置。