使用UIVisualEffectView进行奇怪的模糊伪影

时间:2014-12-22 15:59:51

标签: ios cocoa-touch uiblureffect uivisualeffectview

我有一个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 with Blur”,我会得到同样的奇怪行为,因此上面的代码不应该受到责备。

1 个答案:

答案 0 :(得分:2)

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

根据UIVisualEffectView文档;

  

使用UIVisualEffectView类时,请避免使用alpha值   小于1.创建部分透明的视图会导致   系统在一个过程中组合视图和所有相关的子视图   屏幕外渲染通行证。需要组合UIVisualEffectView对象   作为内容的一部分,它们被分层在上面以便查看   正确。在视觉效果视图上将alpha设置为小于1或   任何超级视图都会导致许多效果看起来不正确   显示出来。

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