75

由于这个常见的反复出现的问题没有完整、明确的答案,我将在这里提出并回答。

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

在此处输入图像描述

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

我们如何才能为自定义控制器实现这种效果?

4

8 回答 8

95

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

我将使用情节提要在这里回答,但没有情节提要也可以。

  1. Init:在情节提要中创建两个UIViewController

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

  2. 模态转场:放入UIButtonFirstViewController 并在此上创建一个UIButton转场SecondViewController作为模态转场。

  3. 使透明:现在选择UIViewUIView默认情况下使用创建的UIViewControllerSecondViewController并将其背景颜色更改为透明颜色。

  4. 使背景变暗:添加一个UIImageView覆盖SecondViewController整个屏幕并将其图像设置为一些变暗的半透明图像。您可以从这里获取样本:UIAlertView背景图片

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

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

    [self setModalPresentationStyle:UIModalPresentationCurrentContext];

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

    [self dismissViewControllerAnimated:YES completion:Nil];

就这样.....

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

演示: 您可以从这里获取演示源项目: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];
    }
}

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

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

    PopUpViewController *popup = segue.destinationViewController;
    [self setPresentationStyleForSelfController:self presentingController:popup]
}
于 2013-04-26T07:13:05.347 回答
52

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

步骤1

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

第2步

为包含您的弹出窗口的 ViewController 创建一个 Segue。选择“以模式呈现”。 转场

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

方法一 - 使用 Segue

选择 Segue 并将 Presentation 更改为“Over Current Context”: 当前上下文

方法二——使用视图控制器

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

任何一种方法都可以。应该这样做!

完成的产品

于 2017-02-04T16:31:37.480 回答
13

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

  • 对于您希望以模态方式呈现的视图,将其最外层视图背景设置为透明
  • Control + 单击并从主机视图控制器拖动到模态视图控制器
  • 以模态方式选择现在
  • 单击新创建的 segue 并在 Attribute Inspector(右侧)中将“Presentation”设置为“Over Current Context”
于 2015-08-25T00:52:56.223 回答
10

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

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

于 2013-08-20T21:53:35.903 回答
2

您可以使用 EzPopup ( https://github.com/huynguyencong/EzPopup ),它是一个 Swift pod 并且非常易于使用:

// init YourViewController
let contentVC = ...

// Init popup view controller with content is your content view controller
let popupVC = PopupViewController(contentController: contentVC, popupWidth: 100, popupHeight: 200)

// show it by call present(_ , animated:) method from a current UIViewController
present(popupVC, animated: true)
于 2018-06-06T05:12:05.480 回答
1

Imao 将 UIImageView 放在背景上并不是最好的主意。就我而言,我在控制器视图上添加了其他 2 个视图。第一个视图有[UIColor clearColor]背景,第二个 - 你想要透明的颜色(在我的情况下是灰色)。注意顺序很重要。然后为第二个视图设置 alpha 0.5(alpha >=0 <=1)。将此添加到行中prepareForSegue

infoVC.providesPresentationContextTransitionStyle = YES;
infoVC.definesPresentationContext = YES;

就这样。

于 2016-05-04T13:47:51.233 回答
1

斯威夫特 4:

添加叠加层或弹出视图您还可以使用容器视图,通过它可以获得免费的视图控制器(您从通常的对象调色板/库中获取容器视图)

在此处输入图像描述

脚步:

  1. 有一个视图(图中的 ViewForContainer)包含这个 Container View,当 Container View 的内容显示时将其变暗。连接第一个 View Controller 内的插座

  2. 加载第一个 VC 时隐藏此视图

  3. 单击按钮时取消隐藏 在此处输入图像描述

  4. 要在显示容器视图内容时使视图变暗,请将视图背景设置为黑色,不透明度设置为 30%

在此处输入图像描述

当您单击按钮时,您将获得此效果 在此处输入图像描述

于 2018-04-09T09:15:38.613 回答
0

您可以这样做以将任何其他子视图添加到视图控制器。首先将要添加为子视图的 ViewController 的状态栏设置为 None ,以便您可以调整为任何您想要的大小。然后在 Present View 控制器中创建一个按钮和一个按钮单击方法。在方法中:

- (IBAction)btnLogin:(id)sender {
    SubView *sub = [[SubView alloc] initWithNibName:@"SubView" bundle:nil];
    sub.view.frame = CGRectMake(20, 100, sub.view.frame.size.width, sub.view.frame.size.height);
    [self.view addSubview:sub.view];
}

希望对您有所帮助,如有疑问,请随时询问...

于 2013-04-26T07:53:01.823 回答