Обнаружение смахивания в UICollectionView
Мне нужно выполнить определенное действие, когда пользователь пролистывает uicollectionview. Я построил его так, чтобы каждая ячейка отображала весь экран.
Я попробовал эти способы:
A. scrollViewDidEndDecelerating
# pragma UIScrollView
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
NSLog(@"detecting scroll");
for (UICollectionViewCell *cell in [_servingTimesCollectionView visibleCells]) {
NSIndexPath *indexPath = [_servingTimesCollectionView indexPathForCell:cell];
CGPoint scrollVelocity = [scrollView.panGestureRecognizer velocityInView:_servingTimesCollectionView];
if (scrollVelocity.x > 0.0f)
NSLog(@"going right");
else if (scrollVelocity.x < 0.0f)
NSLog(@"going left");
}
}
Но scrollVelocity
возвращает ноль. Метод вызывается.
B. UISwipeGestureRecognizer
В ViewDidLoad
из моего UIViewController
который делегирует UICollectionViewDataSource
а также UIGestureRecognizerDelegate
Я добавил:
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipeRight:)];
swipeRight.numberOfTouchesRequired = 1;
[swipeRight setDirection:UISwipeGestureRecognizerDirectionRight];
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipeLeft:)];
swipeRight.numberOfTouchesRequired = 1;
[swipeRight setDirection:UISwipeGestureRecognizerDirectionRight];
[_servingTimesCollectionView addGestureRecognizer:swipeRight];
[_servingTimesCollectionView addGestureRecognizer:swipeLeft];
и следующие в UiViewController:
#pragma mark - UISwipeGestureRecognizer Action
-(void)didSwipeRight: (UISwipeGestureRecognizer*) recognizer {
NSLog(@"Swiped Right");
}
-(void)didSwipeLeft: (UISwipeGestureRecognizer*) recognizer {
NSLog(@"Swiped Left");
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
NSLog(@"Asking permission");
return YES;
}
Но никто не называется.
Что случилось? Я разрабатываю для ios7
2 ответа
Вы не устанавливаете делегат жестов:
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipeRight:)];
swipeRight.delegate = self;
swipeRight.numberOfTouchesRequired = 1;
[swipeRight setDirection:UISwipeGestureRecognizerDirectionRight];
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipeLeft:)];
swipeLeft.delegate = self;
swipeLeft.numberOfTouchesRequired = 1;
[swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft];
Я пытался сделать то же самое с вами (с помощью полноразмерных кадров ячеек в UICollectionView). Достаточно просто делегировать с помощью self, потому что UICollectionView может иметь свой собственный распознаватель жестов. Так что ниже трюк работал в мае.
override func viewDidLoad() {
super.viewDidLoad()
collectionView?.backgroundColor = .red
let leftGR = UISwipeGestureRecognizer(target: self, action: #selector(self.swipeHandler_Left(gestureRecognizer:)))
leftGR.numberOfTouchesRequired = 1
leftGR.direction = .left
leftGR.delegate = self
self.view.addGestureRecognizer(leftGR)
}
@objc func swipeHandler_Left(gestureRecognizer : UISwipeGestureRecognizer!) {
if gestureRecognizer.state == .ended {
// Perform action.
print("***Free to Delete Old Cell")
}
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
извините за мой быстрый ответ, пожалуйста, попробуйте перевести объект:)