如何在swift中居中popoverview

mcf*_*oft 43 modal-dialog uipopovercontroller ios swift

我有以下代码来显示没有箭头的popoverview(对话框),它工作正常.唯一的问题是,对话框显示在左上角(IPad).我想将视图置于屏幕中心.

在我的下面的代码中要更改或添加什么?:

func show_help(){


    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewControllerWithIdentifier("Help") as! UIViewController

    controller.modalPresentationStyle = UIModalPresentationStyle.popover

    let popoverPresentationController = controller.popoverPresentationController

    // result is an optional (but should not be nil if modalPresentationStyle is popover)
    if let _popoverPresentationController = popoverPresentationController {

        // set the view from which to pop up
        _popoverPresentationController.sourceView = self.view;
        _popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirection.allZeros;
        // present (id iPhone it is a modal automatic full screen)
        self.presentViewController(controller, animated: true, completion: nil)
    }

}
Run Code Online (Sandbox Code Playgroud)

额外的信息

在此输入图像描述

在我的视图中,链接到我的viewcontroller我设置了这样的优先大小:

override func viewDidLoad() {
        let dialogheigth:CGFloat = self.view.frame.height * 0.5;
        let dialogwidth:CGFloat = self.view.frame.width * 0.5;
        self.preferredContentSize = CGSizeMake(dialogwidth,dialogheigth);
}
Run Code Online (Sandbox Code Playgroud)

Ist*_*van 86

您需要为popover提供源rect.

从apple文档中:source rect是指定视图中用于锚定popover的矩形.将此属性与sourceView属性结合使用可指定弹出窗口的锚点位置.

在你的情况下,在

_popoverPresentationController.sourceView = self.view;
Run Code Online (Sandbox Code Playgroud)

加:

_popoverPresentationController.sourceRect = CGRectMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds),0,0)
Run Code Online (Sandbox Code Playgroud)

它会做的伎俩!

在此输入图像描述

  • 轮换后似乎没有保持居中.有关保持警报居中的建议吗? (3认同)
  • @Istvan,谢谢。为了使它对我有用,我必须通过执行popover?.permittedArrowDirections = UIPopoverArrowDirection()来摆脱箭头,否则箭头指向屏幕的中间,即,popover仅覆盖屏幕的一半。我的弹出窗口是通过点击tableViewCell生成的 (2认同)

Joh*_*cke 34

这是使用Swift 3的实现

let popover = storyboard?.instantiateViewController(withIdentifier: "popover") as! PopoverVC

    popover.modalPresentationStyle = UIModalPresentationStyle.popover
    popover.popoverPresentationController?.backgroundColor = UIColor.green
    popover.popoverPresentationController?.delegate = self

    popover.popoverPresentationController?.sourceView = self.view
    popover.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)

    popover.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)

    self.present(popover, animated: true)
Run Code Online (Sandbox Code Playgroud)

基于Istvan的 回答


小智 14

Swift 4实现:

popover.popoverPresentationController?.sourceRect = CGRect(x: view.center.x, y: view.center.y, width: 0, height: 0)
popover.popoverPresentationController?.sourceView = view
popover.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
Run Code Online (Sandbox Code Playgroud)


ins*_*eof 5

Swift 3(Xcode 8,iOS 9)的另一种方法是:

从某处调用:

self.performSegue(withIdentifier: "showPopupSegue", sender: yourButton)
Run Code Online (Sandbox Code Playgroud)

在 segue 被触发之前被调用的函数:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let popoverPresentationController = segue.destination.popoverPresentationController {
        let controller = popoverPresentationController
        controller.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
        controller.sourceView = self.view
        controller.sourceRect = CGRect(x: UIScreen.main.bounds.width * 0.5 - 200, y: UIScreen.main.bounds.height * 0.5 - 100, width: 400, height: 200)
        segue.destination.preferredContentSize=CGSize(width: 400, height: 200)
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住将 storyboard segue 的 Kind 属性设置为“Present as Popover”,并将 Anchor 属性设置为之前视图控制器中的任何视图。


Kir*_*n K 5

中心 Popover 控制器的 Swift 4 实现

let navigationController = UINavigationController(rootViewController: controller)

 navigationController.modalPresentationStyle = .popover      
 navigationController.modalPresentationStyle = UIModalPresentationStyle.popover
 let popover = navigationController.popoverPresentationController
 controller.preferredContentSize = CGSize(width:500,height:600) //manage according to Device like iPad/iPhone
 popover?.delegate = self
 popover?.sourceView = self.view
 popover?.sourceRect = CGRect(x: view.center.x, y: view.     .y, width: 0, height: 0)
 popover?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)

 self.present(navigationController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)