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