Жест за панорамиране в 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 overrides в 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

Вие сте на прав път. Запазете препратка към левия си десен gestureRecognizer. След това в shouldReceiveTouch проверете дали редактирането и gestureRecognizer е вашият лево-десен разпознавач

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