Ios8 如何在自适应故事板中使用iPhone popover
我是iOS开发新手,正在尝试同时学习故事板、Swift和iOS 8的新功能 我创建了一个非常简单的故事板,它使用Popover演示序列来显示另一个视图。在模拟器上,如果我在iPad上运行这个程序,它会正常工作。但是,如果我在iPhone上运行它,而不是在popover上运行,它会在原始视图的顶部显示一个全屏视图。这很好;但是,没有办法关闭它并返回到原始屏幕 我观看了WWDC 2014视频“228 A Look inside presentation Controller”,如果他们完全用代码构建用户界面,他们可以显示一个关闭按钮Ios8 如何在自适应故事板中使用iPhone popover,ios8,uistoryboard,uistoryboardsegue,Ios8,Uistoryboard,Uistoryboardsegue,我是iOS开发新手,正在尝试同时学习故事板、Swift和iOS 8的新功能 我创建了一个非常简单的故事板,它使用Popover演示序列来显示另一个视图。在模拟器上,如果我在iPad上运行这个程序,它会正常工作。但是,如果我在iPhone上运行它,而不是在popover上运行,它会在原始视图的顶部显示一个全屏视图。这很好;但是,没有办法关闭它并返回到原始屏幕 我观看了WWDC 2014视频“228 A Look inside presentation Controller”,如果他们完全用代码构建
我还观看了“411 interface builder中的新功能”课程,他们说这可以在interface builder中完成,但他们没有展示,承诺如果有人感兴趣,将在实验室展示如何完成。不幸的是,我没有参加2014年WWDC,也不知道有谁参加过。我的谷歌搜索也没有返回任何有用的信息。您可以像这样添加导航控制器-
- 将popover视图控制器设置为导航控制器的根视图控制器李>
- 删除当前正在使用的popover segue
- 从显示popover的按钮将segue重新连接到导航控制器。
在iPad上你会得到一个popover,在iPhone上你会得到一个模态演示。iPad和iPhone都将显示导航控制器。根据您的用例,这可能是您想要的,也可能不是。下面是故事板的屏幕显示。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"Your segue name"]) {
UIViewController *yourViewController = segue.destinationViewController;
yourViewController.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController *popoverPresentationController = yourViewController.popoverPresentationController;
popoverPresentationController.delegate = self;
}
}
显示popover的视图控制器还需要响应此UIPopopOverpresentationDelegate
方法
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
return UIModalPresentationNone;//always popover.
}
最后,您可以执行以下操作,只将导航控制器添加到iPhone上视图控制器的模式显示中,而将iPad上的popover保留在没有导航控制器的情况下
- 让你的故事板保持原样
- 插入导航控制器的正确位置位于
。为了调用它,我们必须将自己设置为-(UIViewController*)表示控制器:(UIPresentationController*)控制器viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)样式中
的代理。 我们将再次在UIPopoverPresentationController
prepareforsgue:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"Your segue name"]) { UIViewController *yourViewController = segue.destinationViewController; yourViewController.modalPresentationStyle = UIModalPresentationPopover; UIPopoverPresentationController *popoverPresentationController = yourViewController.popoverPresentationController; popoverPresentationController.delegate = self; } }
-(UIViewController *)presentationController:(UIPresentationController *)controller viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)style
{
UIViewController *presentedViewController = controller.presentedViewController;
UINavigationController *navigationController = [[UINavigationController alloc]
initWithRootViewController:presentedViewController];
UIBarButtonItem *dismissButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonItemStyleDone target:self action:@selector(done:)];
presentedViewController.navigationItem.rightBarButtonItem = dismissButton;
return navigationController;
}
祝你好运 如果你想要的是iPad上的一个popover,但iPhone上有一个带有关闭按钮的模式表,那么你可以在故事板上为popover创建一个额外的导航控制器 在Xcode 6.3情节提要中,您只需连接一个视图控制器并将segue指定为“Present as Popover” 下面的代码应该位于连接到popover的视图控制器中,而不是popover本身中: 首先设置popover委托:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "myPopoverSegueName") {
let vc = segue.destinationViewController
vc.popoverPresentationController?.delegate = self
return
}
}
然后添加代理扩展(在视图控制器代码下方),并动态创建导航控制器/关闭按钮:
extension myViewController: UIPopoverPresentationControllerDelegate {
func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
let btnDone = UIBarButtonItem(title: "Done", style: .Done, target: self, action: "dismiss")
let nav = UINavigationController(rootViewController: controller.presentedViewController)
nav.topViewController.navigationItem.leftBarButtonItem = btnDone
return nav
}
}
然后,您添加了Disclose函数,您应该可以开始了:
func dismiss() {
self.dismissViewControllerAnimated(true, completion: nil)
}
我不知道为什么需要为“完成”按钮设置故事板,所有的工作都可以通过编程完成,只需几行代码。重要的部分是实现一些
UIAdaptivePresentationControllerDelegate
协议方法,如下所示:
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle
{
return .FullScreen
}
func presentationController(controller: UIPresentationController,
viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController?{
var navController:UINavigationController = UINavigationController(rootViewController: controller.presentedViewController)
controller.presentedViewController.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action:"done")
return navController
}
然后,一个简单的方法来实现popover在全屏显示时的解除行为:
func done (){
presentedViewController?.dismissViewControllerAnimated(true, completion: nil)
}
你完成了 在将逻辑放入情节提要的同时,可以使用最简单的代码。在显示popover的视图控制器中,只需输入marker方法
@IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
}
它不需要任何代码,但需要存在,以便您可以在以后使用interface builder时控制拖动到退出图标
我的popover内容没有占据整个背景视图,但有一个小的空白。这意味着您可以使用interface builder为此视图创建轻触手势识别器。控件将手势识别器拖动到退出图标,然后弹出一些退出选项,其中一个是如上所示的unwindToContainerVC方法
现在,只要点击边缘(例如在iPhone4S场景中),您就会返回到显示视图控制器
以下是手势识别器的连接检查器:
在我的例子中,我有一个小的弹出窗口,我想在iPhone和iPad上都成为一个弹出窗口,并且希望避免使用带有“关闭”的导航栏。发现需要实现两个代理调用(Swift 3.0):
你在故事板上有任何UINavigationController吗?@adityawirayuda:我没有,但如果需要,可以添加一个。请尝试一下,我相信它会在导航堆栈中添加演示视图控制器(因此演示视图控制器上的“后退”按钮)@adityawirayuda:不幸的是,它不起作用。在显示popover的情况下,如何使“完成”按钮不显示?
-(void)prepareforsgue:(UIStoryboardSegue*)segue sender:(id)sender{if([segue.identifier IsequalString:@“页面大小popover”]){UINavigationController*navController=segue.destinationViewController;UIModalPresentationStyle=navController.modalPresentationStyle;if(style==UIModalPresentationPageSheet){uibarbuttoneim*doneButton=[[uibarbuttoneim alloc]initWithBarButtonSystemItem:UIBarButtonItemStyleDone目标:自我操作:@selector(done:)];[navController。
extension MyViewController : UIPopoverPresentationControllerDelegate {
// Needed for iPhone popup
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .none
}
// Needed for iPhone in landscape
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return .none
}
}