UIVisualEffectView 奇怪的模糊伪影

Posted

技术标签:

【中文标题】UIVisualEffectView 奇怪的模糊伪影【英文标题】:Strange blur artefacts with UIVisualEffectView 【发布时间】:2014-12-22 15:59:51 【问题描述】:

我有一个 UIVisualEffectView,当它出现时会导致一些奇怪的伪影。 UIVisualEffectView 在视图加载后添加到代码中,因为它在 ios 7 中不可用。

看看街景图片上模糊的文字背景:http://s.swic.name/Z3UL

模糊需要 0.1 秒才能出现,在此之前它只是一个较低分辨率的背景,就像尚未计算模糊一样。

知道发生了什么吗?我正在使用此代码在 awakeFromNib 中添加模糊

- (void)addBlurWithColor:(UIColor *)color andStyle:(UIBlurEffectStyle)style andVibrancy:(BOOL)vibrancy

    if (UIDevice.supportsVisualEffects && NSClassFromString(@"UIVisualEffectView") && !UIAccessibilityIsReduceTransparencyEnabled()) 
        self.backgroundColor = color;

        UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:style];
        UIVisualEffectView *visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
        visualEffectView.frame = self.bounds;
        visualEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

        NSArray *subviews = self.subviews;

        [self addSubview:visualEffectView];
        [self sendSubviewToBack:visualEffectView];

        if (vibrancy) 
            UIVibrancyEffect *vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect];
            UIVisualEffectView *vibrancyEffectView = [[UIVisualEffectView alloc] initWithEffect:vibrancyEffect];
            [vibrancyEffectView setFrame:self.bounds];
            vibrancyEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

            for (UIView *subview in subviews) 
                [vibrancyEffectView.contentView addSubview:subview];
            

            [[visualEffectView contentView] addSubview:vibrancyEffectView];
        
    

编辑:视频仅启用了慢速动画,过渡是常规的推送转场。

Edit2:如果我只是在 Interface Builder 中拖放一个“带有模糊的 UIVisualEffectView”,我会得到同样奇怪的行为,所以上面的代码不应该受到责备。

【问题讨论】:

这对你来说可能已经不重要了,但似乎视频来自模拟器,根据我的经验,模拟器在视觉效果视图方面往往会出现一些视觉伪影。在设备上测试以确保! @alex 好建议,但这次不是这样 【参考方案1】:

发现了问题,当视图出现时,我正在重新加载 [UIView transitionWithView:...] 内的 tableview,这会改变 alpha,这对于 UIVisualEffectViews 来说显然是一个很大的禁忌!

根据 UIVisualEffectView 文档;

当使用 UIVisualEffectView 类时,避免 alpha 值 小于 1。创建部分透明的视图会导致 系统将视图和所有关联的子视图在一个 离屏渲染通道。 UIVisualEffectView 对象需要组合 作为内容的一部分,它们被叠加在上面以便看起来 正确的。在视觉效果视图上将 alpha 设置为小于 1 或 它的任何超级视图都会导致许多效果看起来不正确或不正确 完全出现。

https://developer.apple.com/library/ios/documentation/uikit/reference/UIVisualEffectView/index.html

【讨论】:

以上是关于UIVisualEffectView 奇怪的模糊伪影的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中拖动时如何修改UIVisualEffectView的模糊度?

UIVisualEffectView 不会模糊它的 SKView 超级视图

UIVisualEffectView(高斯模糊效果)

UIStoryboardSegue & UIVisualEffectView - 完成块退出后模糊效果丢失

UIVisualEffectView(自定义模糊视图)

iOS 8 模糊视图(毛玻璃效果)的简单实现UIVisualEffectView