4

我正在尝试在现有视图上呈现具有模糊透明背景的视图。我能够在演示动画期间获得所需的效果,但是一旦完全呈现模糊视图,它就会变得不透明。

以下是我展示它的方式:

if (!UIAccessibilityIsReduceTransparencyEnabled()) {
    UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
    UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
    blurEffectView.frame = self.view.bounds;
    [blurEffectView setOpaque:NO];
    [self.view insertSubview:blurEffectView atIndex:0];
    [blurEffectView setTranslatesAutoresizingMaskIntoConstraints:false];
}

在我的模糊视图中,我已将背景颜色设置为清除颜色并将不透明设置为 NO。有什么想法吗?

4

4 回答 4

1

请注意,如果启用了“降低透明度”可访问性设置,则UIVisualEffectView带有 a 的任何内容都是不透明的。UIBlurEffect

(设置 > 通用 > 辅助功能 > 增加对比度 > 降低透明度)

(这就是您实际检查您的if (!UIAccessibilityIsReduceTransparencyEnabled())陈述的内容。)

于 2016-06-16T10:43:08.330 回答
0

我最终编写了一个自定义演示控制器。从来没有找到用标准演示文稿来做到这一点的方法。

在我想要效果viewDidLoad的视图中:

//Custom Modal Presentation
[self setModalPresentationStyle:UIModalPresentationCustom];

//blur the controlContainerView
if (!UIAccessibilityIsReduceTransparencyEnabled()) {

    UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:[self blurStyle]];
    UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
    blurEffectView.frame = self.controlContainerView.bounds;
    [blurEffectView setOpaque:NO];
    [self.controlContainerView insertSubview:blurEffectView atIndex:0];
    [blurEffectView setTranslatesAutoresizingMaskIntoConstraints:false];
}

调用上述视图:

//in .h
@property (nonatomic) id<UIViewControllerTransitioningDelegate> transitioningDelegate;

//In .m
BlurViewController *blurVC = [self.storyboard instantiateViewControllerWithIdentifier:@"blurView"];
_transitioningDelegate = [[MyCustomOverlayDelegate alloc] init];
[blurView setModalPresentationStyle:UIModalPresentationCustom];
[blurView setTransitioningDelegate:[self transitioningDelegate]];
[blurView setBlurStyle:UIBlurEffectStyleLight];
[self presentViewController: blurView animated:YES completion:nil];

您还需要导入整个演示控制器类堆栈。对我来说,它们是 OverlayDelegate、OverlayTransitionAnimator 和 OverlayPresentationController。这就是真正的工作所在。

如果可以,请查看 WWDC 2014 session 228“A look inside presentation controllers”。自定义演示文稿大约在中途进行了介绍。这是我用来建立我的自定义堆栈的基础,并且相当直截了当。

于 2015-02-06T02:34:35.243 回答
0

从文档中:

UIBlurEffect 对象对 UIVisualEffectView 后面的内容应用模糊效果。

所以我认为问题是你清晰的背景颜色。如果你的 UIVisualEffectView 后面有某种内容或颜色,它应该可以工作。

UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight];
UIVisualEffectView *blurredView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];

这个简单的代码片段对我有用。在 ViewController 我想显示我刚刚调用的模糊效果[[self view] addSubView:blurredView]

于 2015-08-28T12:10:39.317 回答
0

只需像这样设置包含模糊视图的视图控制器: myViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

它阻止了从视图层次结构中删除视图的优化,这反过来又使模糊视图首先呈现,从而使其不透明。

于 2018-02-20T17:06:17.357 回答