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)
}

results matching ""

    No results matching ""