【问题标题】:Is it possible to receive UITapGestureRecognizer calls in 2 classes at the same time是否可以同时在 2 个类中接收 UITapGestureRecognizer 调用
【发布时间】:2011-03-13 13:27:47
【问题描述】:

当用户单击屏幕时,我想在两个类(一个超级视图和一个全屏子视图)中调用一个动作。但是,当我将 UITapGestureRecognizer 添加到子视图时,添加到父视图的那个会被覆盖。是否可以在不覆盖添加到父视图的 UITapGestureRecognizer 的情况下将 UITapGestureRecognizer 添加到子视图? 如果是这样,我该怎么做?

谢谢!

编辑: 从我的主视图控制器“MyToolBerController”中,我从另一个视图控制器添加子视图,如下所示:

PhotoViewController *photoViewController = [[PhotoViewController alloc] initWithNibName:@"PhotoViewController" bundle:nil];
myPhotoView = photoViewController.view;
[self.view addSubview:myPhotoView]; 

我在 MyToolBerController 中添加 GestureRecognizer,如下所示:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapFrom:)];        
[singleTap setNumberOfTapsRequired:1];
singleTap.delegate = self;
[myPhotoView addGestureRecognizer:singleTap];
[singleTap release];

这一切都很好,但我需要在点击视图时调用 PhotoViewController 类中的方法以及 MyToolBerController 类中的方法。 当我在 photoViewController 中添加另一个 UITapGestureRecognizer 时,它会覆盖在 superView 中添加的 UITapGestureRecognizer。

【问题讨论】:

    标签: iphone objective-c uiview uigesturerecognizer


    【解决方案1】:

    手势识别器可以在手势发生时调度多个动作。您可以将子视图添加为手势识别器的另一个目标,并且仅使用单个 UITapGestureRecognizer 实例:

    [tapRecognizer addTarget:theSubview action:@selector(whatever:)];
    

    【讨论】:

      【解决方案2】:

      在您的手势识别器选择器方法中,将信息传递给子视图。同一个手势不需要有多个手势识别器。比如:

      - (IBAction)handleSingleDoubleTap:(UIGestureRecognizer *)sender
      {
          CGPoint tapPoint = [sender locationInView:sender.view.superview];
          UIView *subview = [parentView viewWithTag:100];
          [subview doSomethingWithPoint:tapPoint];
      }
      

      这当然意味着你需要通知的子视图应该在加载视图控制器时在 Interface Builder 或代码中被赋予标签 100。

      根据 Jonah 的代码更新:

      所以不要保留视图,而是保留视图控制器:

      PhotoViewController *photoViewController = [[PhotoViewController alloc] initWithNibName:@"PhotoViewController" bundle:nil];
      self.myPhotoViewController = photoViewController;
      

      这意味着您需要在 MyToolbarController 标头中以这种方式声明它:

      @property (nonatomic, retain) PhotoViewController *myPhotoViewController;
      

      然后,当您的手势选择器被调用时,将消息传递给您保留的视图控制器。比如:

      - (IBAction)handleSingleTapFrom:(UIGestureRecognizer *)sender
      {
          CGPoint tapPoint = [sender locationInView:sender.view.superview];
          [myPhotoViewController doSomethingWithPoint:tapPoint];
      }
      

      当然,-doSomethingWithPoint: 方法只是示例。您可以命名和创建任何您想要的方法,该方法采用您想要在 PhotoViewController 中传递的任何参数。

      如果您需要进一步说明,请告诉我。

      【讨论】:

      • 感谢您的帮助!不幸的是,我通过将 uiviewcontroller 的视图添加为子视图来打破规则。第二个 UIGestureRecognizer 被添加到新的 UIViewController 中。我想使用 pushViewController 方法,但我需要查看只占用屏幕的一部分。这还能用吗?
      • 只要你可以通过指针获取视图或其视图控制器,你就可以向它发送可以响应的消息。你没有违反规则。你在做什么很好。当手势发生时,您的视图控制器可以是您的消息被发送到的代表。如果视图有视图控制器,它不一定是视图本身。这就是视图 controller 的观点是处理发送到视图和从视图发送的消息。只需在创建辅助视图时保留视图控制器,并在手势识别器选择器中将参数传递给它。
      • 这正是我所需要的。如何使用指针获取 viewController?我已经尝试使用“@class myViewController”,但不确定如何正确实现它,而且我无法找到任何显示如何执行此操作的示例代码。你会如何建议这样做?感谢您的帮助!
      • 用代码解释最简单。您能否更新您的答案并粘贴显示您正在创建辅助视图控制器的代码,该辅助视图控制器的视图用作子视图?
      • 尚未测试杰森的答案,但听起来它可能是阻力较小的路径。虽然我很高兴帮助您更好地了解如何让您的观点相互“交流”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多