[英]Swift: How to create a popup menu in iOS
我正在自定義UIView畫布上進行一些繪制,而不是在視圖底部設置一組按鈕以允許用戶選擇形狀,而是希望用戶長按手勢,然后出現一個彈出式菜單,它們可以選擇不同的形狀。 盡管我認為在iOS中有類似的東西,但我在xCode中看不到任何類似的東西。 我不希望在電量不足和通知不足時顯示警報彈出窗口。
我已經研究過使用UIPopoverController,但是對於我已經閱讀過的其他一些Stack Overflow問題以及Apple提供的文檔感到有些困惑。
我描述了實現浮動菜單的步驟,如上圖所示:
barButtonItem
到“ Present as Popover”類型的MenuViewCobtroller
創建segue
在MenuViewController
將preferredContentSize
重寫為:
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的方法,它對我有用(謝謝!),但是對於像我這樣的其他新手,請注意以下幾點:
確保在“情節提要”中將"ShowMenuSegue"
(或您選擇的任何內容)作為segue的標識符,並且
我必須添加
var delegate: MainViewController!
在MenuViewController中(使用MainViewController作為您的源視圖控制器)以使tvc.delegate = self
正常工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.