由于此常见问题没有完整,确定的答案,因此我将在此处提出并回答。
通常,我们需要呈现一个UIViewController
不覆盖全屏的图片,如下图所示。
苹果提供了几种类似的UIViewController
,如UIAlertView
Twitter或Facebook共享视图控制器等。
对于定制控制器,我们如何实现这种效果?
由于此常见问题没有完整,确定的答案,因此我将在此处提出并回答。
通常,我们需要呈现一个UIViewController
不覆盖全屏的图片,如下图所示。
苹果提供了几种类似的UIViewController
,如UIAlertView
Twitter或Facebook共享视图控制器等。
对于定制控制器,我们如何实现这种效果?
Answers:
注意:此解决方案在iOS 8中已损坏。我将尽快发布新解决方案。
我将在此处使用情节提要进行回答,但也可以不使用情节提要。
初始化:UIViewController
在情节提要中创建两个。
FirstViewController
哪个正常,SecondViewController
哪个会弹出。
莫代尔Segue公司:将UIButton
在FirstViewController和创建这个SEGUEUIButton
以SecondViewController
莫代尔SEGUE。
设为透明:现在选择UIView
(UIView
默认情况下使用创建UIViewController
)的,SecondViewController
然后更改其背景颜色以清除颜色。
制作背景暗淡:添加UIImageView
在SecondViewController
覆盖整个屏幕,并将其图像变暗一些半透明图像。您可以从这里获取示例:UIAlertView
背景图片
显示设计:现在添加一个,UIView
并进行您想要显示的任何类型的设计。这是我的故事板的屏幕截图
SecondViewController
作为弹出窗口打开,询问用户名和密码重要提示:现在是主要步骤。我们希望这SecondViewController
不会完全隐藏FirstViewController。我们已经设置了清晰的颜色,但这还不够。默认情况下,它会在模型演示文稿后面添加黑色,因此我们必须在的viewDidLoad中添加一行代码FirstViewController
。您也可以在其他位置添加它,但是它应该在segue之前运行。
[self setModalPresentationStyle:UIModalPresentationCurrentContext];
解除:什么时候解除取决于您的用例。这是一个模态演示,因此,请驳回我们所做的模态演示工作:
[self dismissViewControllerAnimated:YES completion:Nil];
就这样.....
欢迎任何形式的建议和评论。
演示: 您可以从此处获得演示源项目:弹出演示
新:有人在这个概念上做得非常好: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这样的内部使用此方法
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
PopUpViewController *popup = segue.destinationViewController;
[self setPresentationStyleForSelfController:self presentingController:popup]
}
[self setModalPresentationStyle:UIModalPresentationCurrentContext];
似乎破坏了模式过渡动画(UIModalTransitionStyleCrossDissolve
例如),因此它只是弹出而没有动画。有什么想法如何解决这个问题?
[self setModalPresentationStyle:UIModalPresentationCurrentContext];
不能单独工作。[self.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];
您还必须按照演示项目中的描述使用。
在要作为模式弹出窗口的ViewController上,使根UIView的背景颜色清晰可见。 提示:不要将根UIView用作弹出窗口。添加一个较小的新UIView作为弹出窗口。
创建一个Segue到具有您的弹出窗口的ViewController。选择“模态呈现”。
选择Segue并将Presentation更改为“ Over Current Context”:
选择作为弹出窗口的ViewController场景。在“属性检查器”的“视图控制器”部分下,将“表示”设置为“在当前上下文之上”:
两种方法都可以。那应该做!
可以随意使用我的iPhone表单控制器MZFormSheetController,在示例项目中,有很多示例介绍了如何呈现模态视图控制器,该控制器不会覆盖整个窗口,并且具有多种呈现/转换样式。
您还可以尝试MZFormSheetController的最新版本,称为MZFormSheetPresentationController,并具有许多其他功能。
您可以使用EzPopup(https://github.com/huynguyencong/EzPopup),它是一个Swift吊舱,非常易于使用:
// 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)
您可以执行此操作以将任何其他子视图添加到视图控制器。首先,将要添加为子视图的ViewController的状态栏设置为“无”,以便可以将大小调整为所需的大小。然后在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];
}
希望这会有所帮助,随时询问是否有任何疑问...