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 ...
随机推荐
- jquery实现全选/反选功能
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
- LeetCode: Binary Tree Maximum Path Sum 解题报告
Binary Tree Maximum Path SumGiven a binary tree, find the maximum path sum. The path may start and e ...
- LeetCode: 【L4】N-Queens 解题报告
[L4]N-Queens 解题报告 N-Queens Total Accepted: 16418 Total Submissions: 63309 My Submissions The n-queen ...
- HttpClient request payload post请求
RequestEntity entity = new StringRequestEntity(str, "text/html", "utf-8"); post. ...
- Android SDK下载和更新失败解决方法
原因是dl-ssl.google.com访问不到,解决方法就是修改C:\Windows\System32\drivers\etc\hosts文件.添加一行: 74.125.237.1 dl ...
- Android开发(三十)——ScrollView中ListView的高度自动适应
int totalHeight = 0; for (int i = 0; i < mStrings.length; i++) { //pullList ListView //mAdapter A ...
- iOS隐藏状态栏
1.整个项目隐藏状态栏 在Targets->General->勾选中Hide status bar . 整个项目隐藏状态栏 2.单个界面隐藏状态栏,例如登录注册页面 1.首先在info.p ...
- java基础解疑!!!
疑问一:0.01+0.09的结果? public class MathTest{ public static void main(String[]args){ double a = 0.01, b = ...
- C语言 · 删除重复元素
算法提高 11-2删除重复元素 时间限制:10.0s 内存限制:256.0MB 问题描述 为库设计新函数DelPack,删除输入字符串中所有的重复元素.不连续的重复元素也要删除. 要 ...
- 远程log调试工具console.re
http://console.re/ https://github.com/kurdin/console-remote 前文提到在手机微信上调试代码很痛苦,看不到日志.为了看到日志,得把日志发到服务器 ...