我正在尝试将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) }
我得到完全相同的输出.
如何自定义弹出窗口的大小?任何帮助将非常感谢!
好吧,一位室友看了看它并想出来:
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
实际上它比那简单得多.在故事板中,您应该将要用作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 }
我找到了一个完整的示例,说明如何使这一切全部工作,以便无论设备/方向如何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
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之前.希望能帮助到你 !
在这里我将"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
在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]; }