苹果开发 笔记(67)模态弹出和退出窗口
来源:互联网 发布:php url补全函数 编辑:程序博客网 时间:2024/06/03 22:05
平时在玩QQ或者看优酷的APP的的时候,一直很好奇这种弹出窗口是怎样做。在对比一些应用后,发现很多设置界面都有类似这样效果,弹出后以一个小窗口半透明的形式展示,同时也发现窗口大小也很类似。百度一下,发现一篇文章解答我的问题。
官方文档介绍
简单介绍modalPresentationStyle
1.弹出窗口
引用下面的文字说明。要做出优酷和QQ这种弹出界面需要对一个UIViewController 设置一下即可。
由于iPhone和iPodtouch的屏幕很小,不同的模式显示样式仅在iPad上可用。模态显示风格定义了模态视图的内容视图,以及在整个屏幕范围内如何显示出来。有四种可选的iPad的模式显示样式。
UIModalPresentationFullScreen:这是模态视图显示样式的默认选项,并且是iPhone和iPod模式视图的唯一选择。此时,在过渡动画结束后,模态视图占据整个屏幕。
UIModalPresentationPageSheet:当一个模态视图是以页面表显示时,内容视图的宽度设置为设备的纵向模式的宽度或768单位。当在横向模式下,页面居中中心显示,外围区域变暗。这种风格的一个例子是iPad自带的Mail应用程序撰写新邮件时的视图。
UIModalPresentationFormSheet:类似页面表的显示风格,表单模态视图的内容视图比iPad的屏幕尺寸小,其边界以外区域也变暗。然而,表单模态视图显示风格有一个固定的宽度和高度,是540x620.旋转设备模式视图将保持在屏幕中心而不改变它的大小。
UIModalPresentationCurrentContext:模态视图简单地使用其父视图控制器相同的风格作为它自己的风格。
下面做一个小测试,我们新建一个类,名为NWViewController 直接继承UITableViewController
设置一下显示的数据。
关键的几行代码就可以实现出上面效果了。
NWViewController *viewController =[[NWViewController alloc]init]; UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:viewController]; nav.modalPresentationStyle = UIModalPresentationFormSheet; nav.view.backgroundColor = [UIColor clearColor]; [self presentViewController:nav animated:YES completion:nil];
效果差不多展示了
2.退出窗口
使用presentViewController 有一个专门的对应方法 响应关闭,那就是
dismissViewControllerAnimated 的方法。有时候这个方法确实不太好记,做一下笔记。
[self presentViewController:viewController animated:YES completion:nil];[self dismissViewControllerAnimated:YES completion:nil]
3.点击灰色区域退出
为了做到一些体验,经常可以看到点击灰色区域就能实现其退出效果,于是可以加入手势来帮助我们退出。
下面也看看以下stackflow的讨论内容,里面也有相应的解决方案。
stackflow 参考讨论解决点击灰色区域退出内容的办法
从这里解决方案当中,很多情况使用self.view.window 添加手势,而不是self.view 。
遇到怪现象,开始的时候没有使用UIGestureRecognizerDelegate 代理的方式,发现其点击灰色区域一直没有相应,加上去就有相应了。
在这些讨论当中,我认为是这个方案解决关键点是依赖触摸的点是不是在视图外。
引用老外讨论下面的代码,经过测试一下。效果正是我们所期待的。这个添加手势,点击灰色区域退出的方法测试基本ok满足我们的需求。
- (void)tapBehindDetected:(UITapGestureRecognizer *)sender{ if (sender.state == UIGestureRecognizerStateEnded) { CGPoint location = [sender locationInView:nil]; //Passing nil gives us coordinates in the window //Convert tap location into the local view's coordinate system. If outside, dismiss the view. if (![self.presentedViewController.view pointInside:[self.presentedViewController.view convertPoint:location fromView:self.view.window] withEvent:nil]) { if(self.presentedViewController) { [self dismissViewControllerAnimated:YES completion:nil]; } } }}
4.一些测试疑惑
NWViewController *viewController =[[NWViewController alloc]init]; UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:viewController]; nav.modalPresentationStyle = UIModalPresentationFormSheet; nav.view.backgroundColor = [UIColor clearColor]; [self presentViewController:nav animated:YES completion:nil];
当中这一行代码 nav.view.backgroundColor = [UIColor clearColor]; 我去掉了后,在真机的调试当中还是可以呈现出来。很多文章提及到这一行是需要的,但是当去掉了这种模态效果没有收到什么影响。
5.弹出与退出
[self presentViewController:viewController animated:YES completion:nil];[self dismissViewControllerAnimated:YES completion:nil]
使用上面的代码 可以实现弹出和退出的效果,加入手势点击退出则需要额外对手势做出一些判断和处理。
需要在窗口- (void) viewDidAppear:(BOOL) animated
方法去添加处理的手势代码。
- 苹果开发 笔记(67)模态弹出和退出窗口
- Android开发,仿苹果的弹出窗口界面、以及窗口动画效果、窗口圆角实现。
- windows 延时退出弹出窗口
- 弹出模态窗口
- 苹果开发 笔记(85)UIActionSheet 和UIAlertView 已经失效
- 苹果开发 笔记(94) UIScrollView 和 Masonry
- 苹果开发 笔记(1)
- 苹果开发 笔记(2)
- 苹果开发 笔记(3)
- 苹果开发 笔记(4)
- 苹果开发 笔记(9)
- 苹果开发 笔记(10)
- 苹果开发 笔记(13)
- 苹果开发 笔记(14)
- 苹果开发 笔记(15)
- 苹果开发 笔记(16)
- 苹果开发 笔记(17)
- 苹果开发 笔记(18)
- Android OkHttp完全解析 是时候来了解OkHttp了
- mysql判断一个字符串是否包含某子串【转】
- C#中的线程(一)入门
- 关于Java的一些小测试
- session在实际管理中的应用
- 苹果开发 笔记(67)模态弹出和退出窗口
- Intel李锐:Hive on Spark解析
- 第一次开通博客,以后这里就是我的独家技术基地
- iOS 利用UIScrollView 对图片进行缩放
- MVC中的筛选器
- 社説 20150831 旧ソ連抑留者 「シベリア以外」の解明も急げ
- 如何使用UIAutomation进行iOS 自动化测试(Part I)
- hust1342(流量有上下界的最小流)
- 用lazarus快速创建xml格式文件