uiscrollview 内的 uiimageview 上的 UITapgesturerecognizer

Posted

技术标签:

【中文标题】uiscrollview 内的 uiimageview 上的 UITapgesturerecognizer【英文标题】:UITapgesturerecognizer on uiimageview inside of uiscrollview 【发布时间】:2014-03-08 08:31:16 【问题描述】:

我有一个问题,我制作的点击手势识别器仅适用于滚动视图中的最后一项。

我有一组图像被添加到 UIImageView 中,并且 UIImageView 正在以下代码中添加到 ScrollView:

UIImageView *imageView1;
for (int i = 0; i < numberOfViews; i++) 
    xOrigin = i * imageSize;
    imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(xOrigin,50,100,50)];
    [imageView1 setUserInteractionEnabled:YES];
    [imageView1 addGestureRecognizer:tap]; // The gesture I want
    [imageView1 setImage:[images objectAtIndex:i]];
    [scrollView addSubview:imageView1];

// Set the contentSize equal to the size of the UIImageView
// scrollView.contentSize = imageView.scrollview.size;
scrollView.contentSize = CGSizeMake(numberOfViews * imageSize, imageSize);


// Finally, add the UIScrollView to the controller's view
[self.view addSubview:scrollView];

上面的代码可以正常工作,以将图像按顺序添加到滚动视图中,以及将点击添加到列表中的最后一项。也就是说,其余的都没有得到点击动作?

提前致谢。

【问题讨论】:

您好,如果我的回答对您有帮助,请将其标记为已接受。谢谢 这个问题帮助我解决了一个单独的问题 - 记得在 UIImageView 上设置用户交互启用! 【参考方案1】:

我可以看到你只有一个点击手势对象,这就是为什么当你运行循环时,它只被添加到最后一个图像视图中。

您需要为一个图像视图创建一个点击手势对象。

UIImageView *imageView1;
for (int i = 0; i < numberOfViews; i++) 
    xOrigin = i * imageSize;
    imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(xOrigin,50,100,50)];
    [imageView1 setUserInteractionEnabled:YES];
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapMethod:)];
    [imageView1 addGestureRecognizer:tap]; // The gesture I want
    [imageView1 setImage:[images objectAtIndex:i]];
    [scrollView addSubview:imageView1];

// Set the contentSize equal to the size of the UIImageView
// scrollView.contentSize = imageView.scrollview.size;
scrollView.contentSize = CGSizeMake(numberOfViews * imageSize, imageSize);
// Finally, add the UIScrollView to the controller's view
[self.view addSubview:scrollView];

【讨论】:

【参考方案2】:

嗯,这是有道理的,因为您向所有图像视图添加了一个手势识别器。当您将相同的手势识别器添加到第二个视图时,它会从前一个视图中删除。您应该向滚动视图添加一个手势识别器,然后根据触摸位置确定点击了哪个图像视图,或者为每个图像视图添加单独的手势识别器。

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
UIGestureRecognizer *tapGestureRecongnizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[scrollView addGestureRecognizer:tapGestureRecongnizer];


- (void)handleTap:(UIGestureRecognizer *)tapGestureRecognizer

    CGPoint location = [tapGestureRecognizer locationInView:self.scrollView];
    for (UIImageView *imageView in self.imageViews) 
        if (CGRectContainsPoint(imageView.frame, location)) 
            // here is the imageView being tapped
        
    

另一种方法是使用UIButtons 而不是UIImageViews,那么您还可以免费获得“高亮效果”。

【讨论】:

我该如何解决这个问题?

以上是关于uiscrollview 内的 uiimageview 上的 UITapgesturerecognizer的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollview 弹跳和缩放固定顶部

使用许多图像缩放 UIScrollView 的正确方法?

在 UIScrollView 中放大多个 UIImageView

如果我隐藏 NavigationBar 和 ToolBar,UIScrollView 会向上移动

UIScrollView 内的 UIScrollView 时滚动

分页 UIScrollView 内的 UIScrollView