可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a UICollectionView which is about the size of the screen. The UICollectionViewCells that it displays are the same size as the collectionView. Each cell has a UIImage which is the size of the cell. The CollectionView has paging enabled so essentially it is a full screen photo slideshow that the user can swipe through.
The problem is that
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
is only being called if the user taps with two fingers on a cell or long presses with one finger and then releases. It does not seem to have the default behaviour of single tap selection. I have not made any changes to the CollectionView gesture recognizer so am having trouble finding a solution to this problem.
回答1:
Are you sure you're not accidentally overriding - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath
? "Select" vs. "deselect" has tripped me up in the past with Xcode's code completion.
回答2:
I was just having the same problem and it turned out that there was a UITapGestureRecognizer
on the UIView
containing the UICollectionView
and it was responding instead.
That explains why didSelectItemAtIndexPath
works only if the user taps with two fingers or long presses with one finger because that doesn't trigger the UITapGestureRecognizer
.
So, check all the UITapGestureRecognizer
you got there, not necessarily on the UICollectionView
directly but it could be on any UIView
containing it.
回答3:
If you have a view on the cell which obstructs the cells content view that is intractable then you will not be able to hook into the delegate callback for the cell.
You will want to disable user interaction on the obstructing view either in the NIB or in the code.
view.userInteractionEnabled = NO;
回答4:
Just add to the already resolved question one more situation where the tap gesture might not work, since this did keep tormenting me.
If you return false
within UICollectionViewDelegate'
s collectionView:shouldHighlightItemAtIndexPath:
, the tap gesture won't function and the collectionView:didSelectItemAtIndexPath:
would not be called. The default return value of this delegate method is true
, so you won't have the problem if you don't implement it deliberately.
回答5:
I just ran into this problem myself. Originally I had buttons and labels, then I refactored my UI and turned those button/labels into cells for a UICollectionView
.
I eventually realized the buttons were consuming my taps. I had unthinkingly just moved my original buttons into the cell, and not turned it into a straight UIImage
. I had destroyed the actions associated buttons and was just looking for cell selection so I took me a while to figure it out.
Stupid and obvious in retrospect, but took me a couple hours to realize what I had done.
回答6:
I just had the same problem...I was overriding touchesBegan in the CollectionCell view and this caused the didSelectItemAtIndexPath to not fire when I touched the cell. Removed the override and all worked.
回答7:
If you use only didselect:
self.collectionView.allowsMultipleSelection = false
Or delete that line.
回答8:
I ran into this problem in Swift 3 and xcode 8 , I had a view and a collection view inside this.The collection view has userInteractionEnabled to true , still it was not working.Fixed this issue by overriding shouldHighlightItemAt , I dont have any extra / custom implementation in this method , so i did not override this method.After adding the below code the didSelectItem method is called.
func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
return true
}
回答9:
I'm happened to stumble upon this problem, and it frustrated me one long day until I found this You just need to uncheck "User Interaction Enabled"
when I selected the Cell on the top left inside the CollectionView in Storyboard. and problem solved
回答10:
I faced a similar problem and the culprit in my case turned out to be the CardView I was using in UICollectionView Cell's heirarchy. As soon as I disabled the user interaction for the CardView the collectionView started responding to the touch events.
回答11:
In my case it was just
self.collectionView.allowsSelection =NO;
I had in code.
changing to
self.collectionView.allowsSelection =YES;
fix it.
回答12:
In case it helps, this just bite me in a silly way spending a couple of hours. Double check if your custom cell is subclassing UICollectionViewCell instead of, let's say, UICollectionReusableView