UIPopoverController
什么是UIPopoverController
- 是iPad开发中常见的一种控制器
- 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController
- 它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面
要想显示一个UIPopoverController,需要经过下列步骤
- 设置内容控制器
let contentVC = ZFTableViewController()
let popVC = UIPopoverController.init(contentViewController: contentVC)
由于UIPopoverController直接继承自NSObject,不具备可视化的能力 因此UIPopoverController上面的内容必须由另外一个继承自UIViewController的控制器来提供,这个控制器称为“内容控制器”
- 设置内容的尺寸
显示出来占据多少屏幕空间
popVC.setContentSize(CGSize(width: 300, height: 600), animated: true)
也可以在弹出的控制器中设置ContentSize
preferredContentSize = CGSize(width: 500, height: 600)
- 设置显示的位置
从哪个地方冒出来
//比如某个button
popVC.present(from: button, permittedArrowDirections: .any, animated: true)
- from :围绕着哪个UIBarButtonItem显示
- permittedArrowDirections :箭头的方向
- animated :是否通过动画显示出来
围绕着某一块特定区域显示(箭头指定那块特定区域)
popVC.present(from: CGRect.init(x: sender.frame.width, y: sender.frame.height * 0.5, width: 20, height: 0), in: sender, permittedArrowDirections: .left, animated: true)
- from :指定箭头所指区域的矩形框范围(位置和尺寸)
- in :从哪个view冒出来,rect参数是以in(view)的左上角为坐标原点(0,0)
- permittedArrowDirections :箭头的方向
- animated :是否通过动画显示出来
- 防止点击UIPopoverController区域外消失
//比如需要某button仍然可以点击
popVC.passthroughViews = [button]
- 常见报错
在popover的使用过程中,经常会遇到这个错误
-[UIPopoverController dealloc] reached while popover is still visible.
错误的大体意思是:popover在仍旧可见的时候被销毁了(调用了dealloc)
从错误可以得出的结论
- 当popover仍旧可见的时候,不准销毁popover对象
- 在销毁popover对象之前,一定先让popover消失(不可见)
iOS8.0之后的PopOver
@IBAction func popOver(_ sender: UIBarButtonItem) {
let vc = UIViewController()
vc.modalPresentationStyle = .popover
// 设置弹出的barButtonItem
vc.popoverPresentationController?.barButtonItem = sender
// 设置弹出的view位置
//vc.popoverPresentationController?.sourceView = button
// 设置可以穿透交互的控件
//vc.popoverPresentationController?.passthroughViews = button
// 设置箭头的方向
//vc.popoverPresentationController?.arrowDirection = .right
// 设置弹出的范围
//vc.popoverPresentationController?.sourceRect = CGRect(.....)
present(vc, animated: true, completion: nil)
}