在iPhone中将UIViewController显示为Popup

CRD*_*ave 74 iphone popup uiviewcontroller uialertview ios

由于对这个常见的反复问题没有完整,明确的答案,我会在这里提出并回答.

通常我们需要提供一个UIViewController不覆盖全屏的内容,如下图所示.

在此输入图像描述

Apple提供了几个类似的UIViewController,如UIAlertViewTwitter或Facebook共享视图控制器等.

我们如何为自定义控制器实现此效果?

CRD*_*ave 94

注意:此解决方案在iOS 8中已中断.我将尽快发布新解决方案.

我将在这里使用故事板回答,但也可以没有故事板.

  1. Init:UIViewController在故事板中创建两个.

    • 让我们说FirstViewController哪个是正常的,SecondViewController哪个是弹出窗口.

  2. 莫代尔Segue公司:UIButton在FirstViewController和创建这个SEGUE UIButtonSecondViewController莫代尔SEGUE.

  3. Make Transparent:现在选择UIView(UIView默认情况下创建UIViewController)SecondViewController并更改其背景颜色以清除颜色.

  4. 制作背景暗淡:添加UIImageViewSecondViewController覆盖整个屏幕,并将其图像变暗一些半透明图像.您可以从此处获取示例:UIAlertView背景图像

  5. 显示设计:现在添加UIView并制作您想要显示的任何类型的设计.这是我的故事板的截图 故事板

    • 在这里,我在登录按钮上添加segue,打开SecondViewController弹出窗口,询问用户名和密码
  6. 重要:现在迈出了主要的一步.我们希望它SecondViewController不会完全隐藏FirstViewController.我们设置了清晰的颜色,但这还不够.默认情况下,它会在模型​​显示后面添加黑色,因此我们必须在viewDidLoad中添加一行代码FirstViewController.您也可以在其他地方添加它,但它应该在segue之前运行.

    [self setModalPresentationStyle:UIModalPresentationCurrentContext];

  7. 解雇:何时解雇取决于您的使用案例.这是一个模态演示,所以要解雇我们为模态演示做的事情:

    [self dismissViewControllerAnimated:YES completion:Nil];

就这样.....

欢迎任何形式的建议和评论.

演示: 您可以从Here:Popup Demo获取演示源项目

:有人在这个概念上做得非常好:MZFormSheetController
:我发现了另外一个代码来获得这种功能:KLCPopup


iOS 8更新:我使这个方法适用于iOS 7和iOS 8

+ (void)setPresentationStyleForSelfController:(UIViewController *)selfController presentingController:(UIViewController *)presentingController
{
    if (iOSVersion >= 8.0)
    {
        presentingController.providesPresentationContextTransitionStyle = YES;
        presentingController.definesPresentationContext = YES;

        [presentingController setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    }
    else
    {
        [selfController setModalPresentationStyle:UIModalPresentationCurrentContext];
        [selfController.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];
    }
}
Run Code Online (Sandbox Code Playgroud)

可以像这样在prepareForSegue中使用这个方法

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    PopUpViewController *popup = segue.destinationViewController;
    [self setPresentationStyleForSelfController:self presentingController:popup]
}
Run Code Online (Sandbox Code Playgroud)

  • @CRDave,如上所述,`[self setModalPresentationStyle:UIModalPresentationCurrentContext];`不能单独工作.必须使用`[self.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];`也可以从你的演示项目中描述. (5认同)

Mar*_*ens 47

Interface Builder中的模态弹出窗口(故事板)

步骤1

在您想要作为模态弹出窗口的ViewController上,使根UIView的背景颜色清晰. 在根视图上设置清除颜色 提示:不要使用根UIView作为弹出窗口.添加一个较小的新UIView作为弹出窗口.

第2步

为具有弹出窗口的ViewController创建一个Segue.选择"以模态呈现". Segue公司

从这里创建弹出窗口的两种方法

方法一 - 使用Segue

选择Segue并将Presentation更改为"Over Current Context": 过度背景

方法二 - 使用视图控制器

选择作为弹出窗口的ViewController场景.在Attributes Inspector中的View Controller部分下,将Presentation设置为"Over Current Context": 视图控制器

这两种方法都可行.应该这样做!

完成的产品


Sig*_*Sig 13

您可以在Interface Builder中执行此操作.

  • 对于您希望以模态方式呈现的视图,将其最外侧视图背景设置为透明
  • 控制+单击并从主视图控制器拖动到模态视图控制器
  • 以模态选择礼物
  • 单击新创建的segue,然后在Attribute Inspector(右侧)中将"Presentation"设置为"Over Current Context"


mie*_*tus 10

随意使用我的表格控制器MZFormSheetController for iPhone,在示例项目中有很多关于如何呈现模态视图控制器的例子,它不会覆盖整个窗口并且具有许多演示/过渡样式.

您还可以尝试最新版本的MZFormSheetController,它被称为MZFormSheetPresentationController并具有更多功能.