Представьте popover из произвольной точки привязки в Swift

Я знаю, как представить popover из элемента панели, как описано в этом ответе (для iPhone и iPad).

введите описание изображения здесь

Я хотел бы добавить поповер для произвольной точки привязки. Другие ответы SO, которые я видел, были для элементов кнопки бара или в Objective-C.

Я только что узнал, как это сделать, поэтому я добавляю свой собственный ответ ниже.

Ответ 1

Обновлен для Swift 3

В раскадровке добавьте контроллер просмотра, которым вы хотели бы быть popover. Установите идентификатор раскадровки "popoverId".

введите описание изображения здесь

Также добавьте кнопку в свой основной контроллер представления и подключите 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
    }
}

Настройка sourceView и sourceRect - это то, что позволяет вам выбрать произвольную точку для отображения popover.

Что это. Теперь ему нужно что-то подобное, когда кнопка нажата.

введите описание изображения здесь

Спасибо этой статье за помощью.

Ответ 2

Решение для Swift 3.1:

Добавить в ваш ViewController UIPopoverPresentationControllerDelegate 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)