Swift:如何在iOS中创建一个弹出菜单

7
我正在为自定义UIView画布绘制一些内容,而不是在视图底部放置一组按钮以允许用户选择形状,我希望用户进行长按手势,然后弹出一种类似菜单的弹出窗口,其中包含不同的形状供用户选择。我在xCode中没有看到类似的东西,尽管我认为iOS中应该有这样的东西。我不想要低电量和通知时出现的警报弹出窗口。
我已经研究了使用UIPopoverController,但我对其他一些Stack Overflow问题和Apple提供的文档感到有点困惑。

你应该看一下GitHub上的这个项目。 https://github.com/liyong03/YLLongTapShare它似乎可以实现你想要的功能。如果你不喜欢设计,你可以研究代码来编写自己的。 - Laurent Rivard
3个回答

3

浮动菜单

如上图所示,我描述了实现浮动菜单的步骤:

  1. Create segue from the barButtonItem to the MenuViewCobtroller of type 'Present as Popover'
  2. In the MenuViewController override the preferredContentSize as:

    override var preferredContentSize : CGSize
    {
        get
        {
            return CGSize(width: 88 , height: 176)
        }
        set 
        {
            super.preferredContentSize = newValue
        }
    }
    
在我的情况下,我返回宽度为100和大小为200的CGSize。您可以设置这些值以使您的浮动菜单内容适当地适应。在初始/源视图控制器中,在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
    }
}

那就这样了。你获得了浮动菜单。希望这对你有用。

2
我使用了Masture上面的方法,它对我有用(谢谢!),但是对于其他像我这样的新手,需要注意以下几点:
  1. Make sure you put "ShowMenuSegue" (or whatever you choose) as the identifier for your segue in the Storyboard, and

  2. I had to add

    var delegate: MainViewController!
    

    in the MenuViewController (with MainViewController being your source view controller) in order to get tvc.delegate = self to work


1

当您将该按钮与视图控制器和弹出窗口连接为segue后,您需要进行准备。以下是为弹出窗口segue做准备的代码。

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}

    }
}

我在不同的视图控制器中有这两个,但我猜它们会工作。您还需要实现UIPopoverPresentationControllerDelegate
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
    return UIModalPresentationStyle.None
}

转到您的第一个视图控制器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接