我有一个作为子视图添加的 UIImageView。它在按下按钮时显示。
当有人在应用程序的任何部分中的 UIImageView 之外点击时,我希望 UIImageView 消失。
@interface SomeMasterViewController : UITableViewController <clip>
<clip>
@property (strong, nonatomic) UIImageView *someImageView;
stackoverflow 和 Apple 的文档中有一些提示听起来像是我需要的。
- Apple 的:手势识别器
- 苹果的:UIView hitTest:withEvent
- Apple 的:UITouch 类参考
- Stackoverflow:与 UIGestureRecognizer 一起监听 UITouch 事件
- (不太可能需要,但是..) - CGRectContainsPoint,如以下标题为:将 UITouch 位置与 UIImageView 矩形进行比较
但是,我想在这里检查我的方法。我的理解是代码需要
注册一个 UITapGestureRecognizer 以获取应用程序中可能发生的所有触摸事件
UITapGestureRecognizer 应该将其 cancelsTouchesInView 和 delaysTouchesBegan 和 delaysTouchesEnded 设置为 NO。
将这些触摸事件与 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>>