英文原文链接:http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/Popovers.html
翻译原文链接:http://blog.youkuaiyun.com/lingedeng/article/details/6781385
Popovers
尽管它不是一个实际的viewcontroller,UIPopoverController类用来管理viewcontroller的显示。你可以使用popovercontroller对象来展示内容,使用popover,你可以让一个可见的层浮在应用程序的主窗口之上。Popovers提供了一个轻量级的方法用来显示或收集用户信息,通常在以下情况时使用:
-
1. 显示屏幕上一个对象的信息
-
2.用来管理经常访问的工具或配置项
-
3.用来显示一组要在你某个视图中对象上执行的命令
-
4.当设备在portrait方向时,用来显示原来landscape方向时split视图中显示的内容
使用Popover来处理命令通常比用Modelview更为常见。在iPad应用程序中,modelview用来需要用户显式的接受或拒绝某些动作或信息时。例如:你可以使用modelview要求用户输入密码,验证完成后才能进行下面的操作。在其它情况下,通常可以使用Popover来代替。Popovers的优点在于它显示的时候不会覆盖整个屏幕并且只要在popover视图之外点击下就能使其消失。这可为用户提供不需要交互但提供信息或一些额外的功能。
注:你应该先关闭一个popover然后再显示一个model视图。关于在你的APP上使用popover的具体准侧,参见“Popover (iPad Only)” in iOS Human Interface Guidelines.
下图显示了当设备在portrait方向时,用来显示原来landscape方向时split视图中显示的内容。选择一个play可以在主视图中显示与该play相关的内容。
创建并显示Popovers
Popover所显示的内容是从你所指定的viewcontroller中继承。Popovers可以展示各种类型的viewcontroller,包括:自定义的viewcontroller,tableview controller, navigation controller, tab barcontrollers。当你准备在popover中显示viewcontroller时,按下面的操作:
1.创建一个UIPopoverController的实例并使用你要展示的viewcontroller对其进行初始化
2.指定popover的大小,你可以通过两种方式指定:
- 为你要显示在popover中的viewcontroller的contentSizeForViewInPopover属性指定一个值
- 设置popovercontroller的popoverContentSize属性
3.添加代理
当你展示一个popover时,它就与界面中的某一部分发生了联系。Popovers通常与toolbarbutton发生联系,所以presentPopoverFromBarButtonItem:permittedArrowDirections:animated:方法是从应用程序toolbar显示Popover的便捷方式。你也可以使用presentPopoverFromRect:inView:permittedArrowDirections:animated:方法将popover与任一个视图相关联。
Popover通常从其显示的viewcontroller的contentSizeForViewInPopover属性中获得初始大小,该属性的缺省值为320×1100像素。你可以自定义通过为该属性赋值以改变popover的大小。你还可以通过修改popovercontroller的popoverContentSize属性以达到相同的目的。如果你更改了在popovercontroller中显示的视图,则popovercontroller的popoverContentSize属性也会被新展示视图的大小所覆盖。当popover显示时改变其展示的视图或popovercontroller的大小,则结果会以动画的效果加以展示。你还可以通过setPopoverContentSize:animated:方法更改popovercontroller的大小。
注:popovercontroller在屏幕上实际的显示位置取决于其自己并基于几点要素,包括你所要显示viewcontroller的大小,你要做为popview显示源的button或视图的位置以及显示箭头方向。
下面的代码展示了一个简单的动作方法:当用户点击toolbar上按钮时显示一个popover。Popover对象被要显示的其的viewcontroller对象所持有,popover的大小被设置为其所显示的视图的大小,但两种不必需相等。如果两种不相等,则必须使用scrollview来保证用户可以看到popover中的所有内容。
- - (IBAction)toolbarItemTapped:(id)sender
- {
- MyCustomViewController* content = [[MyCustomViewController alloc] init];
- UIPopoverController* aPopover = [[UIPopoverController alloc] initWithContentViewController:content];
- aPopover.delegate = self;
- [content release];
- // Store the popover in a custom property for later use.
- self.popoverController = aPopover;
- [aPopover release];
- [self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
- }
Popovers在用户点击Popover视图以外的区域时会自动消失。在Popover内部进行点击不会使其自动消失,但是你可以调用dismissPopoverAnimated:方法使其消失。你可能需要在用户选择了viewcontroller中的某项或执行某个动作,需要将Popover在屏幕上消失时调用该方法。要使用该方法,你必须将popovercontroller对象保存在其显示的viewcontroller能访问的地方,系统并不为你提供当前所显示popover的引用。
声明Popover代理
当用户点击Popover视图以外的区域使Popover自动消失时,popover自动通知其代理该事件的发生。如果你提供了代理对象,则你可以通过该对象保持已消失的popover或对于popover消失执行额外的操作。代理方法popoverControllerShouldDismissPopover:可以让你控制是否popover是否真的需要消失。如果代理没有定义该方法或者你将声明的该方法返回YES,则popovercontroller使popover消失并发送popoverControllerDidDismissPopover:方法给其代理。
在大多数情况下,你根本不需要声明popoverControllerShouldDismissPopover:代理方法。这个代理方法通常使用在关闭一个popover可能会引起错误中。比起让该方法返回NO,更好的方法是避免设计关闭popover时却因为条件未满足而需该popover继续显示的情况,当有这种情况时最好使用Modalview来代替。
当调用popoverControllerDidDismissPopover:代理方法时,popover已被从屏幕上移除。在这个时候,如果你不想再使用该popovercontroller则可将其释放。你还可通过这个方法来更新用户界面或应用程序状态。
管理应用程序中popover的提示
当你编写popover相关代码时请考虑以下问题:
如果通过程序方式关闭popover,则你需要一个指向popovercontroller的引用。获得这个引用的唯一方法是你自己对其进行保存,通常在popover所显示的viewcontroller中进行保存。这个操作可以保证其所显示的viewcontroller可以在用户进行相关操作时关闭popover
Popovercontroller可以被重用。可以将原先创建的进行缓存而不是重新建个新的。Popovercontroller的可塑性很高,你可以为其指定不同的viewcontroller或每次使用时对其重新进行配置。
当显示一个popover时,为permittedArrowDirections参数指定UIPopoverArrowDirectionAny常量可以使箭头指向任一方向。指定该值可以让UIKit以最灵活的方式显示popover或控制其大小。如果你指定了某个确定的方法,则Popovercontroller可能会在显示popover之前对其大小进行压缩。