@interface XXViewController (){

@property (strong, nonatomic) UITapGestureRecognizer *tapGesture;
- (void)handleTapGesture:(UITapGestureRecognizer *)gesture;
- (void)dismiss;
@end @implementation XXViewController - (void)dismiss
{
[self dismissModalViewControllerAnimated:YES];
} - (void)viewDidAppear:(BOOL)animated
{
if (iPadIdiom) {
if (self.tapGesture == nil) {
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];
self.tapGesture = tapGesture;
} //将手势添加到 window 上
if ([self.view.window.gestureRecognizers containsObject:self.tapGesture] == NO) {
[self.view.window addGestureRecognizer:self.tapGesture];
}
} [super viewDidAppear:animated];
} - (void)viewWillDisappear:(BOOL)animated
{
//将手势从 window 上移除
if ([self.view.window.gestureRecognizers containsObject:self.tapGesture]) {
[self.view.window removeGestureRecognizer:self.tapGesture];
}
[super viewWillDisappear:animated];
} - (void)handleTapGesture:(UITapGestureRecognizer *)gesture
{
//因为是 TapGesture 的需要点击次数为 1,所以这个判断实际可以不写
if (gesture.state == UIGestureRecognizerStateEnded) {
//传 nil,gesture 会返回触碰点在 windiow 上的值
CGPoint touchPoint = [gesture locationInView:nil];
//将得到的坐标转换成与 self.view 相对应的坐标
CGPoint convertPoint = [self.view convertPoint:touchPoint fromView:gesture.view];
//判断触碰点是否在 self.view。bounse 中,如果在则返回,否则调用 dismiss 方法
if (CGRectContainsPoint(self.view.bounds, convertPoint)) {
return;
} [self dismiss];
}
}
@end

############# 更新 2014年07月24日13:11:06 ###############

之前的方法处理之后会有个小问题,presented 的 ViewController 如果有个列表,无法拿到点击事件(Button 没有测试,不知是否一样)

解决办法:

http://stackoverflow.com/a/12851794

1.设置 tapGestureRecognizer

tapGesture.cancelsTouchesInView = NO;

2.设置 gestureRecognizer 的 delegate

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldReceiveTouch:(UITouch *)touch
{
if([touch.view class] == tableview.class){
return //YES/NO
} return //YES/NO }

3.用 UIControl 代替 tapGestureRecognizer

- (void)viewDidAppear:(BOOL)animated
{
if (iPadIdiom && self.dismissWhenTapOutsides) {
if (tapControl == nil) {
UIWindow *window = self.view.window;
tapControl = [[UIControl alloc] initWithFrame:window.bounds];
tapControl.backgroundColor = [UIColor clearColor];
[window insertSubview:tapControl atIndex:[window.subviews count] - ];
[tapControl addTarget:self action:@selector(dismissOnTap) forControlEvents:UIControlEventTouchDown];
}
} [super viewDidAppear:animated];
} - (void)dismissOnTap
{
[self dismissViewControllerAnimated:YES completion:nil];
} - (void)viewWillDisappear:(BOOL)animated
{
//将手势从 window 上移除
if (self.dismissWhenTapOutsides) { if (tapControl && tapControl.superview) {
[tapControl removeFromSuperview];
tapControl = nil;
}
} [super viewWillDisappear:animated];
}

iOS:当点击 FormSheet 之外时,关闭该视图的更多相关文章

  1. jq自定义下拉菜单,当用户点击非自身元素(下拉菜单)本身时关闭下拉菜单

    jq自定义下拉菜单,当用户点击非自身元素(下拉菜单)本身时关闭下拉菜单 截图: 代码如下: //关闭用户菜单 $(document).mousedown(function(e){ var _con = ...

  2. Swift - 点击输入框外部屏幕关闭虚拟键盘

    我们如果把文本框的Return Key设置成Done,然后在storyboard中将文本框的Did End On Exit事件在代码里进行关联.同时关联代码里调用文本框的resignFirstResp ...

  3. 在android中如何通过点击edittext之外的部分使软键盘隐藏

    我们知道在android中点击edittext框就会自动弹出软键盘,那怎么通过点击edittext之外的部分使软键盘隐藏呢?(微信聊天时的输入框就是这个效果,这个给用户的体验还是很不错的) 首先我们要 ...

  4. bootstrap 弹出框点击其他区域时弹出框不消失选项设置

    默认情况下,bootstrap 弹出框点击其他区域时,弹出框会自动关闭,在很多时候,我们可能会希望达到和原生弹出框一样的效果,避免不小心点击其他区域时弹框自动隐藏,尤其是对于一些复杂的表单,重复填写可 ...

  5. VS2015 调试中断点突然失效的解决办法、VS调试时关闭调试让浏览器继续保留页面

    VS2010 调试中断点突然失效的解决办法 问题描述:在调试前加了断点,但debug时红色的断点变成透明的圆圈加一个感叹号,执行到该处时也不会停止. 这个问题遇到过几次了,前几次都没怎么注意,有时候是 ...

  6. VC被控制时关闭极域电子教室、破解联想硬盘保护系统密码(上)

    <[原]关于VC运行时关闭极域电子教室的改进方法> 本文将讲资料和方法,具体实现和破解联想硬盘保护系统密码在(下)中,有关破解联想硬盘保护系统(删除它)的方法很简单,用硬盘保护卡克星就可以 ...

  7. 修改jq weui自定义对话框点击确定按钮不关闭对话框

    如果我们在对话框给用户输入值时,当用户输入空值点击确定按钮时,应该给个提示然后让用户继续输入. 如果在方法里使用 return false;,结果用户输入空值时对话框还是会关闭.正确做法如下: 先设置 ...

  8. 【iOS开发-30】UITabBarController的几种代理方法以及结合NSUserDefaults还原上次退出时被选中视图控制器和视图控制器的顺序

    一.UITabBarController的几种代理方法 在AppDelegate.h中加入一个协议<UITabBarControllerDelegate>.然后再AppDelegate.m ...

  9. IOS系统input输入框为readonly时, 隐藏键盘上的上下箭头

    业务中在一定场景中会将input 设置为只读状态,在IOS safari上当input 输入框focus 时,仍会出现键盘上的上下箭头,这种用户体验非常不好,如何干掉呢? <input read ...

随机推荐

  1. js生成二维码实例

    <!DOCTYPE html><html><head>    <title></title>    <meta charset=&qu ...

  2. LeetCode: Linked List Cycle II 解题报告

    Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cyc ...

  3. python-minidom模块【解析xml】

    1,xml的文档结构 1.1,XML文档包括XML头信息和XML信息体 1.1.1,XML文档头信息 <?xml version="1.0" encoding="u ...

  4. oracle的db link

    cd $ORACLE_HOME/network/admin vi tnsnames.ora 添加 CCPBS_19 =  (DESCRIPTION =    (ADDRESS_LIST =      ...

  5. [转]SpringMVC<from:form>表单标签和<input>表单标签简介

    原文地址:https://blog.csdn.net/hp_yangpeng/article/details/51906654 在使用SpringMVC的时候我们可以使用Spring封装的一系列表单标 ...

  6. 使用EGit插件将Eclipse现有项目分享到git@osc

    . . . . . 程序员一定要养成使用版本管理工具的好习惯,即使是自己一个人开发的项目也要加入到版本管理工具中.使用版本管理工具主要有两个好处:一个是更好的管理多个副本,这个优势不用说了:另一个就是 ...

  7. hive INSERT OVERWRITE table could not be cleaned up.

    create table maats.account_channel ROW FORMAT DELIMITED FIELDS TERMINATED BY '^' STORED AS TEXTFILE ...

  8. The type name 'IComponentConnector' could not be found in the namespace 'System.Windows.Markup'

    场景:Visual Studio写WPF项目时,想要生成XML文件,默认的WPF项目没有引入System.XML这个dll.在[解决方案资源管理器——引用]右键添加了System.XML引用后,运行项 ...

  9. Mongo分区后分片下count记录不准确

    问题描述 问题如图,后来上网查了一下,发现了这是正常现象: 官方文档解释了这种现象的原因以及解决方法: 不准确的原因: 操作的是分片的集合(前提): shard分片正在做块迁移,导致有重复数据出现 存 ...

  10. 适配器模式,装饰模式,代理模式异同<转>

    节前把3个设计模式的学习心得分享了一下,分别是适配器模式,装饰模式,代理模式. 但是似乎越写越有些迷糊,这三种模式都有着一些大同小异的地方,总是有些搞不清. 今天再重新学习下,把学习心得分享给大家一下 ...