如何在iOS 8中正确呈现popover

 zhaobo 发布于 2023-01-04 15:03

我正在尝试将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)
}

输出:

在此输入图像描述

当我通过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)

}

我得到完全相同的输出.

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

6 个回答
  • 好吧,一位室友看了看它并想出来:

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

    就是那样.

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

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

    在此输入图像描述

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

    func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {
        //do som stuff from the popover
    }
    

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

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

    同样在iPhone上你必须覆盖

    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    
            return UIModalPresentationStyle.none
        } 
    

    2023-01-04 15:04 回答
  • 我找到了一个完整的示例,说明如何使这一切全部工作,以便无论设备/方向如何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
    }
    

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

    nav.popoverPresentationController!.delegate = implOfUIAPCDelegate
    

    2023-01-04 15:04 回答
  • 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)
        }
    }      
    

    请参阅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
        }
    }  
    

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

    2023-01-04 15:04 回答
  • 在这里我将"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;
    }
    

    记得加入
    UIPopoverPresentationControllerDelegate, UIAdaptivePresentationControllerDelegate

    2023-01-04 15:06 回答
  • 在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]; }
    

    2023-01-04 15:06 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有