在Facebook iOS 7应用中,如何获得漂亮而深色的UIToolbar模糊效果

19

有人知道Facebook在模糊工具栏方面使用了什么吗?

enter image description here

现在,我知道已经有无数关于iOS 7模糊的主题了。它们都采用了相同的解决方案:
  1. 使用translucent设置为YES的UIToolbar,然后设置其barTintColor属性。这种方法的问题是会显著增加颜色的亮度。这是AMBlurView使用的方法。Facebook应用程序中的导航栏即使在白色内容上方也保持深蓝色。(使用AMBlurView后变成了粉蓝色)
  2. 在图形上下文中呈现底层视图,然后对该上下文进行模糊处理,将其作为UIImage输出,并将其用作背景视图,每秒重复30次。(这会严重影响性能)。这是FXBlurView使用的方法。似乎Facebook也没有使用这种方法。
我在苹果开发者论坛上长时间阅读过,似乎这对于苹果工程师来说也是一个技术挑战。而Facebook则通过其他方式实现了实时模糊效果。有什么想法吗?

参见:https://dev59.com/emMk5IYBdhLWcg3w3xlY - Senseful
2个回答

21

显然,这里的技巧是将半透明层插入到导航栏的子层中。我不会因为发现这个技巧而得到任何功劳,下面的片段已经从这个代码片段中获取。

UIColor *barColour = [UIColor colorWithRed:0.13f green:0.14f blue:0.15f alpha:1.00f];

UIView *colourView = [[UIView alloc] initWithFrame:CGRectMake(0.f, -20.f, 320.f, 64.f)];
colourView.opaque = NO;
colourView.alpha = .7f;
colourView.backgroundColor = barColour;

self.navigationBar.barTintColor = barColour;

[self.navigationBar.layer insertSublayer:colourView.layer atIndex:1];

你不需要保持对colorView的强引用吗? - onmyway133
2
最好直接创建一个CALayer *colorLayer,我认为这样更好。 - hatfinch
你应该在子层上将 userInteractionEnabled 设置为 NO,否则返回按钮将无法工作。 - runmad

0
除非我在上面的答案中添加了以下行,否则我无法获得所需的结果:
 [self.navigationBar setBackgroundImage:[UIImage new]
                             forBarMetrics:UIBarMetricsDefault];
    self.navigationBar.shadowImage = [UIImage new];
    self.navigationBar.translucent = YES;

这是完整的代码

[self.navigationBar setBackgroundImage:[UIImage new]
                         forBarMetrics:UIBarMetricsDefault];
self.navigationBar.shadowImage = [UIImage new];
self.navigationBar.translucent = YES;

UIColor *barColour = [UIColor colorWithRed:0.13f green:0.14f blue:0.15f alpha:1.00f];
UIView *colourView = [[UIView alloc] initWithFrame:CGRectMake(0.f, -20.f, 320.f, 64.f)];
colourView.opaque = NO;
colourView.alpha = .7f;
colourView.backgroundColor = barColour;

self.navigationBar.barTintColor = barColour;

[self.navigationBar.layer insertSublayer:colourView.layer atIndex:1];

2
这对我取消了模糊。 - Corey Hart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接