从Swift中的任意锚点呈现一个popover

时间:2016-08-05 21:13:45

标签: ios swift popover

我知道如何在this answer(适用于iPhone和iPad)中描述的条形按钮项目中显示弹出窗口。

enter image description here

我想为任意锚点添加一个弹出窗口。我看到的其他SO答案是针对条形按钮项目或在Objective-C中。

我刚学会了如何做到这一点,所以我在下面添加自己的答案。

3 个答案:

答案 0 :(得分:25)

更新了Swift 3

在故事板中,添加您想要成为弹出窗口的视图控制器。将故事板ID设置为" popoverId"。

enter image description here

还可以向主视图控制器添加一个按钮,并将IBAction连接到以下代码。

import UIKit
class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {

    @IBAction func buttonTap(sender: UIButton) {

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

        // 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 // button
        popController.popoverPresentationController?.sourceRect = sender.bounds

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

    // UIPopoverPresentationControllerDelegate method
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
        // Force popover style
        return UIModalPresentationStyle.none
    }
}

设置sourceViewsourceRect是允许您选择显示弹出窗口的任意点的原因。

那就是它。现在,当按下按钮时,它应该是这样的。

enter image description here

感谢this article寻求帮助。

答案 1 :(得分:9)

Swift 3.1的解决方案:

添加到您的ViewController UIPopoverPresentationControllerDelegate 委托:

    let controller = MyPopViewController()
    controller.modalPresentationStyle = UIModalPresentationStyle.popover
    let popController = controller.popoverPresentationController
    popController?.permittedArrowDirections = .any
    popController?.delegate = self
    popController?.sourceRect = (self.myButton?.bounds)!
    popController?.sourceView =  self.myButton
    self.present(controller, animated: true, completion: nil)

向ViewController添加一个按钮,点击按钮,调用以下代码:

<tr th:each="String: ${navbarElements}">

答案 2 :(得分:1)

更新为上面的func语法:

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

出于某种原因,旧语法仍然被允许但不处于活动状态,并且将无法正确实现弹出窗口或锚定。