2

我的一个视图的 layoutSubviews 方法中有以下代码:

UIVisualEffect *blurEffect;
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];

UIVisualEffectView *visualEffectView;
visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
visualEffectView.frame = CGRectMake(0, 0, self.blurView.frame.size.width, self.blurView.frame.size.height);

[self.blurView addSubview:visualEffectView];

self.blurView对应于我视图中给定区域的一个 IBOutlet,我希望以那种酷炫的 iOS 8 方式对其进行模糊处理。该特定区域具有经常变化的图形。

我的问题是,有时当我的图形发生变化并且我调出模糊视图时,模糊图像是不再存在的图形。就好像模糊视图没有注意到超级视图发生了变化。

是否有任何策略来确保模糊视图是当前呈现的图形?

4

3 回答 3

3

另一个强制 UIVisualEffectsView 的方法是暂时将背景颜色更改为不同的颜色,然后再变回原来的颜色。这也会强制重新计算,并且不会产生错误(就像您尝试更改 alpha 值一样)。

我有两个 UIVisualEffectsViews(一个额外的亮和一个暗),在对整体视图的背景图像进行更改后,我调用这个更新效果视图的小方法。

-(void)refreshBlurViews {
    self.lightVisualEffect.backgroundColor = [UIColor blackColor];
    self.lightVisualEffect.backgroundColor = [UIColor clearColor];
    self.darkVisualEffect.backgroundColor = [UIColor blackColor];
    self.darkVisualEffect.backgroundColor = [UIColor clearColor];
}

希望对一路上的人有所帮助!

于 2016-01-02T00:38:33.533 回答
1

我在使用 UIVisualEffect 时一直遇到这个问题,而更好的解决方案(在我看来仍然不是一个完美的解决方案)是将它包含在“viewWillAppear”类型的方法中。这样,视觉效果在其下的视图就绪时渲染,而不是在其下的视图未渲染之前添加视觉效果视图

于 2015-07-29T16:23:35.527 回答
0

API 有两种策略可以解决这个问题:

  1. 每次使用一个新的 UIVisualEffectView
  2. 为 UIVisualEffectView 的 alpha 属性设置动画

第一个策略比第二个策略更多代码,但每个策略在重置 UIVisualEffectView 的模糊视图方面同样有效。(1) 和 (2) 起作用的原因是 (1) 迫使它在其下方重新采样,我认为 (2) 也是如此。但是为什么(2)会这样做呢?

原因 (2) 在其下方重新采样是因为如果您为它的 alpha 属性设置动画,Apple 的 API 不会模糊 UIVisualEffectView 的背景。在以下评论中告诉我们这一点:

 /*
 Proper use of this class requires some assistance on your part. Namely:

 • Avoid alpha values < 1 ...

 */
于 2014-10-07T14:39:04.240 回答