Ios UISwipegestureRecognitor和CollectionView滚动到下一项 所以我有一张卡片的集合视图,我想要的是当我左转时,我希望下一个项目在中间居中,这不适用于启用分页的
所以当我向左刷卡时,我希望下一张卡居中,这不符合正常行为,因为我只想刷卡一张 因此,我添加了Ios UISwipegestureRecognitor和CollectionView滚动到下一项 所以我有一张卡片的集合视图,我想要的是当我左转时,我希望下一个项目在中间居中,这不适用于启用分页的 ,ios,swift,animation,Ios,Swift,Animation,所以当我向左刷卡时,我希望下一张卡居中,这不符合正常行为,因为我只想刷卡一张 因此,我添加了uisweegestureerecognizer和禁用了集合视图上的滚动 类ViewController:UIViewController、UICollectionViewDataSource{ @IBOutlet var joke_cards: UICollectionView! override func viewDidLoad() { super.viewDidLoad();
uisweegestureerecognizer
和禁用了集合视图上的滚动
类ViewController:UIViewController、UICollectionViewDataSource{
@IBOutlet var joke_cards: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad();
//Add gestures
let leftSwipeGest = UISwipeGestureRecognizer(target: self, action: #selector(funcForGesture))
leftSwipeGest.direction = .left
joke_cards.addGestureRecognizer(leftSwipeGest)
}
func funcForGesture(sender: UISwipeGestureRecognizer){
if sender.direction == .left {
//scroll to next item
}
}
现在我的问题是如何滚动到下一项?因为我不知道indexPath?因为如果我想使用这个self.joke\u cards.scrollToItem(at:indexPath,at:.centered横向,动画:true)
,我需要索引路径,因此我想我需要在视图中找出当前的indexath,并在用户滑动时添加一个
有什么建议吗
//更新
所以我设法让它工作,但它只在我第一次刷卡时起作用:
func funcForGesture(sender: UISwipeGestureRecognizer){
if sender.direction == .left {
//scroll to next item
let cellItems = self.joke_cards.indexPathsForVisibleItems
let next = cellItems[0] as! IndexPath
self.joke_cards.scrollToItem(at: next, at: .centeredHorizontally, animated: true)
}
}
一种解决方案: 1:在单元格中添加一个
nsindepath
属性,只需在cellForItem
方法中将indepath设置为该属性即可
2:找一个
3:单元格并计算它们在屏幕上的位置,您可以从cell属性中获得正确的indexPath
第二种解决方案:
1:向单元格内容视图中添加
2:设置为0
3:将委托方法添加到fire acitons
第三种解决方案:
1:保持刷卡姿势
2:(与选项2相同)为什么你说这在启用分页的情况下不起作用?在我看来,这实际上应该是最好的方法。你只需将
UICollectionViewCells
的宽度设置为等于UICollectionView
的宽度,将滚动方向设置为水平并启用分页,就可以了ck
这样,您就不需要任何
UIgestureRecognitors
好的,因此解决方案如下:
@IBOutlet var joke_cards: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad();
//Add gestures
let leftSwipeGest = UISwipeGestureRecognizer(target: self, action: #selector(funcForGesture))
leftSwipeGest.direction = .left
joke_cards.addGestureRecognizer(leftSwipeGest)
}
func funcForGesture(sender: UISwipeGestureRecognizer){
if sender.direction == .left {
//scroll to next item
let cellItems = self.joke_cards.indexPathsForVisibleItems
self.joke_cards.scrollToItem(at: cellItems.max()!, at: .centeredHorizontally, animated: true)
}
}
您的卡是什么?一个collectionview单元格还是?是,每张卡都是一个collectionview单元格,因此您可以使用self.joke\u cards.scrollToItem(在:indexPath,在:。Centered水平,动画:true)根据你的数组值作为下面回答中的第一个解决方案我成功了,查看我的更新帖子,但它只在第一次刷卡时起作用,我做错了什么?谢谢!@Uffo我很高兴它起作用。我不知道什么对你不起作用?刷卡方法会启动吗?我想也许你应该在fir之前处理不同的状态手势对操作进行初始化:,这只是开始,您应该按照自己认为合适的方式正确处理它们。是的,它可以正常工作,但只有第一次滑动,第二次没有任何作用,该方法启动,我发出了一条调试消息,我想这是因为let next=cellItems[0]作为!indexath,我认为每次都需要更新索引键,我不知道如何更新,第二次应该是[cellItems][1]@Uffo,当您接收数组中的单元格时,使用此方法获取IndexPath:let IndexPath=self.collectionView.indexath(for:cell),请注意,您可以检查多个单元格的indexPath,只需将它们进行比较,然后根据您要向右或向左滑动,查看哪个indexPath.item为“最高”还是“最低”。因为根据您的图像,您总是可以看到3个项目。您也可以尝试数组的“lastItem”或“firstItem”,看看什么最适合你。你把我搞糊涂了,它不是这样工作的:func funcForGesture(发送者:UISwipegestureRecognitizer){如果发送者.direction=.left{//滚动到下一个项目let cellItems=self.joke\u cards.indexPathsForVisibleItems let indexath=self.joke\u cards.indexPath(for:cellItems)self.joke_cards.scrollToItem(at:indexPath,at:.centeredHorizontal,动画:true)}好吧,它可以工作……但它可以一次滚动多个项目,我不希望这种情况不应该发生。分页背后的整个想法是一次只滚动一个视图。我已经使用过多次,而且效果很好。这甚至是苹果提供的定义:UIScrollView类支持分页模式,该模式将用户启动的滚动操作限制为一次滚动相当于一个屏幕的内容。此模式用于显示连续内容,如电子书或一系列说明