在iPhone中将UIViewController显示为Popup
由于对这个常见问题没有完整的,明确的答案,我会在这里提出并回答。
通常我们需要提供一个UIViewController
,它不会覆盖整个屏幕,如下图所示。
苹果提供了几个类似的UIViewController
,比如UIAlertView
,Twitter或者Facebook共享视图控制器等等。
我们如何才能达到这个自定义控制器的效果?
注:这个解决scheme在iOS 8中被破解了。我会尽快发布新的解决scheme。
我将在这里使用故事板回答,但也可以没有故事板。
-
初始化:在故事板中创build两个
UIViewController
。- 可以说
FirstViewController
是正常的,而SecondViewController
将是popup窗口。
- 可以说
-
Modal Segue:将
UIButton
放在FirstViewController中,并将此UIButton
上的Segue创build为SecondViewController
作为模式segue。 -
使透明:现在select
SecondViewController
UIView
(UIView
哪些是默认与UIViewController
创build),并更改其背景颜色清除颜色。 -
使背景昏暗:在
SecondViewController
添加一个覆盖整个屏幕的UIImageView
,SecondViewController
其图像设置为一些变暗的半透明图像。 你可以从这里得到一个样本:UIAlertView
背景图片 -
显示devise:现在添加一个
UIView
,并使任何types的devise,你想显示。 这是我的故事板的截图- 在这里,我添加了loginbutton的segue,打开
SecondViewController
popup询问用户名和密码
- 在这里,我添加了loginbutton的segue,打开
-
重要:现在,主要步骤。 我们希望
SecondViewController
不会完全隐藏FirstViewController。 我们已经设定了清晰的颜色,但这还不够。 默认情况下,它会在模型表示后添加黑色,所以我们必须在FirstViewController
viewDidLoad中添加一行代码。 您也可以在另一个地方添加它,但它应该在继续之前运行。[self setModalPresentationStyle:UIModalPresentationCurrentContext];
-
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] }
你可以在Interface Builder中做到这一点。
- 对于您希望呈现模式设置其最外面的视图背景为透明的视图
- 控制单击并从主机视图控制器拖动到模态视图控制器
- select模式
- 点击新创build的segue,在Attribute Inspector(右侧)将“Presentation”设置为“Over Current Context”
界面生成器中的模态popup窗口(Storyboards)
步骤1
在你想作为模态popup窗口的ViewController上,清除根UIView的背景颜色。 提示:不要使用root UIView作为popup窗口。 添加一个新的UIView是更小的popup。
第2步
创build一个Segue到具有popup窗口的ViewController。 select“现在模式”。
从这里创buildpopup的两种方法
方法一 – 使用Segue
selectSegue并将演示文稿更改为“Over Current Context”:
方法二 – 使用视图控制器
select您的popup窗口的ViewController场景。 在“属性”检查器中的“查看控制器”部分下,将“演示文稿”设置为“过度上下文”:
两种方法都可以工作。 这应该做到这一点!
随意使用我的表单控制器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;
就这样。