由于对这个常见的反复出现的问题没有完整,明确的答案,我会在这里提出并回答。
通常我们需要提供一个UIViewController
,使其不会覆盖全屏,如下图所示。
Apple提供了几个类似的UIViewController
,例如UIAlertView
,Twitter或Facebook共享视图控制器等。
我们如何为自定义控制器实现此效果?
答案 0 :(得分:94)
注意:此解决方案在iOS 8中已中断。我将尽快发布新解决方案。
我将使用故事板回答这里,但也可以不使用故事板。
初始化:在故事板中创建两个UIViewController
。
FirstViewController
这是正常的,SecondViewController
这将是弹出窗口。
模态搜索:将UIButton
放入FirstViewController并在此UIButton
到SecondViewController
上创建一个segue作为模态segue。
透明化:现在选择UIView
的{{1}}(UIView
默认情况下创建的UIViewController
)并更改背景颜色以清除颜色。
制作背景暗淡:在SecondViewController
中添加UIImageView
,覆盖整个屏幕,并将其图像设置为一些暗淡的半透明图像。您可以从此处获取示例:UIAlertView
Background Image
展示设计:现在添加SecondViewController
并制作您想要展示的任何设计。这是我的故事板的截图
UIView
作为弹出窗口询问用户名和密码 重要提示:现在是主要步骤。我们希望SecondViewController
不会完全隐藏FirstViewController。我们设置了清晰的颜色,但这还不够。默认情况下,它会在模型表示后面添加黑色,因此我们必须在SecondViewController
的viewDidLoad中添加一行代码。您也可以在其他地方添加它,但它应该在segue之前运行。
FirstViewController
解雇:何时解雇取决于您的使用案例。这是一个模态演示,所以要忽略我们为模态演示做的事情:
[self setModalPresentationStyle:UIModalPresentationCurrentContext];
多数人......
欢迎任何形式的建议和评论。
演示: 您可以从Here获取演示源项目:Popup Demo
新:有人在这个概念上做得很好:MZFormSheetController
新:我发现了另外一个代码来实现这种功能:KLCPopup
iOS 8更新:我让这个方法适用于iOS 7和iOS 8
[self dismissViewControllerAnimated:YES completion:Nil];
可以在prepareForSegue中使用此方法,像这样使用
+ (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];
}
}
答案 1 :(得分:45)
在想要作为模态弹出窗口的ViewController上,清除根UIView的背景颜色。 提示:不要使用根UIView作为弹出窗口。添加一个较小的新UIView作为弹出窗口。
为具有弹出窗口的ViewController创建一个Segue。选择“以模态呈现”。
选择Segue并将Presentation更改为“Over Current Context”:
选择作为弹出窗口的ViewController场景。在Attributes Inspector中的View Controller部分下,将Presentation设置为“Over Current Context”:
任何一种方法都可行。应该这样做!
答案 2 :(得分:10)
随意使用我的表格控制器MZFormSheetController for iPhone,在示例项目中有很多关于如何呈现模态视图控制器的示例,它不会覆盖整个窗口并且具有许多演示/过渡样式。
您还可以尝试最新版本的MZFormSheetController,它名为MZFormSheetPresentationController并具有更多功能。
答案 3 :(得分: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)
答案 4 :(得分:1)
您可以执行此操作以将任何其他子视图添加到视图控制器。 首先将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];
}
希望这有帮助,随时询问是否有任何疑问......
答案 5 :(得分:1)
Imao把UIImageView放在背景上并不是最好的主意。在我的情况下,我添加了控制器视图其他2个视图。第一个视图在背景上有[UIColor clearColor]
,第二个颜色你想透明(在我的情况下是灰色)。注意顺序很重要。然后第二个视图设置alpha 0.5(alpha> = 0< = 1 )。将其添加到prepareForSegue
infoVC.providesPresentationContextTransitionStyle = YES;
infoVC.definesPresentationContext = YES;
就是这样。
答案 6 :(得分:0)