如何在 iPhone iOS7+ 上创建透明的模态 UIViewController?
How to create transparent, modal UIViewController on iPhones iOS7+?
我有一个相对简单的问题,我似乎无法弄清楚。
我在 UIViewController (myViewController) 中,它嵌入了 UIViewController 层次结构中的某处(父级下方的某处) UITabBarController).
我的ViewController 有一个按钮。当按下该按钮时,我想用黑色、半透明、模态 UIViewController (myModalViewController) 上面还有其他粘液。
如果我打电话
[myViewController presentViewController:myModalViewController..]
我的ViewController 的视觉效果在过渡结束后立即消失,从而破坏了半透明叠加的点。
如果我设置 myModalViewController 作为 myViewController 的子视图控制器并添加 myModalViewController.view 作为 myViewController.view 的子视图,半透明的模态视图控制器黑色背景出现在 UITabBarController 的所有按钮下方。太糟糕了,因为我想要覆盖整个屏幕。
因此,我在层次结构中寻找最顶层的视图控制器,并将 myModalViewController 添加为它的子节点:
UIViewController* root = myViewController;
while (root.parentViewController) {
root = root.parentViewController;
}
[root addChildViewController:myModalViewController];
[root.view addSubview:myModalViewController.view];
如果这是处理这种情况的正确方法?好像有点乱。
此外,如何让 myModalViewController 以模态方式运行并吞下所有触摸手势,以便它下面的所有 UI 不响应触摸?现在它确实如此,我所有修复它的尝试都失败了。此外,myModalViewController 和其中的所有 UI 视图似乎都没有收到任何触摸通知。
在类似情况下我所做的是:
我添加了一张 UIImageView
作为我的模态视图控制器的背景图片。
然后我使用苹果提供的 UIImage + ImageEffects
category 来创建我的 parent 视图控制器的模糊图像。
我在 parent class 中实现了一个方法,例如:
// Returns the blurred image
- (UIImage *)getBlurredImage
{
// You will want to calculate this in code based on the view you will be presenting.
CGSize size = self.view.frame.size;
UIGraphicsBeginImageContext(size);
// view is the view you are grabbing the screen shot of. The view that is to be blurred.
[self.view drawViewHierarchyInRect:(CGRect)self.view.bounds afterScreenUpdates:YES];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// Gaussian Blur
image = [image applyDarkEffect];
// Box Blur
// image = [image boxblurImageWithBlur:0.2f];
return image;
}
我将通过此方法生成的 UIImage
传递到我的模态视图控制器并将其设置为背景图像(到我之前添加的图像视图)。
如果你想要透明 ViewController 你必须使用 UIModalPresentationCustom
像这样...
...
[yourModalCtrl setModalPresentationStyle:UIModalPresentationCustom];
[yourModalCtrl setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[self setModalPresentationStyle:UIModalPresentationCurrentContext]; //new
//yourModalCtrl.modalPresentationCapturesStatusBarAppearance = YES;
[self presentViewController: yourModalCtrl animated:Yes completion:completion];
[self presentViewController:....]
或者你的 "Presenting controller"...
http://b2cloud.com.au/how-to-guides/invisible-background-modal-view/
更新
为了与 iOS 7 兼容,您需要添加新的 [self setModalPresentationStyle:UIModalPresentationCurrentContext];
- 检查所有代码。此外,您必须设置 animate : No
(它与 Yes 一起工作,但您将在控制台中收到一条消息 :)
我有一个相对简单的问题,我似乎无法弄清楚。
我在 UIViewController (myViewController) 中,它嵌入了 UIViewController 层次结构中的某处(父级下方的某处) UITabBarController).
我的ViewController 有一个按钮。当按下该按钮时,我想用黑色、半透明、模态 UIViewController (myModalViewController) 上面还有其他粘液。
如果我打电话
[myViewController presentViewController:myModalViewController..]
我的ViewController 的视觉效果在过渡结束后立即消失,从而破坏了半透明叠加的点。
如果我设置 myModalViewController 作为 myViewController 的子视图控制器并添加 myModalViewController.view 作为 myViewController.view 的子视图,半透明的模态视图控制器黑色背景出现在 UITabBarController 的所有按钮下方。太糟糕了,因为我想要覆盖整个屏幕。
因此,我在层次结构中寻找最顶层的视图控制器,并将 myModalViewController 添加为它的子节点:
UIViewController* root = myViewController;
while (root.parentViewController) {
root = root.parentViewController;
}
[root addChildViewController:myModalViewController];
[root.view addSubview:myModalViewController.view];
如果这是处理这种情况的正确方法?好像有点乱。
此外,如何让 myModalViewController 以模态方式运行并吞下所有触摸手势,以便它下面的所有 UI 不响应触摸?现在它确实如此,我所有修复它的尝试都失败了。此外,myModalViewController 和其中的所有 UI 视图似乎都没有收到任何触摸通知。
在类似情况下我所做的是:
我添加了一张 UIImageView
作为我的模态视图控制器的背景图片。
然后我使用苹果提供的 UIImage + ImageEffects
category 来创建我的 parent 视图控制器的模糊图像。
我在 parent class 中实现了一个方法,例如:
// Returns the blurred image
- (UIImage *)getBlurredImage
{
// You will want to calculate this in code based on the view you will be presenting.
CGSize size = self.view.frame.size;
UIGraphicsBeginImageContext(size);
// view is the view you are grabbing the screen shot of. The view that is to be blurred.
[self.view drawViewHierarchyInRect:(CGRect)self.view.bounds afterScreenUpdates:YES];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// Gaussian Blur
image = [image applyDarkEffect];
// Box Blur
// image = [image boxblurImageWithBlur:0.2f];
return image;
}
我将通过此方法生成的 UIImage
传递到我的模态视图控制器并将其设置为背景图像(到我之前添加的图像视图)。
如果你想要透明 ViewController 你必须使用 UIModalPresentationCustom
像这样...
...
[yourModalCtrl setModalPresentationStyle:UIModalPresentationCustom];
[yourModalCtrl setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[self setModalPresentationStyle:UIModalPresentationCurrentContext]; //new
//yourModalCtrl.modalPresentationCapturesStatusBarAppearance = YES;
[self presentViewController: yourModalCtrl animated:Yes completion:completion];
[self presentViewController:....]
或者你的 "Presenting controller"...
http://b2cloud.com.au/how-to-guides/invisible-background-modal-view/
更新
为了与 iOS 7 兼容,您需要添加新的 [self setModalPresentationStyle:UIModalPresentationCurrentContext];
- 检查所有代码。此外,您必须设置 animate : No
(它与 Yes 一起工作,但您将在控制台中收到一条消息 :)