单击任何 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的主要内容,如果未能解决你的问题,请参考以下文章