在不覆盖 iPhone 上的当前视图的情况下呈现模态视图控制器

Posted

技术标签:

【中文标题】在不覆盖 iPhone 上的当前视图的情况下呈现模态视图控制器【英文标题】:Presenting a modal view controller without covering the current view on iPhone 【发布时间】:2013-12-05 02:36:23 【问题描述】:

我一直在尝试添加视图容器,并在两侧留出 20 像素的空间。但这似乎不是正确的做法......

// ADD CHILD VIEW CONTROLLER
    [parentViewController addChildViewController:childViewController];
    [parentViewController.view addSubview:childViewController.view];
    [childViewController didMoveToParentViewController:parentViewController];

// REMOVE THE CHILD VIEW CONTROLLER
    [childViewController willMoveToParentViewController:nil];
    [childViewController view] removeFromSuperview];
    [childViewController removeFromParentViewController];

更新 我已经通过使用带有酷视图转换的 MZFormSheetController "https://github.com/m1entus/MZFormSheetController" 表单演示来解决这个问题。

【问题讨论】:

感谢您提及“MZFormSheetController”! 【参考方案1】:

使用 MZFormSheetController "https://github.com/m1entus/MZFormSheetController" 带有酷炫视图转换的表单演示。 或者,ios 8 及以上,你可以使用viewController.modalPresentationStyle = UIModalPresentationOverCurrentContext; 祝你好运,如果你想要一个完整的 sn-p,请告诉我......

【讨论】:

【参考方案2】:

你可以试试类似的,

DetailViewController *viewController= [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
viewController.modalPresentationStyle=UIModalPresentationFormSheet;
viewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

[self presentViewController:viewController animated:YES completion:^
    viewController.view.superview.frame = CGRectMake(0, 0, 310, 500);
    viewController.view.superview.center = self.view.center;
];

根据你设置superview.framemodalTransitionStyle

【讨论】:

当我展示 viewController 时它显示黑色背景。而且我认为 UIModalPresentationFormSheet 仅适用于 iPad! 在 iOS 8 之后你可以做 viewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;【参考方案3】:

更好的方法是拥有自己的控制器和视图。

在主控制器上使用当前视图控制器。

[self presentViewController:myController animated:YES completion:nil];

在 viewDidLoad 上调整 myController 框架。

CGRect newFrame = self.view.frame;
newFame.size.width -= 40;
newFame.size.height -= 40;
newFrame.origin.x = 20;
newFrame.origin.y = 20;
self.view.frame = newFrame

添加为 childViewController 是为了包含视图控制器,当您想要一个具有多个视图的控制器时,每个控制器都有自己的控制器。

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

【讨论】:

【参考方案4】:

你走对了。但是你必须在故事板上永久添加容器视图,然后你可以通过setHidden:方法显示/隐藏它。

您还可以通过此方法显示第二个控制器。

【讨论】:

你是对的,但它不会像这个应用程序那样正确......我确信某处有代码可以在 iPhone 上呈现 UIModalPresentationFormSheet @MazenKasser UIModalPresentationFormSheet 仅适用于 iPad。您必须阅读 Apple 编写的 iOS UI 指南。我想你还没有。即使你找到这样的方法,Apple 也会限制你的应用,因为它不是实现愿望的 UI 指南。 一切皆有可能,有大量自定义 Apple API 的第三方库。放轻松,Apple 不会因为这样的事情拒绝该应用程序……顺便说一句,我从 2009 年开始就读过那本书,儿子,你应该赶上来 @MazenKasser 我们在 iPhone 中谈论的是UIModalPresentationFormSheet,对吗?放松父亲 我刚刚说过,如果您找到在 iPhone 上使用UIModalPresentationFormSheet 的方法,Apple 会限制应用程序事件。没有关于第 3 方实施的说法。【参考方案5】:

    在 iPhone 和 iPod touch 上,呈现的视图始终是全屏的。因此,它不能呈现非全屏视图控制器。

    不呈现视图控制器,将视图控制器的视图作为子视图添加到父视图控制器。所以,你可以控制外观,甚至是它下面的阴影层。

【讨论】:

这个概念是正确的,但代码不能按预期工作。首先,子视图位于根视图控制器的 navigationController 下,所以我不得不隐藏它并添加一个导航栏......我想我现在应该坚持我自己的代码......无论如何谢谢

以上是关于在不覆盖 iPhone 上的当前视图的情况下呈现模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:如何从左到右制作当前的模态视图控制器动画

如何在不使用 presentViewController 的情况下以模态方式呈现自定义视图?

iPhone X 上的导航栏不覆盖状态栏

是否可以在不使背景变暗的情况下在 iPad 上呈现模态视图控制器?

有没有办法在不使用图像选择器的情况下从照片应用程序呈现默认的 iOS 编辑视图?

呈现的视图控制器上的 Swift 键盘问题