由于这个常见的反复出现的问题没有完整、明确的答案,我将在这里提出并回答。
通常我们需要展示一个UIViewController
不覆盖全屏的内容,如下图所示。
Apple 提供了几个类似UIViewController
的,如UIAlertView
Twitter 或 Facebook 共享视图控制器等。
我们如何才能为自定义控制器实现这种效果?
由于这个常见的反复出现的问题没有完整、明确的答案,我将在这里提出并回答。
通常我们需要展示一个UIViewController
不覆盖全屏的内容,如下图所示。
Apple 提供了几个类似UIViewController
的,如UIAlertView
Twitter 或 Facebook 共享视图控制器等。
我们如何才能为自定义控制器实现这种效果?
注意:此解决方案在 iOS 8 中已损坏。我将尽快发布新解决方案。
我将使用情节提要在这里回答,但没有情节提要也可以。
Init:在情节提要中创建两个UIViewController
。
FirstViewController
哪个是正常的,SecondViewController
哪个是弹出窗口。
模态转场:放入UIButton
FirstViewController 并在此上创建一个UIButton
转场SecondViewController
作为模态转场。
使透明:现在选择UIView
(UIView
默认情况下使用创建的UIViewController
)SecondViewController
并将其背景颜色更改为透明颜色。
使背景变暗:添加一个UIImageView
覆盖SecondViewController
整个屏幕并将其图像设置为一些变暗的半透明图像。您可以从这里获取样本:UIAlertView
背景图片
展示设计:现在添加UIView
并制作您想要展示的任何类型的设计。这是我的故事板的屏幕截图
SecondViewController
作为弹出窗口打开以询问用户名和密码重要提示:现在是主要步骤。我们希望它SecondViewController
不会完全隐藏 FirstViewController。我们已经设置了清晰的颜色,但这还不够。默认情况下,它会在模型演示后添加黑色,因此我们必须在 viewDidLoad 中添加一行代码FirstViewController
。您也可以在其他地方添加它,但它应该在 segue 之前运行。
[self setModalPresentationStyle:UIModalPresentationCurrentContext];
解雇:何时解雇取决于您的用例。这是一个模态演示,所以为了解雇我们做我们为模态演示所做的事情:
[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]
}
在您希望作为模式弹出窗口的 ViewController 上,使根 UIView 的背景颜色清晰。 提示:不要使用根 UIView 作为弹出窗口。添加一个较小的新 UIView 作为您的弹出窗口。
为包含您的弹出窗口的 ViewController 创建一个 Segue。选择“以模式呈现”。
选择 Segue 并将 Presentation 更改为“Over Current Context”:
选择作为您的弹出窗口的 ViewController 场景。在 Attributes Inspector 的 View Controller 部分下,将 Presentation 设置为“Over Current Context”:
任何一种方法都可以。应该这样做!
您可以在 Interface Builder 中执行此操作。
随意使用我的表单控制器MZFormSheetController for iPhone,在示例项目中,有很多关于如何呈现模式视图控制器的示例,它们不会覆盖整个窗口并且有许多演示/转换样式。
您还可以尝试最新版本的 MZFormSheetController,它被称为MZFormSheetPresentationController,它有很多更多的功能。
您可以使用 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)
Imao 将 UIImageView 放在背景上并不是最好的主意。就我而言,我在控制器视图上添加了其他 2 个视图。第一个视图有[UIColor clearColor]
背景,第二个 - 你想要透明的颜色(在我的情况下是灰色)。注意顺序很重要。然后为第二个视图设置 alpha 0.5(alpha >=0 <=1)。将此添加到行中prepareForSegue
infoVC.providesPresentationContextTransitionStyle = YES;
infoVC.definesPresentationContext = YES;
就这样。
您可以这样做以将任何其他子视图添加到视图控制器。首先将要添加为子视图的 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];
}
希望对您有所帮助,如有疑问,请随时询问...