36

我如何在 iphone 应用程序中实现这个弹出菜单,就像 ipad 中的弹出窗口一样?

替代文字


编辑:这是目前最好的:https ://github.com/runway20/PopoverView 在此处输入图像描述

4

8 回答 8

33

iOS 8 及更高版本

从 iOS 8 开始,UIPopoverPresentationController除了 iPad 之外,您还可以用于 iPhone。

在此处输入图像描述

设置

  • 添加一个UIBarButtonItem到你的主视图控制器。
  • 将另一个视图控制器添加到情节提要。将其更改为您希望弹出框的大小并添加您希望它具有的任何内容。对于我的示例,我刚刚添加了一个UILabel. 如果你想要一个完整的菜单,那么只需添加一个表格视图或按钮列表。
  • 将条形按钮项中的 segue 添加到将用作弹出框的视图控制器。而不是show,选择Present as Popover

在此处输入图像描述

  • 在情节提要中选择 segue 并将标识符设置为popoverSegue(或您在代码中调用的任何字符串)。

在此处输入图像描述

  • 在弹出视图控制器的属性检查器中,选中Use Preferred Explicit Size并确认它是您想要的大小。

在此处输入图像描述

代码

这是包含条形按钮项的主视图控制器的代码。

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "popoverSegue" {

            let popoverViewController = segue.destinationViewController
            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
            popoverViewController.popoverPresentationController!.delegate = self

        }
    }

    // MARK: - UIPopoverPresentationControllerDelegate method

    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {

        // Force popover style
        return UIModalPresentationStyle.None
    }
}

任意锚点处的弹出框

如果您想将弹出框设置为出现在条形按钮项目之外的某个位置(UIButton例如在 a 上),那么您需要设置sourceViewand sourceRect。有关详细信息,请参阅此答案

在此处输入图像描述

进一步阅读

上面的例子主要来自第一个链接。

于 2015-08-30T11:10:15.163 回答
22

看看 iPhone UIPopoverController 的实现:WEPopover

于 2011-02-24T09:25:43.190 回答
19

在 iPhone 上,您通常会使用 UIActionSheet 来处理这样的一堆按钮。它从底部向上滑动,而不是在按钮旁边弹出,但这是 iPhone 上的标准行为。

于 2011-01-22T16:56:50.907 回答
7

有一个甚至比 WEPopover 更好。由一家名为 50pixels 的公司开发,名为FPPopover

您可以在https://github.com/50pixels/FPPopover下载 FPPopover

于 2012-07-16T19:30:43.853 回答
5

您必须使用自定义背景图像或透明绘图手动实例化 UIView,在顶部添加一些 UIButton(或其他类型的自定义视图),并以某种方式处理该视图之外的所有触摸。

请注意,这是非标准 UI。操作表将更符合 HIG。

于 2011-01-22T19:46:06.220 回答
2

要从作为 tableview 控制器一部分的导航控制器上的右侧栏按钮项获取弹出框,以下内容适用于Swift 4和 Xcode 9。

  1. 按照上面Suragch答案中的步骤进行操作(由社区编辑。)
  2. 不要如上面的答案所示实施 Segue。出于某种原因,尽管设置了明确的大小,segue 仍会导致弹出框全屏显示。
  3. 在 Attributes Inspector 中给你的弹出视图控制器一个标题
  4. 在将显示弹出窗口的 TableView 控制器中添加以下代码。
  5. 修改字符串标识符(这里是引用一个 Constant.swift 文件)
  6. 修改“as!FilterVC”以使用弹出视图控制器的标题。

    /// Shows a filter popover view
    @IBAction func filterBtnPressed(_ sender: UIBarButtonItem) {
        let popover = storyboard?.instantiateViewController(withIdentifier: FILTER_VC) as! FilterVC
        popover.modalPresentationStyle = UIModalPresentationStyle.popover
        popover.popoverPresentationController?.backgroundColor = UIColor.green
        popover.popoverPresentationController?.delegate = self
        popover.popoverPresentationController?.backgroundColor = ColorPalette.Blue.Medium
        popover.popoverPresentationController?.sourceView = self.view
        popover.popoverPresentationController?.sourceRect = CGRect(x: self.view!.bounds.width, y: 0, width: 0, height: 0)
        popover.popoverPresentationController?.permittedArrowDirections = .up
        self.present(popover, animated: true)
    } }
    
    
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
    
于 2017-09-30T21:57:44.223 回答
1

您可以查看 WYPopoverController:https ://github.com/sammcewan/WYPopoverController

于 2014-11-17T12:41:08.413 回答
0

上面的截图不是 UIActionSheet。它看起来像一个简单的 UIView 子类,上面有自定义 UIButtons。因此,请继续根据您的需要创建子类,然后在每次需要时将其作为子视图添加到您的视图中。

于 2011-01-22T17:57:21.887 回答