1

我有一个相对简单的问题,我似乎无法弄清楚。

我在一个 UIViewController (myViewController) 的内部,它嵌入在 UIViewController 层次结构中的某个地方(在父 UITabBarController 下方的某个地方)。

myViewController 有一个按钮。当按下该按钮时,我想用黑色、半透明、模态 UIViewController (myModalViewController) 覆盖整个屏幕(包括来自父 UITabBarController 的所有粘液),上面还有其他粘液。

如果我只是打电话

[myViewController presentViewController:myModalViewController..]

一旦过渡结束,myViewController 的视觉效果就会消失,从而破坏了半透明覆盖的点。

如果我将 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 和其中的所有 UIView 似乎都没有收到任何触摸通知。

4

2 回答 2

1

如果你想要透明的 ViewController 你必须使用UIModalPresentationCustom 像这样的东西......

...
[yourModalCtrl setModalPresentationStyle:UIModalPresentationCustom];
[yourModalCtrl setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[self setModalPresentationStyle:UIModalPresentationCurrentContext]; //new
//yourModalCtrl.modalPresentationCapturesStatusBarAppearance = YES;
[self presentViewController: yourModalCtrl animated:Yes completion:completion];

[self presentViewController:....]或者您的“演示控制器”是什么...

http://b2cloud.com.au/how-to-guides/invisible-background-modal-view/

更新

为了与 iOS 7 兼容,您需要添加新[self setModalPresentationStyle:UIModalPresentationCurrentContext];的 - 检查所有代码。此外,您必须设置animate : No(它与 Yes 一起使用,但您将在控制台中看到一条消息:)

于 2015-02-11T07:48:48.140 回答
0

在类似的情况下,我所做的是:

我添加了一个UIImageView作为我的模态视图控制器的背景图像。

然后我使用苹果提供的UIImage + ImageEffects 类别来创建我的父视图控制器的模糊图像。

我在父类中实现了一个方法,例如:

// 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通过此方法生成的图像传递给我的模态视图控制器并将其设置为背景图像(到我之前添加的图像视图)。

于 2015-02-10T23:08:35.003 回答