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?)

更新:我正在向主 UIWindow 注册一个 UITapGestureRecognizer。

最终未解决的部分

我有一个 UITapGestureRecognizer 将调用的 handleTap:(UITapGestureRecognizer *)。如何获取给定的 UITapGestureRecognizer 并查看点击是否落在 UIImageView 之外?识别器的 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

4

你可以说[event touchesForView:<image view>]。如果返回一个空数组,则关闭图像视图。在表格视图控制器中执行此touchesBegan:withEvent:操作,并确保调用[super touchesBegan:touches withEvent:event],否则您的表格视图将完全停止工作。您甚至可能不需要实现touchesEnded:/Cancelled:..., 或touchesMoved:....

在这种情况下,UITapGestureRecognizer 绝对看起来有点矫枉过正。

于 2012-04-06T08:37:54.547 回答
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 函数会被调用。

联系开始:

 -(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 回答