2

当用户单击屏幕时,我想在两个类(超级视图和全屏子视图)中调用一个动作。但是,当我将 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。

4

2 回答 2

7

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

[tapRecognizer addTarget:theSubview action:@selector(whatever:)];
于 2010-07-08T20:42:51.540 回答
5

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

- (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 中传递的任何参数。

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

于 2010-07-08T20:19:30.033 回答