2016-07-19 2 views
0

У меня есть CollectionView, ячейка в CollectionView имеет размер, равный экрану (CollectionView имеет режим разрешающей пейджинговой связи).Длительное нажатие для показа слайдов

Я хочу нажать долго на экране, затем CollectionView прокрутится до следующей ячейки.

Например:

мне нужно 1 секунду, чтобы сделать CollectionView свиток к следующей ячейке, и нажатии на 2,5 секунды.

Начало: Я начинаю долгое нажатие на экране, и теперь коллекция открывается в первой ячейке.

После первой секунды: он перейдет во вторую ячейку.

После второй секунды: он будет прокручиваться до третьей ячейки.

Последняя половина секунды: она все еще стоит на третьей ячейке (потому что половина секунды не хватает времени, чтобы сделать просмотр коллекции прокруткой до следующей ячейки).

Я добавил UILongPressGestureRecognizer в клетку, и я попытался так:

func handleLongPress(longGesture: UILongPressGestureRecognizer) { 
     if longGesture.state == .Ended { 
      let p = longGesture.locationInView(self.collectionView) 
      let indexPath = self.collectionView.indexPathForItemAtPoint(p) 

      if let indexPath = indexPath { 
       let row = indexPath.row + 1 
       let section = indexPath.section 
       if row < self.photoData.count { 
       self.collectionView.selectItemAtIndexPath(NSIndexPath(forRow: row, inSection: section), animated: true, scrollPosition: .Right) 
       } 
       print(indexPath.row) 
      } else { 
       print("Could not find index path") 
      } 
     } 
    } 

Но я всегда должен КОНЦА длинный жест, чтобы сделать вид коллекции свиток.

ответ

0

Вот как я попробовал:

Во-первых, я добавляю эти свойства на мой контроллер:

var counter = 0 
var timer = NSTimer() 
var currentIndexPath: NSIndexPath? 

Тогда я подсчитывать counter когда longGesture.state == .Began

func handleLongPress(longGesture: UILongPressGestureRecognizer) { 
    if longGesture.state == .Began { 
     let point = longGesture.locationInView(self.collectionView) 
     currentIndexPath = self.collectionView.indexPathForItemAtPoint(point) 

     self.counter = 0 
     self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(ODIProfileAlbumMode4TableViewCell.incrementCounter), userInfo: nil, repeats: true) 
    } else if longGesture.state == .Ended { 
     self.timer.invalidate() 
    } 
} 

func incrementCounter() { 
    self.counter += 1 
    print(self.counter) 
    if let indexPath = currentIndexPath { 
     let section = indexPath.section 
     if self.counter < self.photoData.count { 
      self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forRow: self.counter, inSection: section), atScrollPosition: .Right, animated: true) 
     } else { 
      self.counter = 0 
      self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forRow: 0, inSection: section), atScrollPosition: .Right, animated: true) 
     } 
    } else { 
     print("Could not find index path") 
    } 
} 

Он работает отлично сейчас. :)

1

То, что вы, кажется, хотите, это то, что запускает таймер, который срабатывает каждые 1 секунду, пока палец опущен. Я бы, наверное, сделать функцию:

func scrollCell() { 
     if (longPressActive) { 
      //scroll code 

      let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) 
      dispatch_after(dispatchTime, dispatch_get_main_queue(), { 
       scrollCell() // function calls itself after a second 
      }) 
     } 
    } 

Что вы могли бы контролировать в вашем коде handleLongPress:

func handleLongPress(longGesture: UILongPressGestureRecognizer) { 
    if longGesture.state == .Began { 
     longPressActive = true 
     scrollCell() 
    } else if longGesture.state == .Ended || longGesture.state == .Canceled { 
      longPressActive = false 
     } 
    } 

Итак, когда длительное нажатие жест первые пожары, он устанавливает логическое значение (longPressActive), и затем вызывает функцию прокрутки. Когда функция прокрутки завершается, она снова вызывает себя. Если жест будет завершен, он очистит longPressActive bool, поэтому, если таймер срабатывает, bool будет false, и он не будет прокручиваться.

В идеале я бы, вероятно, не использовал длинный распознаватель жестов в печати и просто отслеживал касания сам, так как я мог бы ссылаться на прикосновение и проверять его состояние, а не использовать логическое. Кроме того, есть, вероятно, забавная ошибка, связанная с отправкой, когда она идет в фоновом режиме.

+0

Я решил эту проблему, вы можете проверить мой собственный ответ. Кстати, ваш ответ хорош. +1 – Khuong