2017-02-15 7 views
0

Так у меня есть представление коллекции карт, и то, что я хочу, когда я пальцем влево Я хочу следующий пункт, который будет располагаться в середине, this doesn't work with paging enabledUISwipeGestureRecognizer и CollectionView прокрутки к следующему пункту indexPath

enter image description here

Итак, когда я сажусь влево, я хочу, чтобы следующая карта была центрирована, это не работает с нормальным поведением, потому что я просто хочу пронести по одной карте.

Так я добавил UISwipeGestureRecognizer и disabled scrolling on the collection view

класса 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_cards.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true), мне понадобится указательный путь, поэтому я думаю, что мне нужно выяснить текущий indexPath в представлении и add one, когда пользователь проведет поиск.

Любые предложения?

// обновленный Так мне удалось заставить его работать, но это работает только тогда, когда я красть в первый раз:

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) 
    } 
} 
+0

Что ваша карта? Ячейка коллекции или –

+0

Да, каждая карта представляет собой ячейку коллекции. – Uffo

+0

Итак, вы можете использовать self.joke_cards.scrollToItem (at: indexPath, at: .centeredHorizontally, animated: true) в соответствии с вашими значениями массива –

ответ

1

Одно из решений:

1: Добавить NSIndexPath свойство для ваших ячеек и просто установите indexPath для свойства в вашем методе cellForItem.

2: Получить array of visible cells.

3: Get the rect of the visible клетки и вычислить их положение на экране, и вы можете allso получить правильный indexPath из свойства клеток.

Второе решение:

1: Добавить UILongPressGestureRecognizer на свой мобильный contentView

2: Установите minimumPressDuration 0.

3: Добавить методы делегата стрелять acitons or this.

Третье решение:

1: Держите свой жест жестов.

2: And use this method (такой же, как вариант 2) indexPathForItemAtPoint:

+0

Я получил его работать, проверять мой обновленный пост, но он работает только для первого прокрутки, что я делаю неправильно? Спасибо! – Uffo

+0

@Uffo Я рад, что это сработало. Я не знаю, что не работает для вас? Способ стрельбы вообще срабатывает? Я думаю, что, возможно, вам нужно будет обрабатывать разные жесты перед тем, как активировать действие: https://developer.apple.com/reference/uikit/uigesturerecognizerstate/uigesturerecognizerstatebegan, это только что началось, вы должны обрабатывать их все правильно, как вы сочтете нужным. –

+0

Да, он работает, он работает, но только в первый раз, второй раз ничего не делает, метод срабатывает, я помещаю сообщение об отладке, я думаю, из-за того, что let next = cellItems [0] as! IndexPath Я думаю, что индексный ключ нужно обновлять каждый раз, и я не знаю, как это сделать, во второй раз это должно быть [cellItems] [1] – Uffo

0

Почему вы говорите, что это не работает с подкачкой включен? На самом деле это должен быть лучший способ сделать это, на мой взгляд. Вы можете просто сделать ширину UICollectionViewCells равной ширине UICollectionView, установить направление прокрутки в горизонтальное положение и включить пейджинг, что должно сделать трюк.

Таким образом, вам не нужны никакие UIGestureRecognizers.

+0

Ну, это работает ... но он может прокручивать несколько элементов за один раз, и я не хочу, чтобы это – Uffo

+0

Это не должно быть так , Вся идея пейджинга - прокрутка только одного представления за раз. Я использовал его несколько раз, и он сработал. Это даже определение, предоставленное яблоком: «Класс UIScrollView поддерживает режим подкачки, который ограничивает действие прокрутки, инициированное пользователем, для одновременного прокрутки одного экрана с количеством контента. Этот режим используется при отображении последовательного содержимого, такого как электронная книга или ряд инструкций ». –

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) 
    } 
} 
+0

Я до сих пор не понимаю, почему вы не сделали этого с пейджинговым .. –