iPhone的popup式菜单像iPad popover?
我怎样才能在iPhone应用程序中实现这个popup菜单,就像在iPad中的popup窗口?
编辑 :这是最好的时刻: https : //github.com/runway20/PopoverView
看看iPhone的UIPopoverController实现: WEPopover
iOS 8及更高版本
从iOS 8开始,除iPad之外,您还可以使用UIPopoverPresentationController
for iPhone。
build立
- 添加一个
UIBarButtonItem
到你的主视图控制器。 - 将另一个视图控制器添加到故事板。 将其更改为您希望popup窗口的大小,然后添加您想要的内容。 对于我的例子,我只是添加了一个
UILabel
。 如果你想要一个完整的菜单,那么只需添加一个表格视图或button列表。 - 从barbutton项目添加segue到视图控制器,您将用作popover。
Present as Popover
,而不是show
。
- 在storyboard中selectsegue并将标识符设置为
popoverSegue
(或者在代码中调用它的任何string)。
- 在popup窗口视图控制器的“属性”检查器中,选中“ 使用首选显式大小”并确认它是您想要的大小。
码
这是主视图控制器中的条形button项的代码。
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 } }
在任意锚点的Popover
如果你想设置popup窗口出现在除了一个栏button项目之外(例如在UIButton
上),那么你需要设置sourceView
和sourceRect
。 看到这个答案的细节。
进一步阅读
上面的例子主要来自第一个链接。
- 用Swift在iPhone上的iPad风格popup
- iOS 8 Popover演示文稿
- iOS 8 iPhone上的UIPopoverPresentationController
- iOS中popup选项的一般概述
在iPhone上,你通常会使用一个UIActionSheet作为一堆button。 它从底部向上滑动,而不是popupbutton旁边,但这是iPhone上的标准行为。
有一个比WEPopover更好。 由一个叫做50pixels的公司开发,它被称为FPPopover 。
您可以在https://github.com/50pixels/FPPopover下载FPPopover
你将不得不手动实例化一个UIView使用自定义背景图像或绘制透明度,在顶部添加一些UIButtons(或其他types的自定义视图),并以某种方式处理该视图之外的所有触摸。
请注意,这是非标准的用户界面。 一个行动表将更符合HIG。
你可以检查WYPopoverController: https : //github.com/sammcewan/WYPopoverController
上面的屏幕截图不是UIActionSheet。 它看起来像一个简单的UIView子类,在它上面有自定义的UIButtons。 因此,请根据需要创build子类,然后在每次需要时将其作为子视图添加到视图中。
要从属于tableview控制器的导航控制器上的右侧栏button项获得popup窗口,以下工作适用于Swift 4和Xcode 9。
- 按照上面的Suragch答案中的步骤(由社区编辑)。
- 如上面的答案所示,不要执行Segue。 出于某种原因,segue会导致popup窗口全屏显示,尽pipe设置了显式大小。
- 在属性检查器中给你的popup视图控制器一个标题
- 在popup窗口中的TableView控制器中添加以下代码。
- 修改string标识符(这里引用一个Constant.swift文件)
-
修改“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 }