【问题标题】:UITapgesturerecognizer on uiimageview inside of uiscrollviewuiscrollview 内的 uiimageview 上的 UITapgesturerecognizer
【发布时间】: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 上设置用户交互启用!

标签: ios iphone objective-c uiscrollview 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,那么您还可以免费获得“高亮效果”。

    【讨论】:

    • 我该如何解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多