Цель-C
В свой myCollectionViewController.h
файл добавьте UIGestureRecognizerDelegate
протокол
@interface myCollectionViewController : UICollectionViewController<UIGestureRecognizerDelegate>
в вашем myCollectionViewController.m
файле:
- (void)viewDidLoad
{
// attach long press gesture to collectionView
UILongPressGestureRecognizer *lpgr
= [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.delegate = self;
lpgr.delaysTouchesBegan = YES;
[self.collectionView addGestureRecognizer:lpgr];
}
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
return;
}
CGPoint p = [gestureRecognizer locationInView:self.collectionView];
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:p];
if (indexPath == nil){
NSLog(@"couldn't find index path");
} else {
// get the cell at indexPath (the one you long pressed)
UICollectionViewCell* cell =
[self.collectionView cellForItemAtIndexPath:indexPath];
// do stuff with the cell
}
}
Swift
class Some {
@objc func handleLongPress(gesture : UILongPressGestureRecognizer!) {
if gesture.state != .Ended {
return
}
let p = gesture.locationInView(self.collectionView)
if let indexPath = self.collectionView.indexPathForItemAtPoint(p) {
// get the cell at indexPath (the one you long pressed)
let cell = self.collectionView.cellForItemAtIndexPath(indexPath)
// do stuff with the cell
} else {
print("couldn't find index path")
}
}
}
let some = Some()
let lpgr = UILongPressGestureRecognizer(target: some, action: #selector(Some.handleLongPress))
Swift 4
class Some {
@objc func handleLongPress(gesture : UILongPressGestureRecognizer!) {
if gesture.state != .ended {
return
}
let p = gesture.location(in: self.collectionView)
if let indexPath = self.collectionView.indexPathForItem(at: p) {
// get the cell at indexPath (the one you long pressed)
let cell = self.collectionView.cellForItem(at: indexPath)
// do stuff with the cell
} else {
print("couldn't find index path")
}
}
}
let some = Some()
let lpgr = UILongPressGestureRecognizer(target: some, action: #selector(Some.handleLongPress))
UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:indexPath];
ссылка здесь надеюсь, что все это заслуживает награды за правильный ответ: Dlpgr.delaysTouchesBegan = YES;
чтобы избежатьdidHighlightItemAtIndexPath
срабатывания в первую очередь.lpgr.delegate = self;
? Он отлично работает без делегата, которого вы также не предоставили.UIGestureRecognizerStateBegan
, поэтому жест используется, когда он распознается, а не когда пользователь отпускает палец.Тот же код @abbood для Swift:
В viewDidLoad:
И функция:
Не забывай делегата
UIGestureRecognizerDelegate
источник
UIGestureRecognizerState.Ended
на,UIGestureRecognizerState.Began
если вы хотите, чтобы код запускался по истечении минимальной продолжительности, а не только тогда, когда пользователь поднимает палец.Используйте делегата UICollectionView, чтобы получить длинное событие нажатия
Вы должны использовать 3 метода ниже.
источник
Ответы здесь на добавление настраиваемого распознавателя жестов при длительном нажатии верны, однако согласно документации здесь : родительский класс
UICollectionView
класса устанавливаетdefault long-press gesture recognizer
для обработки взаимодействий прокрутки, поэтому вы должны связать свой настраиваемый распознаватель жестов касания с распознавателем по умолчанию, связанным с представлением вашей коллекции.Следующий код предотвратит взаимодействие вашего пользовательского распознавателя жестов с распознавателем по умолчанию:
источник
The parent class of UICollectionView class installs a default tap gesture recognizer and a default long-press gesture recognizer to handle scrolling interactions. You should never try to reconfigure these default gesture recognizers or replace them with your own versions.
так что распознаватель длительного нажатия по умолчанию предназначен для прокрутки ... что означает, что он должен сопровождаться вертикальным перемещением ... OP не спрашивает о таком поведении и не пытается его заменитьи добавьте такой метод.
источник
Чтобы иметь внешний распознаватель жестов и не конфликтовать с внутренними распознавателями жестов в UICollectionView, вам необходимо:
Добавьте свой распознаватель жестов, настройте его и запишите ссылку для него где-нибудь (лучший вариант - в вашем подклассе, если вы создали подкласс UICollectionView)
Переопределите методы инициализации по умолчанию
initWithFrame:collectionViewLayout:
иinitWithCoder:
добавьте метод настройки для распознавания жестов при длительном нажатииНапишите свой метод настройки, чтобы он создавал экземпляр распознавателя жестов при длительном нажатии, установите его делегата, настройте зависимости с помощью распознавателя жестов UICollectionView (так что это будет основной жест, а все другие жесты будут ждать, пока этот жест не сработает, прежде чем будет распознан) и добавить жест в представление
Также не забудьте реализовать методы UIGestureRecognizerDelegate, которые не работают с этим жестом и позволяют одновременное распознавание (вам может потребоваться или не обязательно его реализовать, это зависит от других распознавателей жестов, которые у вас есть, или зависимостей от внутренних распознавателей жестов)
учетные данные для этого идут во внутреннюю реализацию LXReorderableCollectionViewFlowLayout
источник
Swift 5:
Также не забудьте реализовать UIGestureRecognizerDelegate и вызвать setupLongGestureRecognizerOnCollection из viewDidLoad или там, где вам нужно его вызвать.
источник
Пожалуй, наиболее распространенным решением является использование UILongPressGestureRecognizer . Но сталкиваюсь с двумя неприятными неприятностями:
Позвольте мне предложить немного грубой силы, но работающей так, как это требуется:
Объявление описания обратного вызова при длительном нажатии на нашу ячейку:
typealias OnLongClickListener = (view: OurCellView) -> Void
Расширение UICollectionViewCell с помощью переменных (мы можем назвать его, например, OurCellView):
Добавляем два метода в наш класс ячейки:
И основные события касания здесь:
Затем где-то в контроллере нашего представления коллекции объявляет прослушиватель обратного вызова:
И, наконец, в настройке callback-функции cellForItemAtIndexPath для наших ячеек:
Теперь мы можем перехватывать длительные нажатия на наши ячейки.
источник