是否可以同时接收2个类中的UITapGestureRecognizer调用

时间:2010-07-08 20:10:05

标签: iphone objective-c uiview uigesturerecognizer

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

谢谢!

修改 从我的主viewController“MyToolBerController”,我将从另一个viewController添加子视图,如下所示:

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。

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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中传递任何参数的方法。

如果您需要进一步澄清,请与我们联系。