单击任何 UIImage 并在 Objective-C 中打开一个 UIImageView

Posted

技术标签:

【中文标题】单击任何 UIImage 并在 Objective-C 中打开一个 UIImageView【英文标题】:click any UIImage and open an UIImageView in objective-c 【发布时间】:2012-01-31 07:10:52 【问题描述】:

我在这个网站上得到了这个解决方案:Click an UIImage and open an UIImageView in Objective-c

UITapGestureRecognizer 添加到您的UIImageView

UITapGestureRecognizer *tapRecognizer;
tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(yourSelector)];
[thumbnail addGestureRecognizer:tapRecognizer];
[tapRecognizer release];

thumbnail.userInteractionEnabled = YES; // very important for UIImageView

这对于单个 ImageView 来说工作得很好,但是我在我的 scrollView 中添加了多个(大约 20 个)然后我如何区分哪个 ImageView 将被用户点击或选择。我尝试设置自己的@selector(imageClicked),但它只返回最后一个 imageView 的标签。

我在一个循环中添加 addGestureRecognizer,因为我在 imageView 中动态加载了 20 个静态图像。

【问题讨论】:

能否请您显示您如何添加 20 个图像视图的代码,这可能有助于我们找出此问题的解决方案 我确定问题出在您的循环中。 @gurooj,是的,问题在循环中,Piyush 解决了! 【参考方案1】:

这可能会有所帮助

for(int i=0;i<20;i++)

    UIImageView *img=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"yourimage.png"]];
    [img setTag:i];
    img.frame= //set frame accordingly;
    img.userInteractionEnabled = YES;
    UITapGestureRecognizer *tap =
    [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    [img addGestureRecognizer:tap];
    [tap release];
    [scrollView addSubView:img];


- (void)handleTap:(UITapGestureRecognizer *)recognizer  
    UIImageView *imageView = (UIImageView *)recognizer.view;

      switch([imageView tag])
    
       case 1:
          //do your work
          break;
       .
       .
       .
       .
       case n:

    

【讨论】:

我知道这种方式,但是我如何识别用户点击了哪个图像!现在请不要按标签说。在我们跳转到那个动作之后它会很有用! 您是否为每个 imageView 创建单独的实例? 我运行一个循环,在其中创建一个 UIImageView 实例,将其添加到添加图像,添加手势,添加标签,最后将该实例添加到滚动视图! 你是否以这种方式创建 UIImageView 的每个实例 UIImageView *img=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"yourimage.png"]];如果没有,那么尝试这种方式,它现在应该可以工作了【参考方案2】:
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
for (UIImageView *thumbnail in imageArray)  
    [thumbnail addGestureRecognizer:tapRecognizer];

[tapRecognizer release];

您可以从 UIGestureRecognizer 的“视图”属性中获取视图。 例如,在您的选择器中:

- (void)handleTap:(UITapGestureRecognizer *)recognizer  
    UIImageView *imageView = (UIImageView *)recognizer.view;

    //  Now do something with your view

【讨论】:

确保选择器是 yourSelector: 而不是 yourSelector。并且接收到的对象应该是一个 UIGestureRecognizer。它应该从用户那里获得选定的视图。您也可以发布更新后的代码吗? - (void) imageClicked:(UITapGestureRecognizer ) 识别器 UIImageView *imageViewClicked=(UIImageView *) Recognizer.view; NSLog(@"%d",imageViewClicked.tag); / 只关注最后一张图片 */ @Hanon【参考方案3】:

您不能将一个点击识别器添加到多个视图。为每个要添加点击识别器的视图创建一个新视图。由于您使用的是 tableview,只需在 tableView:cellForRowAtIndexPath: 方法中执行此操作:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    // usual implementation
    static NSString *cellIdentifier = @"CellIdentifier";

    UITableViewCell *cell = [tableView dequeue ...];
    if (!cell) 
        cell = [[UITableViewCell alloc] init....];
        // add new gesture recognizer here.
    

    // setup cell: set the image (just an example)
    cell.imageView.image = [images objectAtIndex:indexPath.row];

    return cell;

不要使用其他答案中提到的标签,而只是让图像视图尝试使用底层模型。处理tap的时候,找到indexPath就知道要访问什么模型对象了:

- (void)handleTap:(UITapGestureRecognizer *)recognizer  
    UIImageView *imageView = (UIImageView *)recognizer.view;

    // assumes the image view is direct subview of the cell
    // change to match your cell structure
    UITableViewCell *cell = (UITableViewCell *) [imageView superview]; 

    // get the index path for the cell clicked
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    //  TODO: Use index path to get full image to display

这样您就可以知道所点击图片的确切行,因此您可以访问您的模型以访问要显示的完整图片。

【讨论】:

谢谢,但我没有在tableview中添加它!但这在其他一些应用程序中可能会有所帮助。 :) 啊,抱歉,不知何故我读到了你写滚动视图的tableview。【参考方案4】:

您需要为所有图像添加标签 - 例如 thumbnail.tag = 100。然后将您的选择器修改为 youSelector:(UITapGestureRecognizer *)sender; 在选择器中添加开关

- (void) yourSelector:(UITapGestureRecognizer *)sender 
    UIImageView *imageView = (UIImageView *)sender.view;
    switch(imageView.tag) 
        case 100: 
        //This code will be handled if tag == 100;
        
    

【讨论】:

我试过了,但是不行!并显示 SIGABRT 错误! - (void) imageClicked:(UIImageView *) imageViewSelected NSLog(@"%d",imageViewSelected.tag); 我明白,我的错误。您需要使用下面的代码,并确保您的选择器看起来像 @selector(yourSelector:) 这也行不通!正如我试图写的那样,sender.view 不再存在!【参考方案5】:

请尝试子类化 ImageView 并将手势识别器添加到子类中。

现在为每个图像创建 ImageView 对象并将图像添加到该对象。 设置一些独特的属性,以便您可以识别像图像名称一样单击的对象。

【讨论】:

以上是关于单击任何 UIImage 并在 Objective-C 中打开一个 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 中裁剪后 UIImage 显示模糊

单击按钮以在按钮下方显示 Nib

Objective- C:在 UIImage 上绘制边框

如何在objective-c中使UIImage为NULL

绘制 UIImage / 内存问题-objective-c

如何使 UIImage 在 Objective-c 的 Xcode 中工作