@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. 用nodejs http-server搭建本地服务环境

    一.本地环境,不包括域名的方法: https://www.npmjs.com/package/http-server(参考手册) 正确使用方法:

  2. 通过Fiddler肆意修改接口返回数据进行测试

    [本文出自天外归云的博客园] 方法介绍与比对 在测试的过程中,有的需求是这样的,它需要你修改接口返回的数据,从而检查在客户端手机app内是否显示正确,这也算是一种接口容错测试,接口容错测试属于app性 ...

  3. 在python3.3后urllib2已经不能再用,只能用urllib.request来代替

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在python3.3后urllib2已经不能再用,只能用urllib.request来代替 response=urllib2.urlopen(' ...

  4. [转]mysql中的字符串的拼接

    字符串的拼接 1,Mysql 在Java.C#等编程语言中字符串的拼接可以通过加号“+”来实现,比如:"1"+"3"."a"+"b ...

  5. SOAPUI 測试Http 协义

    眼下大多站点都是採用Http 协义的,那SOAPUI要怎样操作呢 网上好多是用谷歌做演示样例的,因为谷歌国内正常方式无法訪问,故下面将採用百度站点做演示样例 1:打开浏览器输入百度网址在文库中输入SO ...

  6. JavaScript 里面的整数 位 操作

    JavaScript 整数位操作. 与 操作符 & val num1 = 10; val num2 = 11; val num3 = num1 & num2; // num3 == 1 ...

  7. [数据结构]图的DFS和BFS的两种实现方式

    深度优先搜索 深度优先搜索,我们以无向图为例. 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发, ...

  8. JavaScript:属性的操作

    一.属性的设置和获取 1.属性的设置和获取主要有两种方式: <!DOCTYPE html> <html lang="en"> <head> &l ...

  9. R-Sys.time计算程序运行时间

    R用Sys.time()可以查看当前系统时间程序开始时记录: timestart<-Sys.time()程序临结束时记录: timeend<-Sys.time()程序运行时间: runni ...

  10. FileOutPutStream in 创新实训 自然语言交流系统

    FileOutPutStream在c盘等一级目录下是可以创建文件的,如: new FileOutputStream("c:\\kk.txt");但是在c\\test等就创建不了,F ...