Как получить штрихи на UICollectionView в пустое пространство вокруг всех ячеек
У меня есть UICollectionView
, в котором есть разные элементы. Когда я нажимаю на элемент, я использую:
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
чтобы выяснить, что было затронуто, а затем в основном настроить альфа этого представления на 0, чтобы скрыть его. Все работает отлично. Теперь то, что я хотел бы сделать, это когда вы нажимаете на белое пространство, окружающее все UICollectionViewCell
, все виды снова появляются. У меня возникли проблемы с поиском метода, который позволит мне узнать, когда было коснулось белое пространство вокруг ячеек. Есть ли хороший способ сделать это? Я попытался настроить распознаватель жестов, но когда я это сделаю, мой метод
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
не вызывается. Есть ли какой-то способ просто реализовать распознаватель жестов, и оттуда определить, была ли ячейка прослушиваемой и если она скрывает эту ячейку, а также показать все скрытые ячейки? Спасибо.
Ответы
Ответ 1
Мне удалось исправить эту проблему, используя UITapGestureRecognizer
в UICollectionView
backgroundView
. Это в Swift, но идея понятна:
self.tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "handleTap:")
self.tapGestureRecognizer.delegate = self
self.collectionView.backgroundView = UIView(frame:self.collectionView.bounds)
self.collectionView.backgroundView!.addGestureRecognizer(tapGestureRecognizer)
И обратный вызов:
func handleTap(recognizer: UITapGestureRecognizer) {
// Handle the tap gesture
}
Ответ 2
Я столкнулся с похожим сценарием в своем проекте и решил его, выполнив следующие действия:
let tapGestureRecogniser = UITapGestureRecognizer(target: self, action: #selector(handleTapEmptySpaceGesture))
tapGestureRecogniser.delegate = self
collectionView.addGestureRecognizer(tapGestureRecogniser)
Внедрить протокол UIGestureRecognizerDelegate
Затем выполните следующую процедуру в протоколе:
func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
// only handle tapping empty space (i.e. not a cell)
let point = gestureRecognizer.locationInView(collectionView)
let indexPath = collectionView.indexPathForItemAtPoint(point)
return indexPath == nil
}
В принципе, если щелчок находится на ячейке, ваш распознаватель жестов не начинается, что позволяет выполнять нормальный выбор/отменить выбор делегатов. В противном случае, если он находится на пустом месте, ваш распознаватель обрабатывает кран и запускает его обработчик.
Ответ 3
didSelectItem метод делегата будет вызываться только тогда, когда пользователь выбирает collectionViewCell. Пространство между ячейками может варьироваться в зависимости от размера каждой ячейки, вы можете указать только минимальный интервал.
Чтобы получить штрихи, добавьте дополнительный вид в качестве фонового рисунка, изменив его zindex, добавив к нему сенсорное обнаружение. Надеюсь, что это поможет вам.:)
Ответ 4
Это работало для меня на Swift 2.3
Шаг 1: Внедрение протокола UIGestureRecognizerDelegate
Шаг 2: Установите UITapGestureRecognizer в UICollectionView backgroundView
Шаг 3: Обращайтесь к тому, что делать при нажатии на ручку. Функция тэга
class namScreenVcc: UICollectionViewController, UIViewControllerTransitioningDelegate, UIGestureRecognizerDelegate
{
override func viewDidLoad()
{
super.viewDidLoad()
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
tapGestureRecognizer.delegate = self
collectionView!.backgroundView = UIView(frame: collectionView!.bounds)
collectionView!.backgroundView!.addGestureRecognizer(tapGestureRecognizer)
}
func handleTap(recognizer: UITapGestureRecognizer)
{
// Handle the tap gesture
}
}
Ответ 5
немного "косметики" для Swift 4.2: (спасибо другим авторам выше.. :))
// TOUCHES in empty space:
private func addGestureRecognizers(){
let tapGestureRecogniser = UITapGestureRecognizer(target: self, action: #selector(handleTapEmptySpaceGesture))
tapGestureRecogniser.delegate = self
collectionView.addGestureRecognizer(tapGestureRecogniser)
}
@objc func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
// only handle tapping empty space (i.e. not a cell)
let point = gestureRecognizer.location(in: collectionView)
let indexPath = collectionView.indexPathForItem(at: point)
return indexPath == nil
}
Ответ 6
Основано на ответе Пола Попиля, но в Задаче C
Чтобы настроить распознаватель жестов:
//The setup code (in viewDidLoad in your view controller)
UITapGestureRecognizer *singleFingerTap =
[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(handleSingleTap:)];
[self.collectionView addGestureRecognizer:singleFingerTap];
И обработать кран и распознать, касается ли он ячейки или пространства, не покрытого ячейкой
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
CGPoint location = [recognizer locationInView:[recognizer.view superview]];
NSIndexPath* indexPath = [self.collectionView indexPathForItemAtPoint:location];
if (!indexPath)
{
//Handle your selection of the white space in the collection view here. Your code may vary.
[self setSelected:YES];
} else {
//Handle selection of individual cell here
[self collectionView:self.collectionView didSelectItemAtIndexPath:indexPath];
}
}