我有一个UIImageView作为子视图添加到了界面上,当用户点击一个按钮时它会显示出来。
当用户在应用的任何部分以外的地方轻触屏幕时,我希望UIImageView消失。
@interface SomeMasterViewController : UITableViewController <clip>
<clip>
@property (strong, nonatomic) UIImageView *someImageView;
在stackoverflow和苹果文档中有一些提示看起来像是我需要的:
- 苹果官方文档:手势识别
- 苹果官方文档:UIView hitTest:withEvent
- UITouch Class Reference(UITouch类参考)
- Stackoverflow:同时监听UITouch事件和UIGestureRecognizer
- (不太可能需要但是...) - CGRectContainsPoint如下文所述:比较UITouch位置和UIImageView矩形
然而,我想确认我的方法是否正确。我理解代码需要:
注册一个UITapGestureRecognizer以获取应用程序中可能发生的所有触摸事件
UITapGestureRecognizer应设置cancelsTouchesInView,delaysTouchesBegan和delaysTouchesEnded为NO。
将这些触摸事件与someImageView(如何使用UIView hitTest:withEvent?)进行比较
更新:我正在为主UIWindow注册UITapGestureRecognizer。
最终未解决的部分
我有一个handleTap:(UITapGestureRecognizer *),由UITapGestureRecognizer调用。我如何接收给出的UITapGestureRecognizer,并检查点击是否在UIImageView之外?locationInView方法看起来很有前途,但结果并不是我所期望的。我希望在点击某个特定的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>>