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