iOS8特性 UIPresentationController

UIPresentationController是提供高级视图切换的类。它让管理present ViewController的过程变得简单。

先讲一些presentation基础知识,在iPad的设置页面,可以通过popOver弹出一个UIViewController,这个弹出的,可以和用户交互的Controller叫做PresentedViewController,而后面那个被部分遮挡的UIViewController叫做PresentingViewController,而在UIPresentationController中,PresentedViewController是presentation的content,而PresentingViewController叫做Chrome。如下图:

PresentedViewController和PresentingViewControllerContent

Chrome

所有的UIViewController的presentation都是由UIPresentationController管理的。在UIPresentationController中可以定义content和chrome的动画,可以根据大小的变化来改变content大小,可以根据系统的不同,来改变展示方式,UIPresentationController也是可复用的,可以很容易的拿到其他的UIViewController中去使用。


UIPopoverPresentationController

它在iOS8中替代了UIPopoverController,它在功能上与旧的controller完全等同,并且新增了一些内置的适配特性,可以自动适配iPad与iPhone。以下是新版与旧版接口的比较:

UIPopoverController使用方法:

我们先声明了一个UIViewController作为content controller,使用它初始化了一个UIPopoverController,然后调用presentPopover方法来展示它。这是在iPad上的用法。如果要创建一个在iPad与iPhone上通用的方法,那么需要以下的代码:

我们需要去判断设备是否为iPad,若为iPad,那么创建一个UIPopoverController并展示它,若不是iPad,那么就需要调用常规的presentViewController方法来展示一个UIViewController。

然而我们如果使用UIPopoverPresentationController,那么就不再需要判断设备:

将UIViewController的modalPresentationStyle设置成UIModalPresentationPopover,这个值用来实现popover效果,并且各个平台自动适应。第二行中,通过popoverPresentationController属性来获取它的popoverPresentationController,而不是创建一个新的。然后设置它的一些界面属性,最后调用presentViewController方法来显示这个controller。这样就可以在iPad与iPhone显示自动适应的popover效果了,如下图所示:

iPad效果iPhone效果

可见,iPhone上,只是作为一个普通的UITableViewController展示出来。

iPhone上的自适应是在delegate中实现的:

在第一个方法中,指定了UIModelPresentationFullScreen的样式来展示controller。第二个方法中,我们将presentedViewController使用UINavigationController包装起来,使得可以在选中某项之后,通过navigationController提供的一些方法来展示内容,或者后退。


UIAlertView与UIActionSheet

UIAlertView与UIActionSheet都是继承自UIView的,但是它们在实现时,却用了一些UIViewController的方式,并且它的接口比较旧,采用的是delegate方式。在iOS8中,新增了UIAlertController,它可以同时实现Alert和Action Sheets,并且接口采用block方式,它将在应用的同一个window中展示,而不是之前的新window中展示,它还具有和之前的popover controller相同的实现方式,通过presentViewController来展示。下面是新的UIAlertController的用法:

首先创建一个UIAlertController,之后通过addAction方法来增加一些action,而UIAlertAction使用block来设置按钮的点击处理方法。最后,通过调用presentViewController来展示UIAlertController。


UISearchDisplayController

search在iOS中包含两部分:UISearchBar与UISearchDisplayController。它们都是很古老的接口,功能与样式都不能满足现状的应用,UISearchDisplayController的配置项很少,它只能在tableView中显示结果,而不能在collectionView或者mapView中显示。它的present过程只是通过addSubview来将view作为一个子view添加上去。而如果它的父view是一个scrollView,那么手势处理就会有冲突。在iOS8中,引入了UISearchController,它允许presentingController是任意类型的,不一定是全屏幕的,search bar animation可以自定义,并且可以在不同平台上适配。

在之前的接口中,我们使用UISearchDisplayController来实现search功能:

首先初始化一个UISearchBar,再用它初始化一个UISearchDisplayController,指定controller的searchResuleDataSource与searchResultDelegate,之后,将searchBar作为当前view中的tableView的tableHeaderView来显示。而在iOS8中,实现方式是这样的:

首先初始化一个自定义的resultsController,可以是一个collectionView,也可以是一些其他的自定义样式。之后使用这个resultsController创建一个UISearchController,指定searchController的searchResultsUpdater为resultsController,之后将searchBar加到tableView的tableHeaderView上,最后,设置当前Controller的definesPresentationContext为YES,表示UISearchController在present时,可以覆盖当前controller。


经过这样的修改,所有的都变成了Controller,不再有UIView组件,也不再需要通过创建新window来展示UIView,更加容易控制。UIPresentationController为Content与Chrome提供了一个很好的抽象,并且在iPad与iPhone间,自动适应使得编码更简洁。

**********************************

1.回顾UIPopoverController的使用,下面这份代码只能在ipad下运行

// 初始化控制器,SecondViewController类继承自UIViewController

 SecondViewController *vc = [[SecondViewController alloc] init];

// 把vc包装成UIPopoverController

UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:vc];

  // 设置popover的指向,

  // 指向当前控制上button按钮,所以FromRect后跟bounds

  // 如果是指向当前控制的View,则FromRect后跟frame

[popover presentPopoverFromRect:self.button.bounds inView:self.button permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

2. 运用UIPopoverPresentationController,下面这份代码在iphone和ipad中,都可以正常运行

2.1 在iphone中是常见的modal方式,也就是从屏幕底部爬上来,而在ipad中,是popover的那种方式

 // 初始化控制器

SecondViewController *vc = [[SecondViewController alloc] init];

// modal出来是个popover

vc.modalPresentationStyle = UIModalPresentationPopover;

// 取出vc所在的UIPopoverPresentationController

vc.popoverPresentationController.sourceView = self.button;

vc.popoverPresentationController.sourceRect = self.button.bounds;

[self presentViewController:vc animated:YES completion:nil];

2.2 在iphone中,上面这份代码等同于下面:

SecondViewController *vc = [[SecondViewController alloc] init];

/* 相当于中间3行代码不存在

vc.modalPresentationStyle = UIModalPresentationPopover;

vc.popoverPresentationController.sourceView = self.button;

vc.popoverPresentationController.sourceRect = self.button.bounds;

*/

[self presentViewController:vc animated:YES completion:nil];

2.3 苹果在iOS8中对UIViewController做了类扩展

  也就是说popoverPresentationController是UIViewController的属性

  modalPresentationStyle是UIViewController成员变量

  UIPopoverPresentationController继承自UIPresentationController, UIPresentationController又继承自NSObject

时间: 2024-10-06 11:57:48

iOS8特性 UIPresentationController的相关文章

iOS8新特性 UIPresentationController(一)

UIPresentationController(一) popover.alert.action sheet与search的新特性 刘冰发表于测试?看我的 刘冰 2014年07月02日 发表 收录了本文的主题 测试?看我的 一枚测试人员很小,这个世界很大,让我们的分享无限!学点有用的:) + 订阅更多收录本文的主题 UIPresentationController是提供高级视图切换的类.它让管理present ViewController的过程变得简单. 先讲一些presentation基础知识

iOS iOS8新特性--UIPresentationController

1. UIPresentationController的作用 1>管理所有Modal出来的控制器 2>管理通过这个方法  - (void) presentViewController:(UIViewController *) animated:(BOOL) completion:^(void)completion;显示出来的控制器 3>管理\监听 切换控制器的过程 2. UIPresentationController的作用 1>控制器一旦调了present方法,控制器的prese

iOS8的UIPresentationController

本文转载至 http://kyfxbl.iteye.com/blog/2147888 从iOS8开始,controller之间的跳转特效,需要用新的API UIPresentationController来实现.比如希望实现这样一个特效:显示一个模态窗口,大小和位置是自定义的,遮罩在原来的页面上.在iOS8之前,可以在viewWillAppear里设置superview的frame: Objc代码   - (void)presentModal:(NSDictionary*)result { YL

UITableViewCell 自适应高度 ios8特性

这篇文章介绍了在一个动态数据的 table view 中,cell 根据 text view 内容的输入实时改变 cell 和 table view 的高度.自动计算 cell 高度的功能使用 iOS 8 才支持的自适应 cell,如果你还不知道 iOS 8 自适应 cell,可以参看这篇文章:iOS 8 自适应 Cell 先上图,我们最终要实现的效果是这样的: 图 1:实时更新 cell 高度 实现上面效果的基本原理是:  在 cell 中设置好 text view 的 autolayout,

iOS iPad开发之Modal

1. 最普通的Modal QKSecondViewController *second = [[QKSecondViewController alloc]init]; [self presentViewController:second animated:YES completion:nil]; 2. Modal的过程可以通过2个属性去设置:modalTransitionStyle 和 modalPresentationStyle 前者决定以怎样的动画出来, 后者决定动画结束后展示的面积 /*

iOS iOS8新特性-UIAlertController

iOS iOS8新特性--UIAlertController 1. iOS7及iOS7之前警告类控件有UIAlertView和UIActionSheet 1.1 UIAlertView的使用 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"警告" message:@"这是一个UIAlertView" delegate:nil cancelButtonTitle:@"取消" oth

ios8中 利用UIPresentationController 自定义转场

1.UIPresentationController 介绍 UIPresentationController 是 iOS8 新增的一个 API,用来控制 controller 之间的跳转特效.比如希望实现一个特效,显示一个窗口,大小和位置都是自定义的,并且遮罩在原来的页面上.在之前,可以操作view的一些方法来实现. 2.使用介绍 1. 设置目标控制器的 转场代理 和 展示方法 controller.modalPresentationStyle = UIModalPresentationStyl

ios8新特性屏幕适配之sizeclass

ios8推出也有一段时间了,由于时间比较紧,所以没去学习ios8的新特性, 随着iphone6,6+的推出,ios屏幕适配是一个大问题,如何成功适配各种尺寸以及ipad呢? 苹果公司为了解决这个问题给出了新技术sizeclass 下面是我对sizeclass学习的一些笔记,希望对大家有用: 1>屏幕适配的发展历程 代码计算frame -> autoreszing(父控件和子控件的关系ios6) -> autolayout(任何控件都可以产生关系ios7) -> sizeclass(

ios8新特性widget开发-b

os8发布已经有一段时间了,伴随着ios8同时也出现了许多新的特性,ios系统将会越来越开放,这是好事.其中一个新特性就是在下拉通知栏里加入了个性的widget,开发者可以自己定义widget的样式内容.当然这个功能在Android上早就实现了,^_^.........,如下图: 首先先说几个概念, 1.app extension:extension是iOS8新开放的一种对几个固定系统区域的扩展机制,extension并不是一个独立的app,它有一个包含在app bundle中的独立bundle