4

サブビューとして追加された UIImageView があります。ボタンを押すと表示されます。

アプリケーションの任意の部分で誰かが UIImageView の外側をタップすると、UIImageView が消えてしまいます。

@interface SomeMasterViewController : UITableViewController <clip>

<clip>

@property (strong, nonatomic) UIImageView *someImageView;

stackoverflow と Apple のドキュメントには、私が必要としているようなヒントがいくつかあります。

ただし、ここで私のアプローチを確認したいと思います。コードが必要であることは私の理解です

  1. UITapGestureRecognizer を登録して、アプリケーションで発生する可能性のあるすべてのタッチ イベントを取得します

  2. UITapGestureRecognizer では、cancelsTouchesInView と delaysTouchesBegan および delaysTouchesEnded を NO に設定する必要があります。

  3. これらのタッチ イベントを someImageView と比較します (どのように? UIView hitTest:withEvent を使用しますか?)

更新: UITapGestureRecognizer をメインの UIWindow に登録しています。

最終未解決部分

UITapGestureRecognizer が呼び出す handleTap:(UITapGestureRecognizer *) があります。与えられた UITapGestureRecognizer を取得して、タップが UIImageView の外にあるかどうかを確認するにはどうすればよいですか? Recognizer の locationInView は有望に見えますが、期待した結果が得られません。クリックすると特定の UIImageView が表示され、別の場所をクリックすると UIImageView が表示されないことを期待しています。locationInViewメソッドが間違って使用されているように感じます。

これが locationInView メソッドへの呼び出しです。

- (void)handleTap:(UITapGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
        NSLog(@"handleTap NOT given UIGestureRecognizerStateEnded so nothing more to do");
        return;        
    }

    UIWindow *mainWindow = [[[UIApplication sharedApplication] delegate] window];
    CGPoint point = [gestureRecognizer locationInView:mainWindow];
    NSLog(@"point x,y computed as the location in a given view is %f %f", point.x, point.y);

    UIView *touchedView = [mainWindow hitTest:point withEvent:nil];
    NSLog(@"touchedView = %@", touchedView); 
}

次の出力が得られます。

<clip>point x,y computed as the location in a given view is 0.000000 0.000000

<clip>touchedView = <UIWindow: 0x8c4e530; frame = (0 0; 768 1024); opaque = NO; autoresize = RM+BM; layer = <UIWindowLayer: 0x8c4c940>>
4

2 に答える 2

2

これを行うには、タッチ機能を使用できます。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

ユーザーが最初に画面に触れると、 touchBegan 関数が呼び出されます。

in touchBegin:

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    CGPoint pt = [[touches anyObject] locationInView:self]; 
}

ユーザーが触れたポイントがあります。次に、ポイントがUIImageViewにあるかどうかを確認する必要があります。

しかし、UIImageViewsにタグを付けることができれば. それはかなり簡単です。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

      UITouch *touch = [touches anyObject ];

      if( yourImageView.tag==[touch view].tag){

         [[self.view viewWithTag:yourImageView.tag] removeFromSuperView];
         [yourImageView release];

      }
}
于 2012-04-06T08:28:56.613 に答える