在iPhone中将UIViewController显示为Popup

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

通常我们需要提供一个UIViewController ,它不能覆盖整个屏幕,如下图所示。

在这里输入图像说明

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

我们如何才能达到这个自定义控制器的效果?

注:这个解决scheme在iOS 8中被打破了。我会尽快发布新的解决scheme。

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

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

    • 可以说FirstViewController是正常的,而SecondViewController将是popup窗口。

  2. Modal Segue:UIButton放在FirstViewController中,并将此UIButton上的Segue创build为SecondViewController作为模式segue。

  3. 使透明:现在selectSecondViewController UIViewUIView哪些是默认与UIViewController创build),并更改其背景颜色清除颜色。

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

  5. 显示devise:现在添加一个UIView ,并使任何types的devise,你想显示。 这是我的故事板的截图 故事板

    • 在这里,我添加了loginbutton的segue,打开SecondViewControllerpopup询问用户名和密码
  6. 重要:现在,主要步骤。 我们希望SecondViewController不会完全隐藏FirstViewController。 我们已经设定了清晰的颜色,但这还不够。 默认情况下,它会在模型​​表示后添加黑色,所以我们必须在FirstViewController viewDidLoad中添加一行代码。 您也可以在另一个地方添加它,但它应该在继续之前运行。

    [self setModalPresentationStyle:UIModalPresentationCurrentContext];

  7. closures:什么时候closures取决于你的用例。 这是一个模式的演示文稿,所以要消除我们做我们做的模态演示:

    [self dismissViewControllerAnimated:YES completion:Nil];

就这样…..

欢迎任何forms的build议和意见。

演示:您可以从这里获得演示源项目: popup演示

:有人做了这个概念非常好的工作: MZFormSheetController
:我发现了一个更多的代码来获得这种function: 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里面这样处理

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { PopUpViewController *popup = segue.destinationViewController; [self setPresentationStyleForSelfController:self presentingController:popup] } 

界面生成器中的模态popup窗口(Storyboards)

步骤1

在你想作为模态popup窗口的ViewController上,清除根UIView的背景颜色。 在根视图上设置清除颜色 提示:不要使用root UIView作为popup窗口。 添加一个新的UIView是更小的popup。

第2步

创build一个Segue到具有popup窗口的ViewController。 select“现在模式”。 Segue公司

从这里创buildpopup的两种方法

方法一 – 使用Segue

selectSegue并将演示文稿更改为“Over Current Context”: 过度上下文

方法二 – 使用视图控制器

select您的popup窗口的ViewController场景。 在“属性”检查器中的“查看控制器”部分下,将“演示文稿”设置为“过度上下文”: 视图控制器

两种方法都可以工作。 这应该做到这一点!

完成的产品

你可以在Interface Builder中做到这一点。

  • 对于您希望呈现模式设置其最外面的视图背景为透明的视图
  • 控制单击并从主机视图控制器拖动到模态视图控制器
  • select模式
  • 点击新创build的segue,在Attribute Inspector(右侧)将“Presentation”设置为“Over Current Context”

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

您也可以尝试最新版本的MZFormSheetController,它被称为MZFormSheetPresentationController,并有更多的function。

你可以做到这一点,以添加任何其他子视图到视图控制器。 首先将你想添加为子视图的ViewController的状态栏设置为None,以便你可以调整任何你想要的。 然后在Present View控制器中创build一个button并点击button。 在该方法中:

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

希望这有助于,随时询问是否有任何疑问…

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

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

就这样。