如何

2011-10-10 176 views
29

我使用的UITableViewCellStyleSubtitle 风格UITableViewCell对象来检测UITableViewCellStyleSubtitle风格上的UITableViewCell对象的UIImageView触摸(即左,文本标签的大胆和下一个详细文本标签的形象图)创建我的桌子。现在我需要检测UIImageView上的触摸,并了解点击图像视图的索引路径/单元格。我试着用如何

cell.textLabel.text = @"Sometext"; 
NSString *path = [[NSBundle mainBundle] pathForResource:@"emptystar1" ofType:@"png"]; 
UIImage *theImage = [UIImage imageWithContentsOfFile:path]; 
cell.imageView.image = theImage; 
cell.imageView.userInteractionEnabled = YES; 

但它不工作。每当图像被点击时,调用didSelectRowAtIndexPath:。我不想创建一个单独的UITableViewCell并添加一个自定义按钮。有没有什么办法来检测UIImageView本身的触摸?

回答

75

在你cellForRowAtIndexPath方法中添加以下代码

cell.imageView.userInteractionEnabled = YES; 
cell.imageView.tag = indexPath.row; 

UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myFunction:)]; 
tapped.numberOfTapsRequired = 1; 
[cell.imageView addGestureRecognizer:tapped]; 
[tapped release]; 

然后检查其imageView被点击,在selector方法

-(void)myFunction :(id) sender 
{ 
    UITapGestureRecognizer *gesture = (UITapGestureRecognizer *) sender; 
    NSLog(@"Tag = %d", gesture.view.tag); 
} 
+3

这在iOS 5.0中破坏了(也许是5.0.1)。见@Andrew – bandejapaisa

+0

答案使用一个UILabel,而不是一个UIImageView这一点也适用于iOS的5.1 – ChrisP

+0

你表现出极大的途径。谢谢。 –

6

你可以做到这一点的一种方法是从你的图像创建一个UIImageView并添加一个手势识别器。见下面

//Create ImageView 
UIImageView *theImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"emptystar1.png"]]; 
theImageView.userInteractionEnabled = YES; 

//Add Gesture Recognizer 
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageSelectedInTable)]; 
tapped.numberOfTapsRequired = 1; 
[theImageView addGestureRecognizer:tapped]; 
[cell addSubview:theImageView]; 

//Memory Cleanup 
[tapped release]; 
[theImageView release]; 

-(void)imageSelectedInTable 
{ 
    NSLog(@"Selected an Image"); 
} 

不过的例子,你现在就必须布置你的细胞更多,因为你不能简单地使用UITableViewCellUIImageView的性能,因为它是只读的。

+0

附加手势识别为'cell.imageView'应该工作。只读'imageView'并不意味着方法不能被调用。 –

+2

感谢名单aahrens ..它工作正常.. :)我面对现在唯一的问题是要知道哪些图像已被选中。有没有办法将参数发送到@selector(imageSelectedInTable :)?我使用冒号检查了“id”,但是它的UITapGestureRecognizer对象。我需要imageview存在的indexpath。当我尝试@选择器(imageSelectedInTable:indexPath)的应用程序崩溃.. – Shri

+1

它的工作原理!我忘了添加“imageView.userInteractionEnabled = YES;” – jovhenni19

18

接受的解决方案检查该标志目前在安装iOS 5.0破。该错误导致图像视图的手势识别器永远不会被触发。通过官方开发人员论坛的研究,我发现这是iOS 5.0中的一个已知错误。它是由内部实现导致-gestureRecognizerShouldBegin:返回。当您将手势识别器的代理设置到自定义子类UITableViewCell时,会出现该错误。

修复是覆盖-gestureRecognizerShouldBegin:在手势识别的委托,并返回YES。这个错误应该在未来版本的iOS 5.x中修复。只有当您不使用新的UITableViewCell复制/粘贴API时,这才是安全的。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    return YES; 
} 
+0

尼斯赶上!因此,修正了为手势识别器提供委托,给它一个'gestureRecognizerShouldBegin:'方法,并返回'YES'? – dasblinkenlight

+0

@dasblinkenlight是的,确切地说。必须注意的是,只要您不使用新的单元格复制和粘贴API,这是安全的。 – Andrew

+5

我已经实现了这个方法并将委托设置为self,但什么都没有触发。有谁知道这个问题在iOS 5.1中的状态是什么? – Rob

0

这个问题是:

  • 添加ImageView的到TableViewCell
  • 事件点击进入ImageView的不是事件不同点击进入TableViewCell

- >下面的代码正确地与我合作:

cell.imageView.image = [UIImage imageNamed:@"my_image.png"]; 
[cell.imageView setUserInteractionEnabled:YES]; 
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(singleTapGestureCaptured:)];  
[cell.imageView addGestureRecognizer:singleTap]; 

和 “singleTapGestureCaptured” 功能

- (void)singleTapGestureCaptured:(UITapGestureRecognizer*)gesture{ 
    NSLog(@"Left Image clicked"); 
} 
15

对于斯威夫特,在你的cellForRowAtIndexPath方法中添加以下代码

cell.imageView?.userInteractionEnabled = true 
cell.imageView?.tag = indexPath.row 

var tapped:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "TappedOnImage:") 
tapped.numberOfTapsRequired = 1 
cell.imageView?.addGestureRecognizer(tapped) 

然后检查被点击其中的ImageView,您在选择方法的标志

func TappedOnImage(sender:UITapGestureRecognizer){ 
    println(sender.view?.tag) 
} 
+0

为什么这是downvoted? – Esqarrouth

+0

这最终成为我的诡计。我的用户交互功能已被禁用。感谢结束小时的调试=) –

2

只有如何更多的信息,在我来说,我有超过从NSFetchedResultsContro检索表格单元格中的图像文件来回答到敲击手势ller,所以我们需要indexPath,而不是行,所以我决定使用图像而不是行信息。我定义该图像的变量:

var imgSelected: UIImageView? = nil 

我添加手势识别到的ImageView(imgZona):

public override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(Storyboard.CellReuseIdentifier, forIndexPath: indexPath) as! ZonasTableViewCell 
    let zona = fetchedResultsController.objectAtIndexPath(indexPath) as! Zona 

    cell.infoZona = zona 

    let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:Selector("imageTapped:")) 

    cell.imgZona?.addGestureRecognizer(tapGestureRecognizer) 
    cell.imgZona?.userInteractionEnabled = true 

    return cell 
} 

,并在“imageTapped”方法我检索到的图像,并保存到变量“imgSelected”:

func imageTapped(sender: UITapGestureRecognizer) { 

    imgSelected = sender.view as? UIImageView 
    self.performSegueWithIdentifier("MuestraImagen", sender: self) 
} 

最后,在“prepareForSegue”方法我送的viewController的图像专用于显示轻敲图像:

override public func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let identifier = segue.identifier { 
     switch identifier { 
     case "MuestraImagen": 
      if let vc = segue.destinationViewController as? MuestraImagenViewController { 
       if imgSelected != nil { 
        if let img = imgSelected!.image { 
         vc.imgPuente = img 
        } 
       } 
      } 
     default: break 
     } 
    } 
}