问题
I have designed a UICollectionViewCell using XIB and in that custom cell I have an UILabel whose user interaction I have enabled.
In my viewcontroller when I am designing the cell, Here is my code.
UITapGestureRecognizer *buyNowTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(buyNowClicked:)];
buyNowTapped.numberOfTapsRequired = 1.0;
cell.buy.tag = indexPath.row;
cell.buy.userInteractionEnabled = YES;
[cell.buy addGestureRecognizer:buyNowTapped];
-(void)buyNowClicked : (id)sender
{
UIButton *button;
UILabel *label;
if([sender isKindOfClass:[UIButton class]])
{
button = (UIButton *)sender;
[self buyService:button.tag];
}
else if ([sender isKindOfClass:[UILabel class]])
{
label = (UILabel *)sender;
[self buyService:label.tag];
}
}
But the added tap gesture does not work.
回答1:
create custome cell with tag property and use
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"%ld", (long)indexPath.row);
}
Note: added TapGestureRecognizer somewhere and it prevents selecton of cell didselectitematindexpath
回答2:
My suggestion is to rework your design and change the UILabel to an UIButton, because UIButton simply handles tap recognition, and also you do not have any issue of tap forwarded also to the UICollectionView (didSelectItemAtIndexPath: will be called indeed).
So, change the label with a button and set buyNowClicked: method at TouchUpInside event on it.
UPDATE: If you can't remove the UILabel for any reason, then put a UIButton under the UILabel (with same frame and eventually NSConstraints) and move buyNowClicked: method at TouchUpInside event on the button and then you win easily
回答3:
You have to add this code into the Your Custom
UICollectionViewCellclass.Then create a delegate which will respond to the tap.
Assign that delegate in
cellForRowAtIndexPathof Collection View.
let me know if you need detailed explanation.
Edit 1: Code:
MyCell.swift:
import UIKit
protocol MyCellDelegate {
func lblNameTapped(cell: MyCell)
}
class MyCell: UICollectionViewCell {
@IBOutlet var lblName: UILabel!
var lblNameTapRec:UITapGestureRecognizer!
var delegate: MyCellDelegate?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
lblNameTapRec = UITapGestureRecognizer(target: self, action: #selector(MyCell.lblNameTapped(_:)))
lblName.userInteractionEnabled = true
lblName.addGestureRecognizer(lblNameTapRec)
}
func lblNameTapped(sender: AnyObject){
delegate?.lblNameTapped(self)
}
}
ViewController.Swift:
import UIKit
class WallOfPraizeVC: UIViewController,UICollectionViewDataSource,UICollectionViewDelegate,MyCellDelegate {
@IBOutlet var collectionView: UICollectionView!
//DelegateMethod
func lblNameTapped(cell: MyCell) {
let indexPath = self.collectionView.indexPathForCell(cell)
print(indexPath!.row)
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! MyCell
cell.delegate = self
return cell
}
}
回答4:
Try this :-
-(void)buyNowClicked:(UITapGestureRecognizer*)tap
{
NSLog(@"buyNowClicked here");
[self buyService:tap.view.tag];
}
回答5:
Use this code for tap gesture: -
UITapGestureRecognizer *buyNowTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(buyNowClicked:)];
buyNowTapped.numberOfTapsRequired = 1.0;
cell.buy.tag = indexPath.row;
cell.buy.userInteractionEnabled = YES;
[cell.buy addGestureRecognizer:buyNowTapped];
Try this :
-(void)buyNowClicked : :(UITapGestureRecognizer*)recognizer
{
UIView *view = [recognizer view];
NSLog(@"tag %ld",(long)view.tag);
UIButton *button;
UILabel *label;
if([view isKindOfClass:[UIButton class]])
{
button = (UIButton *)sender;
[self buyService:button.tag];
}
else if ([view isKindOfClass:[UILabel class]])
{
label = (UILabel *)sender;
[self buyService:label.tag];
}
}
来源:https://stackoverflow.com/questions/39163577/uilabel-with-tap-gesture-recognizer-not-working