来自任意锚点的弹出 - 斯威夫特

时间:2017-03-02 05:17:18

标签: ios swift popover

我想从这张照片中按下一个按钮:

enter image description here

要做到这一点,我遵循以下步骤:

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

2.我从第一个控制器(JobsViewController)到上面的控制器作为present as popover制作一个segue并设置一个标识符:

enter image description here

3.in 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.但是当我点击我的按钮时,我的弹出窗口覆盖了我的所有页面:

enter image description here

我的问题在哪里?

3 个答案:

答案 0 :(得分:0)

popover控制器应该已经由storyboard seque实例化。您需要使用已经存在的(并且大小合适)而不是创建新的。

类似的东西:

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

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

答案 1 :(得分:0)

我发生了同样的情况。它没有被称为适当的代表。你应该用适当的语言调用委托函数,如swift(3.0,4.0)。希望它能帮到你

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

Image

答案 2 :(得分:0)

在prepareForSegue函数中,您可以将AnyObject的发件人更改为UIBarButtonItem,然后在显示弹出窗口之前放入代码行

 if let popoverController = popController.popoverPresentationController {
        popoverController.barButtonItem = sender 
     }

如果您仍然想使用Anyobject,则必须将其强制转换为UIBarButtonItem

    if let popoverController = popController.popoverPresentationController {
        popoverController.barButtonItem = sender as? UIBarButtonItem
     }

我希望这对您有用