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 ...
随机推荐
- LeetCode: Palindrome Partitioning 解题报告
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...
- 使用 libvirt创建和管理KVM虚拟机
1. libvirt介绍 Libvirt是一个软件集合,便于使用者管理虚拟机和其他虚拟化功能,比如存储和网络接口管理等等.Libvirt概括起来包括一个API库.一个 daemon(libv ...
- testUrl
def ConnectTest(url): try: response = requests.get(url) return response.status_code except requests. ...
- 百度BAE使用ueditor 上传图片
研究BAE 也有一段时间了,但一直无法解决BAE 上传图片的问题. 在阅读了 http://blog.csdn.net/auver/article/details/10103789 和 http:// ...
- Java中的守护线程——daemon
絮叨 Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 定义:守护线程(aka:服务线程),在没有用户线程可服务时会自动离开. 优先级:守护线程的优先级 ...
- C++11中如何输出enum class的值
Unlike an unscoped enumeration, a scoped enumeration is not implicitly convertible to its integer va ...
- QButton
Button.h #pragma once // QButton class QButton : public CButton { DECLARE_DYNAMIC(QButton) // Constr ...
- PHP数组缓存:三种方式JSON、序列化和var_export的比较
使用PHP的站点系统,在面对大数据量的时候不得不引入缓存机制.有一种简单有效的办法是将PHP的对象缓存到文件里.下面我来对这3种缓存方法进行说明和比较. 第一种方法:JSONJSON缓存变量的方式主要 ...
- 微信小程序——获取元素的宽高等属性
微信小程序里面无法像用jquery一样获取到元素的节点.小程序提供了一个wx.createSelectorQuery()来获取元素的相关信息.官方的文档对于它的用法都已经写的很详细了. 我直接上在项目 ...
- 基于html5 canvas 的客户端异步上传图片的插件,支持客户端压缩图片尺寸
/** * Created by xx on 15-05-28. * 基于html5 canvas 的客户端异步上传画片的插件 * 在实际应用中,常常要用于上传图片的功能.在现在越来越多的手机weba ...