Можно ли получать вызовы UITapGestureRecognizer в 2 классах одновременно - PullRequest
2 голосов
/ 09 июля 2010

Я хочу вызвать действие в двух классах (суперпредставление и полноэкранное подпредставление), когда пользователь нажимает на экран одним нажатием. Но когда я добавляю UITapGestureRecognizer к подпредставлению, тот, который добавлен к суперпредставлению, переопределяется. Можно ли добавить UITapGestureRecognizer к подпредставлению, не переопределяя UITapGestureRecognizer, добавленный к суперпредставлению? Если так, как я могу это сделать?

Спасибо!

Edit: Из моего основного viewController «MyToolBerController» я добавляю подпредставление из другого viewController следующим образом:

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

Я добавляю GestureRecognizer в MyToolBerController следующим образом:

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

Это все работает нормально, но мне нужно вызывать метод в классе PhotoViewController, когда к представлению обращаются так же, как и в классе MyToolBerController. Когда я добавляю другой UITapGestureRecognizer в photoViewController, он переопределяет UITapGestureRecognizer, добавленный в superView.

Ответы [ 2 ]

7 голосов
/ 09 июля 2010

Распознаватели жестов могут отправлять несколько действий, когда происходит жест.Вы можете добавить подпредставление в качестве другой цели распознавателя жестов и использовать только один экземпляр UITapGestureRecognizer:

[tapRecognizer addTarget:theSubview action:@selector(whatever:)];
5 голосов
/ 09 июля 2010

В вашем методе выбора распознавателя жестов передайте информацию вместе с подпредставлением. Для одного и того же жеста не нужно иметь несколько распознавателей жестов. Что-то вроде:

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

Это, конечно, означает, что вашему подпредставлению, которое необходимо уведомить, должен быть присвоен тег 100 либо в Интерфейсном Разработчике, либо в коде, когда загружается контроллер представления.

Обновление на основе кода Ионы:

Таким образом, вместо сохранения вида сохраните контроллер вида:

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.

Дайте мне знать, если вам нужны дальнейшие разъяснения.

...