像iPad popover的iPhone弹出菜单?

时间:2011-01-22 16:54:21

标签: iphone objective-c ipad uipopovercontroller popover

如何在iPhone应用程序中实现此弹出菜单,就像在ipad中使用popover一样?

alt text


编辑:这是最好的:https://github.com/runway20/PopoverView enter image description here

8 个答案:

答案 0 :(得分:29)

iOS 8及更高版本

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

enter image description here

设置

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

enter image description here

  • 在故事板中选择segue并将标识符设置为popoverSegue(或者在代码中调用它的任何字符串)。

enter image description here

  • 在弹出式视图控制器的“属性”检查器中,选中使用首选显式大小并确认其大小与您希望的大小相同。

enter image description here

代码

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

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上),则需要设置sourceViewsourceRect。有关详细信息,请参阅this answer

enter image description here

进一步阅读

以上示例主要来自第一个链接。

答案 1 :(得分:21)

查看iPhone UIPopoverController实现:WEPopover

答案 2 :(得分:19)

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

答案 3 :(得分:7)

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

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

下载FPPopover

答案 4 :(得分:5)

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

  1. 按照上面Suragch回答中的步骤(由社区编辑。)
  2. 不要执行上面答案中显示的Segue。出于某种原因,尽管设置了明确的大小,但segue会使弹出窗口全屏显示。
  3. 在属性检查器
  4. 中为弹出窗口视图控制器提供标题
  5. 在弹出窗口显示的TableView控制器中添加以下代码。
  6. 修改字符串标识符(这里引用的是Constant.swift文件)
  7. 修改" as! FilterVC"使用popover视图控制器的标题。

    /// 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
    }
    

答案 7 :(得分:0)

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