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

时间:2014-12-01 17:36:20

标签: ios swift uipopovercontroller uipopover

我在自定义UIView画布上做了一些绘图,而不是在视图底部有一组按钮以允许用户选择形状,我想让用户做一个长按手势,然后有一个弹出式菜单出现,他们可以选择不同的形状。我在xCode中看不到这样的东西,尽管我认为在iOS中有类似的东西。当电池电量不足和通知时,我不希望出现警告弹出窗口。

我已经研究过使用UIPopoverController,但我对其他一些我已经读过的Stack Overflow问题以及Apple提供的文档感到困惑。

3 个答案:

答案 0 :(得分:0)

将该按钮与viewController连接并将popover作为segue后,您需要准备。以下是为了准备popover segue的代码。

<script type="text/javascript">
$(document).ready(function () { 
var top = $('#quote-icon').offset().top - parseFloat($('#quote-icon').css('marginTop').replace(/auto/, 0));
$(window).scroll(function (event) {
    var y = $(this).scrollTop();
    //if y > top, it means that if we scroll down any more, parts of our element will be outside the viewport
    //so we move the element down so that it remains in view.
    if (y >= top) {
       var difference = y - top;
       $('#quote-icon').css("top",difference);
   }
 });
});
</script>

请记住,如果你有一个iPhone,那么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
        }
    }
}

我在不同的视图控制器中有2个,但我想它会起作用。您还需要实施@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

到你的第一个viewController。

答案 1 :(得分:0)

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

  1. segue创建barButtonItemMenuViewCobtroller类型&#39;呈现为Popover&#39;
  2. MenuViewController覆盖preferredContentSize as:

    override var preferredContentSize : CGSize
    {
        get
        {
            return CGSize(width: 88 , height: 176)
        }
        set 
        {
            super.preferredContentSize = newValue
        }
    }
    
  3. 在我的情况下,我将返回宽度为100且大小为200的CGSize。您可以设置这些值,以便适合您的浮动菜单内容。  4.在初始/源视图控制器中,prepare(for segue: sender)方法集selfpopoverPresentationController委托:

    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 :(得分:0)

我在上面使用了Masture的方法,它对我有用(谢谢!),但是对像我这样的其他新手有一些注意事项:

(1)确保将“ ShowMenuSegue”(或选择的任何内容)作为情节提要的标识符放在情节提要中,并且

(2)我必须添加

var delegate: MainViewController!

在MenuViewController中(以MainViewController作为您的源视图控制器),以使tvc.delegate = self正常工作