如何在iOS 8中正确呈现popover

Jor*_*416 115 uipopovercontroller ios uipopover swift ios8

我正在尝试将UIPopoverView添加到我的Swift iOS 8应用程序,但我无法访问PopoverContentSize属性,因为popover没有显示正确的形状.我的代码:

var popover: UIPopoverController? = nil 

    func addCategory() {

    var newCategory = storyboard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
    var nav = UINavigationController(rootViewController: newCategory)
    popover = UIPopoverController(contentViewController: nav)
    popover!.setPopoverContentSize(CGSizeMake(550, 600), animated: true)
    popover!.delegate = self
    popover!.presentPopoverFromBarButtonItem(self.navigationItem.rightBarButtonItem, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

当我通过UIPopoverPresentationController做同样的事情时,我仍然没有完成它.这是我的代码:

func addCategory() {

    var popoverContent = self.storyboard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
    var nav = UINavigationController(rootViewController: popoverContent)
    nav.modalPresentationStyle = UIModalPresentationStyle.Popover
    var popover = nav.popoverPresentationController as UIPopoverPresentationController
    popover.delegate = self
    popover.popoverContentSize = CGSizeMake(1000, 300)
    popover.sourceView = self.view
    popover.sourceRect = CGRectMake(100,100,0,0)

    self.presentViewController(nav, animated: true, completion: nil)

}
Run Code Online (Sandbox Code Playgroud)

我得到完全相同的输出.

如何自定义弹出窗口的大小?任何帮助将非常感谢!

Jor*_*416 145

好吧,一位室友看了看它并想出来:

 func addCategory() {

    var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
    var nav = UINavigationController(rootViewController: popoverContent)
    nav.modalPresentationStyle = UIModalPresentationStyle.Popover
    var popover = nav.popoverPresentationController
    popoverContent.preferredContentSize = CGSizeMake(500,600)
    popover.delegate = self
    popover.sourceView = self.view
    popover.sourceRect = CGRectMake(100,100,0,0)

    self.presentViewController(nav, animated: true, completion: nil)

}
Run Code Online (Sandbox Code Playgroud)

就是那样.

您不再与popover本身交谈,您可以通过调用属性与内部的视图控制器通信以设置内容大小 preferredContentSize

  • 可能说明显而易见,但这不仅仅是与快速相关的.我还必须在我的obj-c应用程序中执行此操作:) (15认同)
  • 关于代码的另一个评论 - 您可以使用"let"而不是"var".Apple建议您在不需要重新分配值的情况下使用它. (4认同)
  • 这在GM for iPhone中被窃听.如果您尝试在模拟器处于纵向状态时显示,则它始终为全屏.如果您旋转到横向,它将变为弹出窗口.如果再次旋转回肖像,它将保持弹出状态. (3认同)

use*_*737 51

实际上它比那简单得多.在故事板中,您应该将要用作popover的viewcontroller设置为像往常一样为它创建一个viewcontroller类.从要打开弹出框的对象中创建如下所示的segue,在本例中为UIBarButton名为"Config"的对象.

在此输入图像描述

在"mother viewcontroller"中实现UIPopoverPresentationControllerDelegate和委托方法:

func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {
    //do som stuff from the popover
}
Run Code Online (Sandbox Code Playgroud)

prepareForSeque像这样重写方法:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
     //segue for the popover configuration window
    if segue.identifier == "yourSegueIdentifierForPopOver" {
        if let controller = segue.destinationViewController as? UIViewController {
            controller.popoverPresentationController!.delegate = self
            controller.preferredContentSize = CGSize(width: 320, height: 186)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

而且你已经完成了.现在,您可以将弹出窗口视图视为任何其他视图,即.添加字段,什么不是!并且通过使用中的popoverPresentationController.presentedViewController方法来获取内容控制器UIPopoverPresentationController.

同样在iPhone上你必须覆盖

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {

        return UIModalPresentationStyle.none
    } 
Run Code Online (Sandbox Code Playgroud)


Dav*_*unt 28

我找到了一个完整的示例,说明如何使这一切全部工作,以便无论设备/方向如何https://github.com/frogcjn/AdaptivePopover_iOS8_Swift,您都可以随时显示弹出窗口.

关键是实现UIAdaptivePresentationControllerDelegate

func adaptivePresentationStyleForPresentationController(PC: UIPresentationController!) -> UIModalPresentationStyle {
    // This *forces* a popover to be displayed on the iPhone
    return .None
}
Run Code Online (Sandbox Code Playgroud)

然后扩展上面的例子(来自Imagine Digital):

nav.popoverPresentationController!.delegate = implOfUIAPCDelegate
Run Code Online (Sandbox Code Playgroud)

  • 正确,UIPopoverPresentationControllerDelegate扩展了UIAdaptivePresentationControllerDelegate.因此,根据定义,两者都包含方法'adaptivePresentationStyleForPresentationController'.我提供了基本接口,因为Apple API文档中记录了该方法. (3认同)

A.G*_*A.G 25

Swift 2.0

好吧我锻炼了.看一看.在StoryBoard中制作了一个ViewController.与PopOverViewController类相关联.

import UIKit

class PopOverViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()    
        self.preferredContentSize = CGSizeMake(200, 200)    
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: "dismiss:")    
    }    
    func dismiss(sender: AnyObject) {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
}      
Run Code Online (Sandbox Code Playgroud)

请参阅ViewController:

//  ViewController.swift

import UIKit

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate
{
    func showPopover(base: UIView)
    {
        if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("popover") as? PopOverViewController {    

            let navController = UINavigationController(rootViewController: viewController)
            navController.modalPresentationStyle = .Popover

            if let pctrl = navController.popoverPresentationController {
                pctrl.delegate = self

                pctrl.sourceView = base
                pctrl.sourceRect = base.bounds

                self.presentViewController(navController, animated: true, completion: nil)
            }
        }
    }    
    override func viewDidLoad(){
        super.viewDidLoad()
    }    
    @IBAction func onShow(sender: UIButton)
    {
        self.showPopover(sender)
    }    
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
        return .None
    }
}  
Run Code Online (Sandbox Code Playgroud)

注意:func showPopover(base:UIView)方法应放在ViewDidLoad之前.希望能帮助到你 !


Vij*_*jay 15

在iOS9中,UIPopoverController被折旧.所以可以在iOS9.x以上的Objective-C版本中使用以下代码,

- (IBAction)onclickPopover:(id)sender {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
UIViewController *viewController = [sb instantiateViewControllerWithIdentifier:@"popover"];

viewController.modalPresentationStyle = UIModalPresentationPopover;
viewController.popoverPresentationController.sourceView = self.popOverBtn;
viewController.popoverPresentationController.sourceRect = self.popOverBtn.bounds;
viewController.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:viewController animated:YES completion:nil]; }
Run Code Online (Sandbox Code Playgroud)


小智 8

在这里我将"Joris416"Swift代码转换为Objective-c,

-(void) popoverstart
{
    ViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"PopoverView"];
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:controller];
    nav.modalPresentationStyle = UIModalPresentationPopover;
    UIPopoverPresentationController *popover = nav.popoverPresentationController;
    controller.preferredContentSize = CGSizeMake(300, 200);
    popover.delegate = self;
    popover.sourceView = self.view;
    popover.sourceRect = CGRectMake(100, 100, 0, 0);
    popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
    [self presentViewController:nav animated:YES completion:nil];
}

-(UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller
{
    return UIModalPresentationNone;
}
Run Code Online (Sandbox Code Playgroud)

记得加入
UIPopoverPresentationControllerDelegate, UIAdaptivePresentationControllerDelegate