首页 文章

在uiscrollview内部的uiimageview上的UITapgesturerecognizer

提问于
浏览
1

我有一个问题,我所做的点击手势识别器只适用于滚动视图中的最后一项 .

我有一个图像数组,这些图像被添加到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];

上面的代码适用于将图像按顺序添加到滚动视图中,以及将点击添加到列表中的最后一项 . 也就是说,其余的人没有得到轻拍动作?

提前致谢 .

2 回答

  • 2

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

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

    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];
    
  • 0

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

    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
            }
        }
    }
    

    另一种方法是使用 UIButton 而不是 UIImageView s,然后你也可以免费获得"highlighted effect" .

相关问题