Ios 来自任意锚点的popover-Swift

Ios 来自任意锚点的popover-Swift,ios,swift,popover,Ios,Swift,Popover,我想用一个按钮做一个爆米花,如图所示: 为此,我遵循以下步骤: 1.我创建了一个视图控制器(加上一个控制器),并将其大小更改为100*200 2.我从第一个控制器(JobsViewController)切换到上面的控制器,并设置标识符: 3.在JobsViewController中: func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "showFeat

我想用一个按钮做一个爆米花,如图所示:

为此,我遵循以下步骤:

1.我创建了一个视图控制器(加上一个控制器),并将其大小更改为100*200

2.我从第一个控制器(
JobsViewController
)切换到上面的控制器,并设置标识符:

3.在
JobsViewController
中:

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showFeatureJobs" {

        //let popoverViewController = segue.destination
        // popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover
        // popoverViewController.popoverPresentationController!.delegate = self

        // get a reference to the view controller for the popover
        let popController = UIStoryboard(name: "JobsViewController", bundle: nil).instantiateViewController(withIdentifier: "showFeatureJobs")

        // set the presentation style
        popController.modalPresentationStyle = UIModalPresentationStyle.popover

        // set up the popover presentation controller
        popController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.up
        popController.popoverPresentationController?.delegate = self
        popController.popoverPresentationController?.sourceView = sender as! UIView? // button
        popController.popoverPresentationController?.sourceRect = (sender?.bounds)!

        // present the popover
        self.present(popController, animated: true, completion: nil)

    }
}

// MARK: - UIPopoverPresentationControllerDelegate method

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {

    // Force popover style
    return UIModalPresentationStyle.none
}
4.但当我点击我的按钮时,我的弹出框覆盖了我的所有页面:


我的问题在哪里?

popover控制器应该已经由序列图像板序列实例化。您需要使用已经存在的一个(并且大小合适),而不是创建一个新的

比如:

  if let popOver = segue?.destination.popoverPresentationController,
  { popOver.sourceRect = yourAnchor.bounds }   

我不确定您是如何获得AnyObject类型的sender参数的?使用.bounds属性作为sourceRect,因此我必须假设您在实际运行的代码中的其他地方获得了一些适合动态锚点位置的坐标。

我也遇到过同样的情况。这不是被称为合适的代表。您应该使用合适的语言调用委托函数,如swift(3.0、4.0)。希望对你有帮助

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
    }

在prepareForSegue函数中,您可以将任何对象的发件人更改为UIBarButtonim,然后在显示popover之前放入代码行

 if let popoverController = popController.popoverPresentationController {
        popoverController.barButtonItem = sender 
     }
如果你仍然想使用任何对象,那么你必须将其转换为uibarbuttonite

    if let popoverController = popController.popoverPresentationController {
        popoverController.barButtonItem = sender as? UIBarButtonItem
     }
我希望这对你有用