web-dev-qa-db-ja.com

Swiftの任意のアンカーポイントからポップオーバーを表示します

this answer (iPhoneとiPadの両方)で説明されているように、バーボタンアイテムからポップオーバーを表示する方法を知っています。

enter image description here

任意のアンカーポイントにポップオーバーを追加したいと思います。私が見た他のSO回答は、バーボタンアイテムまたはObjective-Cに関するものでした。

これを行う方法を学んだので、以下に自分の答えを追加します。

8
Suragch

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

助けてくれてありがとう この記事

26
Suragch

Swift 3.1のソリューション:

ViewControllerに追加IPopoverPresentationControllerDelegate delegate:

class OriginalViewController: UIViewController, UIPopoverPresentationControllerDelegate

ViewControllerにボタンを追加し、ボタンをタップして次のコードを呼び出します。

    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)
9
Kevin ABRIOUX