簡體   English   中英

Swift:如何在iOS中創建彈出菜單

[英]Swift: How to create a popup menu in iOS

我正在自定義UIView畫布上進行一些繪制,而不是在視圖底部設置一組按鈕以允許用戶選擇形狀,而是希望用戶長按手勢,然后出現一個彈出式菜單,它們可以選擇不同的形狀。 盡管我認為在iOS中有類似的東西,但我在xCode中看不到任何類似的東西。 我不希望在電量不足和通知不足時顯示警報彈出窗口。

我已經研究過使用UIPopoverController,但是對於我已經閱讀過的其他一些Stack Overflow問題以及Apple提供的文檔感到有些困惑。

浮動菜單

我描述了實現浮動菜單的步驟,如上圖所示:

  1. barButtonItem到“ Present as Popover”類型的MenuViewCobtroller創建segue
  2. MenuViewControllerpreferredContentSize重寫為:

     override var preferredContentSize : CGSize { get { return CGSize(width: 88 , height: 176) } set { super.preferredContentSize = newValue } } 

在我的情況下,我將返回寬度為100,尺寸為200的CGSize 。您可以設置這些值,以正確地適合您的浮動菜單內容。 4.在初始/源視圖控制器中,在prepare(for segue: sender)方法中,將self設置為popoverPresentationController委托:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ShowMenuSegue" {
        if let tvc = segue.destination as? MenuViewController
        {
            tvc.delegate = self
            if let ppc = tvc.popoverPresentationController
            {
                ppc.delegate = self
            }
        }
    }
}

源視圖控制器必須遵守UIPopoverPresentationControllerDelegate並實現以下方法:

extension ViewController: UIPopoverPresentationControllerDelegate {

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

而已。 您得到了浮動菜單。 希望這會有用。

在將按鈕與viewController和popover關聯后,您需要准備。 這是下面的代碼,以准備彈出窗口。

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
    if let identifier = segue.identifier
    {
        switch identifier
        {
            case History.SegueIdentifier:

            if let tvc = segue.destinationViewController as? TextViewController
            {
                if let ppc = tvc.popoverPresentationController
                {
                    ppc.delegate = self
                }
                tvc.text = "\(diagnosticHistory)"
            }

            default: break
        }
    }
}

請記住,如果您使用的是iPhone,則彈出式窗口將顯示為全屏,因此您可以修復該問題,例如使用某些特定元素的文字。

這將使彈出框的大小恰好與文本中元素的大小相同。

@IBOutlet weak var textView: UITextView!
{
    didSet
    {
        textView.text = text
    }
}

var text : String = ""
{
    didSet
    {
        textView?.text = text
    }
}

override var preferredContentSize : CGSize
{
    get
    {
        if textView != nil && presentingViewController != nil
        {
            return textView.sizeThatFits(presentingViewController!.view.bounds.size)
        }
        else
        {
            return super.preferredContentSize
        }
    }

    set {super.preferredContentSize = newValue}

    }
}

我在不同的視圖控制器中有那些2,但我想它會工作。 您還需要實現UIPopoverPresentationControllerDelegate

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
    return UIModalPresentationStyle.None
}

到您的第一個viewController。

我在上面使用了Masture的方法,它對我有用(謝謝!),但是對於像我這樣的其他新手,請注意以下幾點:

  1. 確保在“情節提要”中將"ShowMenuSegue" (或您選擇的任何內容)作為segue的標識符,並且

  2. 我必須添加

     var delegate: MainViewController! 

    在MenuViewController中(使用MainViewController作為您的源視圖控制器)以使tvc.delegate = self正常工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM