Длительное нажатие на слайд-шоу изображений

ios objective-c swift collectionview

120 просмотра

2 ответа

6351 Репутация автора

У меня есть 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")
            }
        }
    }

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

Автор: Khuong Источник Размещён: 19.07.2016 02:22

Ответы (2)


1 плюс

721 Репутация автора

То, что вы, кажется, хотите, это то, что запускает таймер, который срабатывает каждую 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
        }
    }

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

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

Автор: n_b Размещён: 19.07.2016 03:03

0 плюса

6351 Репутация автора

Решение

Вот как я пытался:

Сначала я добавляю эти свойства в мой контроллер:

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

Теперь это прекрасно работает. :)

Автор: Khuong Размещён: 19.07.2016 03:39
Вопросы из категории :
32x32