2

ユーザーが画面をシングルタップしたときに、2つのクラス(スーパービューとフルスクリーンサブビュー)のアクションを呼び出したいと思います。ただし、UITapGestureRecognizerをサブビューに追加すると、スーパービューに追加されたものがオーバーライドされます。スーパービューに追加された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が上書きされます。

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];
}

もちろん、これは、通知が必要なサブビューに、ViewControllerがロードされたときにInterfaceBuilderまたはコードのいずれかでタグ100を付与する必要があることを意味します。

Jonahのコードに基づいて更新します。

したがって、ビューを保持する代わりに、ビューコントローラを保持します。

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

つまり、MyToolbarControllerヘッダーで次のように宣言する必要があります。

@property (nonatomic, retain) PhotoViewController *myPhotoViewController;

次に、ジェスチャセレクタが呼び出されたら、保持したViewControllerにメッセージを渡します。何かのようなもの:

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

もちろん、-doSomethingWithPoint:メソッドは単なる例です。PhotoViewControllerに渡したいパラメータを受け取る任意のメソッドに名前を付けて作成できます。

さらに詳しい説明が必要な場合はお知らせください。

于 2010-07-08T20:19:30.033 に答える