UISwipeGestureRecognizer和CollectionView滚动到下一个项目indexPath

时间:2017-02-15 10:34:21

标签: ios swift animation

所以我有一张卡片的集合视图,我想要的是当我向左滑动时我希望下一个项目位于中间,document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { try { var uuid = device.uuid; alert(uuid); } catch (e) { alert(e); } }

enter image description here

因此,当我向左滑动时,我希望下一张卡片居中,这不符合正常行为,因为我只想刷一张卡片。

所以我添加了this doesn't work with paging enabledUISwipeGestureRecognizer

类ViewController:UIViewController,UICollectionViewDataSource {

disabled scrolling on the collection view

现在我的问题是如何滚动到下一个项目?既然我不知道indexPath?因为如果我想使用这个@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_cards.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)

有什么建议吗?

//更新 所以我设法让它工作,但只有在我第一次刷卡时才有效:

add one

3 个答案:

答案 0 :(得分:1)

一个解决方案:

1:向您的单元格添加NSIndexPath属性,只需将indexPath设置为cellForItem方法中的属性。

2:获得array of visible cells.

3:Get the rect of the visible单元格并计算它们在屏幕上的位置,您也可以从单元格属性中获取正确的indexPath。

第二个解决方案:

1:在您的手机内容视图中添加UILongPressGestureRecognizer

2:将minimumPressDuration设为0。

3:添加委托方法以激活激活or this.

第三个解决方案:

1:保持滑动手势。

2:And use this method(与选项2相同)indexPathForItemAtPoint:

答案 1 :(得分:0)

为什么你说这不适用于启用分页?在我看来,这实际上应该是最好的方法。您可以将UICollectionViewCells的宽度设置为等于UICollectionView的宽度,将滚动方向设置为水平并启用分页,这应该可以解决问题。

通过这种方式,您不会需要任何UIGestureRecognizers

答案 2 :(得分:0)

好的解决方案就是这个:

@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)
    }
}