苹果开发 笔记(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
方法去添加处理的手势代码。

0 0
原创粉丝点击