- UIPopoverController是iPad开发中常见的一种控制器,
- 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController
- 它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面
UIPopoverController 使用步骤
- 设置内容控制器
由于UIPopoverController直接继承自NSObject,不具备可视化的能力
因此UIPopoverController上面的内容必须由另外一个继承自UIViewController的控制器来提供,这个控制器称为“内容控制器”
在初始化UIPopoverController的时候传入一个内容控制器
- (id)initWithContentViewController:(UIViewController *)viewController
更改内容控制器
@property (nonatomic, retain) UIViewController *contentViewController;
- (void)setContentViewController:(UIViewController *)viewController animated:(BOOL)animated;
- 设置内容的尺寸
显示出来占据多少屏幕空间
方案1: 通过UIPopoverController对象设置
@property (nonatomic) CGSize popoverContentSize;
- (void)setPopoverContentSize:(CGSize)size animated:(BOOL)animated;
方案2: 通过内容控制器设置
@property (nonatomic) CGSize preferredContentSize;
- 设置显示的位置
从哪个地方冒出来
围绕着一个UIBarButtonItem显示(箭头指定那个UIBarButtonItem)
- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item
permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections
animated:(BOOL)animated;
围绕着某一块特定区域显示(箭头指定那块特定区域)
- (void)presentPopoverFromRect:(CGRect)rect
inView:(UIView *)view
permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections
animated:(BOOL)animated;
- 关闭UIPopoverController
- (void)dismissPopoverAnimated:(BOOL)animated;
注意: 防止点击UIPopoverController区域外消失
- 问题描述
只要UIPopoverController显示在屏幕上,UIPopoverController背后的所有控件默认是不能跟用户进行正常交互的
点击UIPopoverController区域外的控件,UIPopoverController默认会消失 - 解决方案
解决办法是设置passthroughViews属性
@property (nonatomic, copy) NSArray *passthroughViews;
这个属性是设置当UIPopoverController显示出来时,哪些控件可以继续跟用户进行正常交互。这样的话,点击区域外的控件就不会让UIPopoverController消失了
iOS8.0之后的的popover
1.自定义控制器ContentViewController为内容控制器
//创建内容控制器
let contentVC = UIViewController()
contentVC.preferredContentSize = CGSize(width: 50, height: 100)
contentVC.view.backgroundColor = UIColor.orange
//2.设置modal效果
contentVC.modalPresentationStyle = .popover
//2.1设置弹出的方向
contentVC.popoverPresentationController?.sourceView = view
contentVC.popoverPresentationController?.sourceRect = sender.frame
//2.2设置可以穿透的控件,
contentVC.popoverPresentationController?.passthroughViews = [btn1, btn2]
//设置背景图层
contentVC.popoverPresentationController?.backgroundColor = UIColor.systemPink
//弹出
present(contentVC, animated: true, completion: nil)
常见错误
- popover还没消失就被销毁
[UIPopoverController dealloc] reached while popover is still visible.
当popover仍旧可见的时候,不准销毁popover对象
在销毁popover对象之前,一定先让popover消失(不可见)
- 要想在iPhone中实现popover效果,必须得自定义view,可以参考
http://code4app.com/ios/Popover-View-in-iPhone/4fa931bd06f6e78d0f000000
http://code4app.com/ios/Popup-Menu/512231ac6803fa9e08000000
网友评论