【问题标题】:UITapGestureRecognizer not triggering on UIImageView created programmaticallyUITapGestureRecognizer 未触发以编程方式创建的 UIImageView
【发布时间】:2013-04-23 09:45:02
【问题描述】:

我正在使用 XCode 4.5.1。

我在 .h 文件和 .m 文件的开头添加了<UIGestureRecognizerDelegate>

@interface FirstViewController ()

@property (nonatomic, strong) UIImageView *img1;

@end

然后在viewDidLoad 中,以编程方式创建UIImageView

self.img1 = [[UIImageView alloc] initWithFrame:CGRectMake(50, -30, 44, 44)];
[self.img1 setImage:[UIImage imageNamed:@"image1.png"]];
[self.img1 setAlpha:0.8];
[self.img1 setHidden:NO];
[self.img1 setUserInteractionEnabled:YES];
[self.img1 setTag:901];

然后

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(guessTapObject:)];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
tap.delegate = self;

[self.img1 addGestureRecognizer:tap];

[self.view addSubview:self.img1];
[self.view bringSubviewToFront:self.img1];

最后

- (void)guessTapObject:(UITapGestureRecognizer *) gesture
{
    // guessing the image
    UIImageView *tapImageView = (UIImageView*) gesture.view;
    NSLog(@"Gesture Tag: %d", tapImageView.tag);
}

我有 4 个不同的图像,并如上所述以编程方式创建它们。并应用动画将它们从上到下移动。

我希望当用户点击图像时,它应该动画并消失(我知道那个代码)。但是代码没有触发点击事件。我将断点放在guessTapObject 函数的开头,但永远不要去那里。

UITapGestureRecognizer 声明处,调试显示guessTapObject 附加到识别器以执行点击操作。

请帮忙为什么点击事件没有触发它的选择器方法???

提前感谢您的帮助。


编辑: 我还尝试使用 for 循环为每个图像视图分别设置手势识别器

for (UIView * view in self.view.subviews) {
    if (view.tag > 900){
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(guessTapObject:)];
        tap.numberOfTapsRequired = 1;
        tap.numberOfTouchesRequired = 1;
    //    tap.delegate = self;
        [view addGestureRecognizer:tap];
        NSLog(@"tapView: %@", tap.view);
        NSLog(@"tap: %i", tap.enabled);
    }
}

【问题讨论】:

  • 我尝试了您发布的代码,它对我来说工作正常。我收到回调。如果您使用多个图像,您也需要创建不同的 UITapGestureRecognizer。对于一张图片,代码应该可以正常工作,请检查是否有任何内容为零或您的生成代码没有被调用或其他什么。
  • 这行得通,确保在将 y 线设置为 -30 时点击的是哪个图像,检查一下。
  • @amit3117 .... 我也尝试使用 for 循环为每个图像添加单独的手势识别器,但在我的最后不起作用。
  • @unbounded 显示你的 for 循环代码。
  • @Navnath.... 因为我正在为我的图像设置动画,所以它正在移动并将在动画开始时显示(动画正在运行)。好的,我也向您展示 for 循环代码。我还尝试通过评论tap.delegate = self; 这一行。但它也没有解决问题。

标签: iphone ios uiimageview xcode4.5 uitapgesturerecognizer


【解决方案1】:

我遇到了类似的问题..确保 userInteraction 的 imageView 设置为 true..

imageView.userInteractionEnabled = YES;

它对我有用!

【讨论】:

    【解决方案2】:

    检查一下
    将以下代码添加到您的视图控制器

    • 在 viewController.h 文件中

      @property (nonatomic, strong) UIImageView *img1;
      @property (nonatomic, strong) UIImageView *img2;
      @property (nonatomic, strong) UIImageView *img3;
      
    • 在 viewController.m 文件中
      viewDidLoad 方法内部

      // Init Image 1 
      self.img1 = [[UIImageView alloc] initWithFrame:CGRectMake(50, 30, 44, 44)];
      [self.img1 setImage:[UIImage imageNamed:@"image1_name.jpg"]];
      [self.img1 setAlpha:0.8];
      [self.img1 setHidden:NO];
      [self.img1 setUserInteractionEnabled:YES];
      [self.img1 setTag:901];
      
      // Init Image 2
      self.img2 = [[UIImageView alloc] initWithFrame:CGRectMake(100, 30, 44, 44)];
      [self.img2 setImage:[UIImage imageNamed:@"image2_name.jpg"]];
      [self.img2 setAlpha:0.8];
      [self.img2 setHidden:NO];
      [self.img2 setUserInteractionEnabled:YES];
      [self.img2 setTag:902];
      
      // Init Image 3
      self.img3 = [[UIImageView alloc] initWithFrame:CGRectMake(50, 130, 44, 44)];
      [self.img3 setImage:[UIImage imageNamed:@"image3_name.jpg"]];
      [self.img3 setAlpha:0.8];
      [self.img3 setHidden:NO];
      [self.img3 setUserInteractionEnabled:YES];
      [self.img3 setTag:903];
      
      // Add Images to view
      [self.view addSubview:self.img1];
      [self.view bringSubviewToFront:self.img1];
      
      [self.view addSubview:self.img2];
      [self.view bringSubviewToFront:self.img2];
      
      [self.view addSubview:self.img3];
      [self.view bringSubviewToFront:self.img3];
      
      // Set Tap Gesture to each image of view
      for (UIView * view in self.view.subviews) {
        if (view.tag > 900){
           UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] 
                                            initWithTarget:self 
                                            action:@selector(guessTapObject:)];
           tap.numberOfTapsRequired = 1;
           tap.numberOfTouchesRequired = 1;
           [view addGestureRecognizer:tap];
           NSLog(@"tapView: %@", tap.view);
           NSLog(@"tap: %i", tap.enabled);
        }
      }
      


    确保在 for 循环之前添加图片(使用子视图数组添加 TapGesture)

    【讨论】:

      【解决方案3】:

      我通过在视图上应用手势来解决问题,而不是单独的每个图像视图。

      [self.view addGestureRecognizer:tap];

      然后在处理程序/选择器guessTapObject 函数中,我使用了这个

      CGPoint tapLocation = [gesture locationInView:self.view]; // gives the tap coordinates
      for (UIView * view in self.view.subviews) { // gives view by iterating on each subview
          CGRect dropRect = [[[view layer] presentationLayer] frame]; // specific way of getting the frame with respect to its layer
      
          if(CGRectContainsPoint(dropRect, tapLocation)){ // checks for tap in the boundaries of view frame
              if (view.tag > 900) // my specific view
                   // done what i want to do with that specific one
                   // as i removed it from my superview
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-17
        • 1970-01-01
        • 2012-12-15
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        相关资源
        最近更新 更多