Жест панорамирования в UICollectionViewCell и UICollectionView

У меня есть представление коллекции баров, которые могут скользить вверх и вниз. Каждая ячейка в представлении коллекции использует UIPanGestureRecognizer для управления синей полосой, скользящей вверх и вниз. Представление коллекции здесь не прокручивается.

Активный

Существует «режим редактирования», который отключает жест панорамирования, управляющий полосами. Надежда здесь в том, что в «режиме редактирования» представление коллекции может прокручиваться влево и вправо.

Режим редактирования

Моя попытка сделать это состояла в том, чтобы отключить жест панорамирования в каждой из ячеек. Я также пытался использовать методы UIGestureRecognizerDelegate, чтобы попытаться отключить касания и отказаться от жеста панорамирования ячейки в пользу жеста панорамирования представления коллекции. Кажется, что жест панорамирования представления коллекции не перенаправляется ни на один из вызовов делегата жеста ячейки.

Эти вызовы делегатов подошли мне ближе всего (делегат для жеста панорамирования ячейки):

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    return !self.editMode  // bar doesn't need to pan in edit mode
}

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

РЕДАКТИРОВАТЬ: я загрузил пример проекта проблемы на github.


person keithbhunter    schedule 26.05.2015    source источник


Ответы (3)


Если я правильно понял, то думаю проблема может быть в следующем:

  1. Ваш UICollectionView будет прослушивать жесты панорамирования. Все идет нормально.
  2. В KBHBarSlider вы добавляете UIPanGestureRecognizer для своих ползунков. Они имеют «приоритет» над нижележащим UICollectionView.

Это на самом деле имеет смысл, так как ваши BarSliders находятся над CollectionView. Лучше всего было бы позволить BarSliders добавлять UIPanGestureRecognizer при необходимости и полностью удалять их при редактировании.

Итак, сначала попробуйте удалить gestureRecognizer, который вы добавили в VOLBarSliderCell.

Затем в KBHBarSlider добавьте что-то вроде: (и убедитесь, что ваш init вызывает addPanRecognizer() вместо setup())

func addPanRecognizer() {
    let panGesture = UIPanGestureRecognizer(target: self, action: "viewDidPan:")
    self.gestureRecognizers = [panGesture]
}

func removePanRecognizer() {
  self.gestureRecognizers = []
}

Теперь можно добавлять и удалять жесты по требованию, делайте это из своих переопределений get/set редактирования в VOLBarSliderCell:

var editing: Bool = false {
    didSet {            
        if !self.editing {
            self.barSlider.addPanRecognizer()
            // Removed code, to keep this example short...
        } else {
            self.barSlider.removePanRecognizer()
            // Removed code, to keep this example short...
        }
    }
}
person Mikael Hellman    schedule 29.05.2015

Попробуйте добавить этот код в VOLBarSliderCell:29:

self.panGesture.enabled = !self.editing

И удалить:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    if self.editing && gestureRecognizer == self.panGesture {
        return false
    }

    return true
}

Честно говоря, ваша проблема не была мне ясна, поэтому я все равно попытался ответить, поскольку пока не могу комментировать, чтобы запросить разъяснения.

Я понял, что вы хотите прокрутить свой UICollectionView, пока находитесь в режиме редактирования. Вот что делает приведенный выше код. Если вы хотите полностью отключить прокрутку UICollectionView, НЕ редактируя, вы можете использовать scrollEnabled = false в UICollectionView.

Уточните немного лучше, какую проблему вы пытаетесь решить. Так вы сможете дать точные ответы.

person pemello    schedule 29.05.2015

Вы на правильном пути. Сохраните ссылку на свой распознаватель жестов leftRight. Затем в shouldReceiveTouch проверьте, не редактирует ли и распознаватель жестов ваш распознаватель leftRight.

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    if(self.editing && gestureRecognizer != self.leftRightRecognizer){
        return 0;
    }
    return 1; 
}
person dave234    schedule 26.05.2015
comment
Это дало мне примерно ту же функциональность, что и когда я сам реализовал делегаты жестов. Это работает примерно в 3 случаях из 10. И я не могу объяснить, как и почему это происходит. - person keithbhunter; 27.05.2015
comment
Можете ли вы заставить режим редактирования работать без каких-либо распознавателей ячеек? - person dave234; 27.05.2015
comment
Я играю с этим прямо сейчас. Я загрузил образец проекта здесь на случай, если вы захотите посмотреть сами. - person keithbhunter; 27.05.2015