在 iPhone 中将 UIViewController 显示为弹出窗口

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

通常我们需要呈现一个 UIViewController,这样它就不会覆盖整个屏幕,如下图所示。

enter image description here

苹果提供了几个类似的 UIViewController,如 UIAlertView,Twitter 或 Facebook 共享视图控制器等。

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

111051 次浏览

注意: 这个解决方案在 iOS8中被破坏了。我会尽快发布新的解决方案。

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

  1. 初始化: 在故事板中创建两个 UIViewController

    • 假设 FirstViewController是正常的,而 SecondViewController是弹出的。

  2. 模态转换: UIButton放到 FirstViewController 中,并在此 UIButton上创建一个到 SecondViewController的模态转换。

  3. 使透明: 现在选择 SecondViewControllerUIView(UIView默认使用 UIViewController创建)并改变其背景颜色为清晰颜色。

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

  5. 显示设计: 现在添加一个 UIView,可以显示任何类型的设计。这是我的故事板的截图 storyboard

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

    [self setModalPresentationStyle:UIModalPresentationCurrentContext];

  7. 解雇: 何时解雇取决于您的用例。这是一个模态表示法,所以我们可以忽略模态表示法:

    [self dismissViewControllerAnimated:YES completion:Nil];

就是这样..。

欢迎各界人士提出意见和建议。

演示: 你可以从这里得到演示源代码项目: 弹出演示

有人在这个概念上做得很好: MZFormSheetController
New : 我又找到了一个获得这种函数的代码: < a href = “ https://github.com/jmascia/KLCPopup”> KLCPopup


IOS8更新 : 我使用这种方法同时适用于 iOS7和 iOS8

+ (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 委托中使用这个方法

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


PopUpViewController *popup = segue.destinationViewController;
[self setPresentationStyleForSelfController:self presentingController:popup]
}

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

- (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];
}

希望这有所帮助,如果有任何疑问,请随时询问..。

随意使用我的表单控制器 表单控制器foriPhone,在例子项目中有许多例子关于如何呈现模态视图控制器,它不会覆盖整个窗口,并有许多表示/过渡样式。

您还可以尝试最新版本的 MZFormSheetController,它被称为 表单显示控制器,并具有更多的特性。

你可以用 Interface Builder。

  • 对于希望显示的视图,模态地将其最外层视图背景设置为透明
  • 控件 + 单击并从主机视图控制器拖动到模态视图控制器
  • 选择模态现在
  • 点击新创建的接口,在属性检查器(右边)设置“演示文稿”为“过度当前上下文”

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

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

仅此而已。

模式弹出式 Interface Builder (情节串连图板)

第一步

在作为模式弹出窗口的 ViewController 上,使根 UIView 的背景颜色清晰。 Set Clear Color on root view 提示: 不要使用根 UIView 作为弹出窗口。添加一个更小的新 UIView 作为弹出窗口。

第二步

创建一个到视图控制器的接口,选择“当前模式”。 Segue

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

方法一-使用接口

选择“继续”并将演示文稿更改为“ OverCurrent Context”: Over Current Context

方法二-使用视图控制器

选择您的弹出窗口 ViewController Scene。在“属性检查器”中的“视图控制器”部分中,将“表示”设置为“过当前上下文”: ViewController

两种方法都可以,应该可以了!

Finished Product

迅捷4:

添加覆盖或弹出视图 您还可以使用 容器视图来获得一个免费的 View Controller (您可以从通常的对象面板/库中获得 Container View)

enter image description here

步骤:

  1. 有一个包含此容器视图的视图(图片中的 ViewForContainer) ,以便在显示容器视图的内容时调暗它。连接第一个视图控制器内的出口

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

  3. 单击按钮时取消隐藏 enter image description here

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

enter image description here

当你点击按钮时,你会得到这个效果 enter image description here

你可以使用 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)