在 CustomCell 中检测 UIImageView 上的触摸

Posted

技术标签:

【中文标题】在 CustomCell 中检测 UIImageView 上的触摸【英文标题】:Detect touch on UIImageView in a CustomCell 【发布时间】:2012-10-02 08:57:27 【问题描述】:

我有自定义 UITableViewCell,我将 UITableViewCell 子类化了:

MyCustomCell.h

MyCustomCell:UITableViewCell

然后我还有这个自定义单元格的 xib 文件,一切正常,我可以显示所有信息,以及我在单元格上添加的图像,但我想在用户触摸 uiimageview 时检测触摸,所以我试过这样:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


static NSString *CellIdentifier = @"MasterView";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) 
    cell = [[MasterViewCell alloc] init];
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MasterViewCustomCellImage" owner:self options:nil];
    cell = (MasterViewCell *)[nib objectAtIndex:0];
    //NSLog(@"Nuova Cella");


[self configureCell:cell atIndexPath:indexPath];

return cell;


 - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
 
NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];

UIImageView *thumbnailImage = (UIImageView *)[cell viewWithTag:1007];
[thumbnailImage setImage:[managedObject valueForKey:@"myImage"]];

if (thumbnailImage) 

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(detectTouchImage)];
    [longPress setMinimumPressDuration:1.0];
    [thumbnailImage setUserInteractionEnabled:YES];
    [thumbnailImage addGestureRecognizer:longPress];


 

-(void)detectTouchImage

 NSLog(@"Image Pressed");
 

但我不明白为什么不工作,如果它进入 thumbnailImage,但没有检测到图像上的任何手势......任何人都可以帮助我吗?我已经在 ios 5 和 ios 6 上尝试过,但不工作...

【问题讨论】:

你能先检查几件事。首先,是否输入代码:if(thumbnailImage)。你能检查一下它是否真的到达了那个代码吗?而detectTouchImage方法在哪里? 抱歉我已经编辑了我的问题... 在 'if (thumbnailImage) ' 行之后添加 NSLog 以查看您是否真的附加了手势识别器。你了解 UILongPressGestureRecognizer 和 UITapGestureRecognizer 的区别吗? 是的,我尝试插入一个调试点,并输入那个 if 语句,所以它输入,我知道单击手势和长按之间的区别,我也试过使用单个 uitabgesture,但不工作... 您是否在 .h 中声明 -(void)detectTouchImage?如果没有,请在 .m 之前添加声明或移动方法 - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath. 【参考方案1】:

问题很可能是细胞在劫持触摸。您能否检查您的 didSelectCellForRow 方法是否被调用,或者当您点击它时该行是否突出显示?还尝试将UILongPressGestureRecognizer 分配给单元格而不是图像。 如果这可行,但您只想在点击拇指图像时调用点击,您可以使用在UIGestureRecognizer 类中实现的locationInView 方法来查看用户点击的确切位置。

【讨论】:

当我单击单元格时突出显示并输入 didselectcellrow,如果我这样做:[cell addGestureRecognizer:tapped];不要使用长按手势... 我不确定您是如何创建tapped 识别器的。尝试像这样创建和设置它:UILongPressGestureRecognizer *tapped = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(detectTouchImage)]; [tapped setMinimumPressDuration:1]; [cell addGestureRecognizer:tapped]; 您能否删除自定义单元格创建代码并使用手势识别器创建一个通用单元格 - UITableViewCell * cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; return cell; 看看是否适合您。【参考方案2】:

刚刚做了一个测试项目来验证问题出在哪里。 完整的工作示例是 GitHub 上的 here。下载并使用它。 TableViewCell 有自定义 UIImageView 与 UILongPressGestureRecognizer 附加到它。一切正常。长按任何图像和 UIIAllertView 弹出。因此,您使用 UILongPressGestureRecognizer 的代码似乎没问题。问题出在您项目的其他一些您没有公开的部分中。

【讨论】:

我已经尝试过您的示例,但我可以看到行上的任何图像 :( 或标签,只有一个 uitableview... @Piero,你下载了整个项目吗?它有 53*2 的图像。我下载了它来检查。没关系。 @Piero,我修改了项目:添加了单元格编号的标签,添加了文件名的 detailLabel,现在检测到缺少文件。克隆并运行它。 我很抱歉回答迟了,谢谢你的样本,它非常有用,但在我的代码中我像你一样做,但不起作用,但我找到了问题,在我的代码中我使用github.com/thermogl/TISwipeableTableView这个项目,问题是:)......无论如何谢谢! @Piero,至少你现在知道代码的哪一部分不应该受到责备。

以上是关于在 CustomCell 中检测 UIImageView 上的触摸的主要内容,如果未能解决你的问题,请参考以下文章

在 CustomCell 中获取 UILabel

在 InterfaceOrientation 上的 customCell 中重新定位 UIButtons

UItableView中的CustomCell崩溃[重复]

ViewController 中的 CustomCell 标签不显示数据

在UITableView中滚动时,CustomCell图像会发生变化

CustomCell(TableView)中的Swift Button将参数传递给targetMethod