iOS:当点击 FormSheet 之外时,关闭该视图
@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 之外时,关闭该视图的更多相关文章
- jq自定义下拉菜单,当用户点击非自身元素(下拉菜单)本身时关闭下拉菜单
jq自定义下拉菜单,当用户点击非自身元素(下拉菜单)本身时关闭下拉菜单 截图: 代码如下: //关闭用户菜单 $(document).mousedown(function(e){ var _con = ...
- Swift - 点击输入框外部屏幕关闭虚拟键盘
我们如果把文本框的Return Key设置成Done,然后在storyboard中将文本框的Did End On Exit事件在代码里进行关联.同时关联代码里调用文本框的resignFirstResp ...
- 在android中如何通过点击edittext之外的部分使软键盘隐藏
我们知道在android中点击edittext框就会自动弹出软键盘,那怎么通过点击edittext之外的部分使软键盘隐藏呢?(微信聊天时的输入框就是这个效果,这个给用户的体验还是很不错的) 首先我们要 ...
- bootstrap 弹出框点击其他区域时弹出框不消失选项设置
默认情况下,bootstrap 弹出框点击其他区域时,弹出框会自动关闭,在很多时候,我们可能会希望达到和原生弹出框一样的效果,避免不小心点击其他区域时弹框自动隐藏,尤其是对于一些复杂的表单,重复填写可 ...
- VS2015 调试中断点突然失效的解决办法、VS调试时关闭调试让浏览器继续保留页面
VS2010 调试中断点突然失效的解决办法 问题描述:在调试前加了断点,但debug时红色的断点变成透明的圆圈加一个感叹号,执行到该处时也不会停止. 这个问题遇到过几次了,前几次都没怎么注意,有时候是 ...
- VC被控制时关闭极域电子教室、破解联想硬盘保护系统密码(上)
<[原]关于VC运行时关闭极域电子教室的改进方法> 本文将讲资料和方法,具体实现和破解联想硬盘保护系统密码在(下)中,有关破解联想硬盘保护系统(删除它)的方法很简单,用硬盘保护卡克星就可以 ...
- 修改jq weui自定义对话框点击确定按钮不关闭对话框
如果我们在对话框给用户输入值时,当用户输入空值点击确定按钮时,应该给个提示然后让用户继续输入. 如果在方法里使用 return false;,结果用户输入空值时对话框还是会关闭.正确做法如下: 先设置 ...
- 【iOS开发-30】UITabBarController的几种代理方法以及结合NSUserDefaults还原上次退出时被选中视图控制器和视图控制器的顺序
一.UITabBarController的几种代理方法 在AppDelegate.h中加入一个协议<UITabBarControllerDelegate>.然后再AppDelegate.m ...
- IOS系统input输入框为readonly时, 隐藏键盘上的上下箭头
业务中在一定场景中会将input 设置为只读状态,在IOS safari上当input 输入框focus 时,仍会出现键盘上的上下箭头,这种用户体验非常不好,如何干掉呢? <input read ...
随机推荐
- Selenium查询10010账户余额——python篇
[本文出自天外归云的博客园] 问题 最近在网上搜到了一些练习题,改编了一下这里的20题如下:登陆中国联通网上营业厅 后选择「自助服务」-->「查询」-->「账户余额」,然后输出手机号码和可 ...
- “一键制作启动u盘失败”的主要原因是什么?
一键制作启动u盘失败的主要原因是什么?今天u启动小编就和大家一起来分析原因并寻求答案吧! 原因分析: 1.u盘内有文件正在运行或者是打开: 2.u盘自身的质量问题: 3.最主要的原 ...
- 纯真ip导入mysql
先从纯真官网右侧下载ip数据库 更新后,点击解压,可以把数据库保存为txt格式 格式化数据 ip格式如下图 可见并不是很规范,而且最底部字段数也不一致 先用正则表达式,查找替换一下 (\d+.\d+. ...
- 经常遇到的http状态码
200 success成功 301 MovedPermanently 永久性跳转 302 Found 临时性跳转 304 Not modified 未修改,不返回任何响应主体 400 Bad Requ ...
- PAGED_CODE()
#if DBG #define PAGED_CODE() \ /*APC_LEVEL*/) { \ VideoPortDebugPrint(, "Video: Pageable code c ...
- input 数字输入控制(含小数)
1,可以在keypress里验证输入的字符的合法性. // 数字控件的入力控制 $("input.comma,input.comma1,input.comma2").keypres ...
- Python - 连接msql数据库
可能出现的异常:python中出现SyntaxError: Non-UTF-8 code 解决方法 刚开始一直有用idle写代码,今天用了一下PyDev结果发现中文不支持,在网上搜了一下,结果发现解决 ...
- maven启动项目时报错
java.lang.UnsupportedClassVersionError eclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiM ...
- ggplot2 subscript in x-axis labels(ticks, legend)
#==============================# ggplot2: subscript in x-axis labels(ticks) rm(list=ls(all=TRUE))lib ...
- http://www.gasi.ch/blog/inside-deep-zoom-1/
In March 2007 Blaise Aguera y Arcas presented Seadragon & Photosynth at TED that created quite s ...