具有UIBlurEffect的iOS 8 UIVisualEffect视图变得不透明

时间:2015-01-25 21:10:32

标签: ios objective-c uiblureffect uivisualeffectview

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

以下是我的演示方式:

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 个答案:

答案 0 :(得分:1)

请注意,如果启用了“降低透明度”辅助功能设置,那么带有UIVisualEffectView的任何UIBlurEffect都将是不透明的。

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

(这是您实际使用if (!UIAccessibilityIsReduceTransparencyEnabled())语句检查的内容。)

答案 1 :(得分: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会话228&#34;查看演示控制器内部&#34;。自定义演示文稿将在中途介绍。这就是我习惯使用自定义堆栈并且相当直接的原因。

答案 2 :(得分:0)

来自文档:

  

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

所以我认为问题是你明确的backgroundColor。如果您在UIVisualEffectView后面有某种内容或颜色,它应该可以工作。

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

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

答案 3 :(得分:0)

只需设置视图控制器即可保存模糊视图,如下所示: myViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

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