Open acruis opened 6 years ago
I'm seeing this too, what's your solution @acruis ?
For now I'm working around it by only injecting the layout in the init
(basically the snippet below "instead of this").
If you have to set the collectionViewLayout
manually then...I'm not sure there's much you can do. The layout does expose its gesture recognizers but setupCollectionView
sets the ivars directly instead of calling the property setters, which means you can't rely on KVO.
Off the top of my head I have some wild hacks, but none of them are that nice:
if (self.collectionView != nil) {
, you can subclass LXReorderableCollectionViewFlowLayout
and override the getter of collectionView
, which lets you run some code before the gesture recognizers go stale, something like:class CustomFlowLayout: LXReorderableCollectionViewFlowLayout {
var settingCollectionView: Bool = false
override var collectionView: UICollectionView? {
let collectionView = super.collectionView
if let gestureRecognizer = self.panGestureRecognizer, self.settingCollectionView {
collectionView?.removeGestureRecognizer(gestureRecognizer)
}
return collectionView
}
}
...
// (when setting the flow layout)
let reorderableFlowLayout = CustomFlowLayout()
reodrerableFlowLayout.settingCollectionView = true
collectionView.collectionViewLayout = reorderableFlowLayout
reorderableFlowLayout.settingCollectionView = false
I haven't tried this myself, so I'm not sure if it even works though.
UICollectionView
to override the addGestureRecognizer
call to somehow keep track of existing gesture recognizers and remove stale ones accordingly, but if you go that far...
There is a behaviour on the current iOS version (11.4, not sure when this behaviour started) where if a collection view's layout is set after initialization - instead of it being passed inside
init(frame:collectionViewLayout:)
- thecollectionView
property will be set twice.That is, if you do this
instead of this
KVO will cause
setupCollectionView
to be called twice. Consequently the storedpanGestureRecognizer
is replaced with a new one, but the old one is still listening to gestures on the collection view.This breaks scrolling, because scrolling over the collection view when
self.selectedItemIndexPath
isnil
should not triggerhandlePanGesture
, but it does because thisreturns
true
for the replaced (but still listening) pan gesture recognizer.