iOS 7风格模糊视图

end*_*ndy 113 core-graphics objective-c ios

有没有人知道任何会复制iOS7风格模糊视图的控件.

我在假设可以有某种UIView子类来复制行为.

我在谈论这些类型的视图,它们将背景模糊得非常厚,以便它们从背景视图中获得拉动效果.

在此输入图像描述

Bra*_*son 41

您可能可以修改Bin Zhang的RWBlurPopover之类的东西来执行此操作.该组件使用我的GPUImage将高斯模糊应用于其下面的组件,但您也可以轻松地使用CIGaussianBlur.虽然GPUImage可能会更快.

但是,该组件依赖于您能够捕获您正在呈现的视图背后的视图,并且可能会遇到有关此内容背后动画的视图的问题.需要通过Core Graphics浏览栅格化背景视图会降低速度,因此我们可能没有足够的直接访问权限,无法以高效的方式执行此操作以在动画视图上进行叠加.

作为对上述内容的更新,我最近重新设计了GPUImage中的模糊以支持变量半径,允许在iOS 7的控制中心视图中完全复制模糊大小.从那时起,我创建了GPUImageiOS7BlurFilter类,它封装了Apple似乎在这里使用的正确模糊大小和颜色校正.这就是GPUImage的模糊(右侧)与内置模糊(左侧)的比较:

Apple的模糊 GPUImage的模糊

我使用4X下采样/上采样来减少高斯模糊操作所需的像素数,因此iPhone 4S可以使用此操作在大约30 ms内模糊整个屏幕.

你仍然面临着如何以高效的方式将内容从这个背后的视图中拉入这个模糊的挑战.

  • @maq - 专门提供相机,是的.一种方法是使用GPUImage来拉入相机帧(通过AV Foundation),然后将输出同时输出到GPUImageView以获得实时相机输出,然后并行输入高斯模糊(可能还有裁剪)匹配模糊视图的位置)和输出到另一个GPUImageView,它将显示控件后面的模糊内容.这是可能的,因为我们有从相机帧到OpenGL ES的快速路径,但我们没有类似的通用UI元素. (3认同)
  • @maq - 它有助于对系统上的所有内容进行引擎盖访问.开发操作系统的人可以做的与公共接口让我们做的完全不同. (2认同)

Pau*_*len 29

我正在使用FXBlurView哪个适用于iOS5 +

https://github.com/nicklockwood/FXBlurView

的CocoaPods:

-> FXBlurView (1.3.1)
   UIView subclass that replicates the iOS 7 realtime background blur effect, but works on iOS 5 and above.
   pod 'FXBlurView', '~> 1.3.1'
   - Homepage: http://github.com/nicklockwood/FXBlurView
   - Source:   https://github.com/nicklockwood/FXBlurView.git
   - Versions: 1.3.1, 1.3, 1.2, 1.1, 1.0 [master repo]
Run Code Online (Sandbox Code Playgroud)

我使用以下方法添加:

FXBlurView *blurView = [[FXBlurView alloc] initWithFrame:CGRectMake(50, 50, 150, 150)];
[self.blurView setDynamic:YES];
[self.view addSubview:self.blurView];
Run Code Online (Sandbox Code Playgroud)

  • 使用FXBlurView有一些技巧吗?我试过了,但是我们在iPhone 5上产生了滞后的观点.他们的演示项目运行良好.相当奇怪. (2认同)
  • 你是如何使用FXBlurView处理设备轮换的?我现在正在提出一个模态对话框; 对话框本身旋转正常,但背景被错误地压扁(基本上需要在旋转后更新). (2认同)

cpr*_*ack 27

警告:评论中的某些人声称Apple拒绝使用此技术的应用程序.这没有发生在我身上,只是为了你的考虑.

这可能会让您感到惊讶,但您可以使用UIToolbar,它已包含该标准效果(仅限iOS 7+).在您查看控制器的viewDidLoad:

self.view.opaque = NO;
self.view.backgroundColor = [UIColor clearColor]; // Be sure in fact that EVERY background in your view's hierarchy is totally or at least partially transparent for a kind effect!

UIToolbar *fakeToolbar = [[UIToolbar alloc] initWithFrame:self.view.bounds];
fakeToolbar.autoresizingMask = self.view.autoresizingMask;
// fakeToolbar.barTintColor = [UIColor white]; // Customize base color to a non-standard one if you wish
[self.view insertSubview:fakeToolbar atIndex:0]; // Place it below everything
Run Code Online (Sandbox Code Playgroud)

  • 注意:Apple使用工具栏解决方法拒绝应用程序 (5认同)
  • 这不适用于iOS 7.1;) (3认同)
  • 真?基于哪个理由?它没有使用任何私有API,如果所有创新的做事方式都被拒绝,那么就不可能产生很多影响...... (2认同)

Viv*_*ier 13

从iOS8开始,您可以使用UIBlurEffect.

iOS8Sampler上有一个很好的例子,包括UIBlurEffectUIVibrancyEffect.

  • 对于懒惰:`UIVisualEffect*blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]; UIVisualEffectView*blurView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];` (2认同)

Jea*_*ler 13

获得blured Overlay的最佳新方法是使用新的iOS 8 Feature UIVisualEffectView.

UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

UIVisualEffectView *bluredView = [[UIVisualEffectView alloc] initWithEffect:effect];

bluredView.frame = self.view.bounds;

[self.view addSubview:bluredView];
Run Code Online (Sandbox Code Playgroud)

UIBlurEffect支持三种Style.Dark,Light和ExtraLight.