FXBlurView 1.6.4

FXBlurView 1.6.4

测试已测试
语言语言 Obj-CObjective C
许可证 zlib
发布日期最新发布2015年9月

Nick Lockwood 维护。



  • 作者
  • Nick Lockwood

用途

FXBlurView 是一个 UIView 子类,可以复现 iOS 7 的实时背景模糊效果,但可以在 iOS 5 及以上版本上工作。它被设计成尽可能快且使用简单。FXBlurView 提供两种操作模式:静态模式,在此模式下,视图只在其被添加到父视图时渲染一次(尽管可以通过调用 setNeedsDisplayupdateAsynchronously:completion: 来更新)或在动态模式下,它会尽可能地在后台线程上自动重新绘制自己。

支持的 iOS 和 SDK 版本

  • 支持的构建目标 - iOS 8.4 (Xcode 6.4, Apple LLVM 编译器 6.1)
  • 最早支持的部署目标 - iOS 7.0
  • 最早兼容的部署目标 - iOS 4.3

注意:'支持的'意味着库已被测试与此版本兼容。'兼容的'意味着库应该在此 iOS 版本上工作(即它不依赖任何不可用的 SDK 特性),但不再测试兼容性,可能需要调整或错误修复才能正确运行。

ARC 兼容性

自版本 1.3 以来,FXBlurView 需要 ARC。如果您希望在非 ARC 项目中使用 FXBlurView,只需将 `-fobjc-arc` 编译器标志添加到 FXBlurView.m 类中。为此,转到目标设置中的“构建阶段”标签,打开“编译源文件”组,双击列表中的 FXBlurView.m,然后在弹出窗口中键入 `-fobjc-arc`。

如果您希望将整个项目转换为 ARC,在 FXBlurView.m 中注释掉 #error 行,然后在 Xcode 中运行“编辑 > 重构 > 转换为 Objective-C ARC...”工具,并确保您希望使用 ARC 的所有文件都已选中(包括 FXBlurView.m)。

安装

要使用 FXBlurView,只需将类文件拖放到您的项目中,并添加 Accelerate 框架。您可以通过编程方式创建 FXBlurView 实例,或者在 Interface Builder 中创建它们,方法是将一个普通的 UIView 拖放到您的视图中,并将其类设置为 FXBlurView。

如果您正在使用 Interface Builder,要设置 FXBlurView 的自定义属性(不支持常规 UIView 的属性),可以创建一个 IBOutlet 用于您的视图,并在代码中设置属性,或者使用 Interface Builder 中的“用户定义运行时属性”功能(在 Xcode 4.2 中推出,适用于 iOS 5 及以上版本)。

UIImage 扩展

FXBlurView 通过以下方法扩展了 UIImage:

- (UIImage *)blurredImageWithRadius:(CGFloat)radius
                         iterations:(NSUInteger)iterations
                          tintColor:(UIColor *)tintColor;

此方法应用模糊效果并返回经模糊后的图像,而不会修改原始图像。radius 属性控制模糊效果的扩展范围。iterations 属性控制迭代次数。迭代次数越多,质量越高。tintColor 是可选的颜色,将与生成的图像混合。注意,tintColor 的 alpha 组件将被忽略。

FXBlurView 方法

+ (void)setBlurEnabled:(BOOL)blurEnabled;

此方法可用于全局启用/禁用所有 FXBlurView 实例的模糊效果。这在测试中很有用,或者如果您希望在 iPhone 4 及以下版本上禁用模糊效果(与 iOS7 模糊视图行为保持一致)。默认情况下启用模糊。

+ (void)setUpdatesEnabled;
+ (void)setUpdatesDisabled;

这些方法可用于使用单个命令启用和禁用所有动态 FXBlurView 实例的更新。在执行动画之前立即禁用更新很有用,这样可以避免 FXBlurView 更新导致动画卡顿。调用可以嵌套,但请确保启用/禁用调用是平衡的,否则更新将永久启用或禁用。

- (void)updateAsynchronously:(BOOL)async completion:(void (^)())completion;

此方法可用于触发模糊效果更新(当 dynamic = NO 时很有用)。async 参数控制模糊是否在主线程或后台重绘。completion 参数是一个可选的回调块,当模糊完成时将被调用。

- (void)setNeedsDisplay;

此方法从UIView继承而来,可用于触发视图的(同步)更新。调用此方法大约等同于调用 [view updateAsynchronously:NO completion:NULL]

FXBlurView 属性

@property (nonatomic, getter = isBlurEnabled) BOOL blurEnabled;

此属性可以切换单个 FXBlurView 实例的模糊开启和关闭。默认启用模糊。注意,如果使用 +setBlurEnabled 方法禁用模糊,则将覆盖此设置。

@property (nonatomic, getter = isDynamic) BOOL dynamic;

此属性控制 FXBlurView 是否动态更新,或在将视图添加到其父视图时只更新一次。默认为 YES。注意,如果 dynamic 设置为 NO,仍可以通过调用 setNeedsDisplayupdateAsynchronously:completion: 强制视图更新。动态模糊非常消耗 CPU,所以应在执行动画之前立即禁用动态视图以避免卡顿。但是,如果您屏幕上有多个 FXBlurView,则使用 setUpdatesDisabled 方法禁用更新比将 dynamic 属性设置为 NO 更简单。

@property (nonatomic, assign) NSUInteger iterations;

模糊迭代次数。迭代次数越多,质量越好,但性能越差。默认为 2 次迭代。

@property (nonatomic, assign) NSTimeInterval updateInterval;

此属性控制 FXBlurView 在动态模式下连续更新之间的间隔(以秒为单位)。默认为零,这意味着 FXBlurView 将尽可能快地更新。这会产生最高的帧率,但也很耗费 CPU,可能导致您的应用程序性能下降,尤其是在旧设备上。为了缓解这一点,尝试增加 updateInterval 的值。

@property (nonatomic, assign) CGFloat blurRadius;   

此属性控制模糊效果的半径(以点为单位)。默认为 40 点半径,类似于 iOS 7 模糊效果。

@property (nonatomic, strong) UIColor *tintColor;

这是一个可选的着色颜色,将被应用于 FXBlurView。颜色的 RGB 组分会与模糊图像混合,产生柔和的着色效果。要调整着色效果的强度,请使用更亮或更暗的颜色。tintColor 的 alpha 组分将被忽略。如果您不希望应用着色,请将此值设置为零或 [UIColor clearColor]。注意,如果使用 Xcode 5 或更高版本,在 Interface Builder 中创建的 FXBlurView 将默认具有蓝色着色。

@property (nonatomic, weak) UIView *underlyingView;

此属性指定FXBlurView将要采样以创建模糊效果的视图。如果设置为nil(默认值),这将自动设置为模糊视图的父视图,但如果需要,您可以重写此属性。

常见问题解答(FAQ)

Q. Why are my views all blue-tinted on iOS 7?
A. FXBlurView uses the `UIView` `tintColor` property, which does not exist on iOS 6 and below, but defaults to blue on iOS 7. Just set this property to `[UIColor clearColor]` to disable the tint. To retain iOS 6 compatibility, you can either set this using code, or by using the User Defined Runtime Attributes feature of Interface Builder, which will override the standard `tintColor` value (see the example project nibs for how to do this).

Q. FXBlurView makes my whole app run slowly on [old device], what can I do?
A. To improve performance, try increasing the `updatePeriod` property, reducing the `iterations` property or disabling `dynamic` unless you really need it. If all else fails, set `blurEnabled` to NO on older devices.

Q. My SpriteKit/OpenGL/Video/3D transformed content isn't showing up properly when placed underneath an FXBlurView, why not?
A. This is a limitation of a the `CALayer` `renderInContext:` method used to capture the view contents. There is no workaround for this on iOS 6 and earlier. On iOS 7 you can make use of the `UIView` `drawViewHierarchyInRect:afterScreenUpdates:` method to capture an view and apply the blur effect yourself, but this it too slow for realtime use, so FXBlurView does not use this method by default.

Q. FXBlurView is not capturing some ordinary view content that is behind it, why not?
A. FXBlurView captures the contents of its immediate superview by default. If the superview is transparent or partially transparent, content shown behind it will not be captured. You can override the `underlyingView` property to capture the contents of a different view if you need to.

发布说明

版本 1.6.4

  • blurredImageWithRadius:iterations:tintColor:现在在图像不是ARGB格式时也能正常工作
  • 已修复 “: CGContextRestoreGState: 无效的上下文 0x0.” 问题。
  • 现在在快照之前隐藏空的子图层,以防止iOS 8上渲染InContext崩溃。
  • 当需要捕捉内容时,FXBlurView现在会自动使用较慢的drawViewHierarchyInRect方法。
  • 添加了Travis集成。

版本 1.6.3

  • FXBlurView的图像背景不再是不透明/黑色,因此它可以作为半透明覆盖层使用。
  • underlyingView属性现在是IBOutlet,因此可以在Interface Builder中进行连接。
  • 将导入移动到头文件中,以更好地兼容Swift。

版本 1.6.2

  • 已修复iOS 8在动画模糊时崩溃的问题。
  • 已修复使用Swift时FXBlurView的问题。

版本 1.6.1

  • 已修复动画完成块没有触发的问题。

版本 1.6

  • 现在可以动画化模糊半径。
  • 现在需要QuartzCore框架。

版本 1.5.6

  • 已修复1.5.4版本中引入的问题,即快照总是从父视图的左上角开始。

版本 1.5.5

  • 已修复当视图没有presentationLayer时,控制台中的零大小上下文警告。

版本 1.5.4

  • 现在可以使用普通的UIView动画来动画化FXBlurView的frame。

版本 1.5.3

  • 已修复在iOS 6或更早版本的non-Retina设备上运行的像素化问题。

版本 1.5.2

  • 已修复使用除“scale to fit”以外的内容模式时,模糊边缘可能被截断的问题。

版本 1.5.1

  • 已修复同步模糊时未调用完成处理程序的问题。

版本 1.5

  • 添加了underlyingView属性以指定源视图。
  • 添加了updateAsynchronously:completion:方法。
  • 已修复某些视图的边缘上的异常。
  • 现在符合-Weverything警告级别。

版本 1.4.4

  • 已修复Retina iPad上的像素化问题。

版本 1.4.3

  • 已修复使用Xcode 5为iOS 6.1 SDK编译时的问题。

版本 1.4.2

  • 已修复在模糊视图边缘可能出现阴影或鬼影的问题。
  • 现在符合-Wextra警告级别。

版本 1.4.1

  • 已修复setUp方法中的小内存泄漏。

版本 1.4

  • 当屏幕上同时显示多个动态FXBlurView实例时,更智能的调度。
  • 添加了全局和单个方法来禁用模糊(例如,可以在iOS 7中禁用iPhone 4及以下的模糊,以与其他应用程序保持一致)。
  • 添加了多个视图示例。

版本 1.3.3

  • 已修复向窗口添加零大小FXBlurView时在控制台中的警告。

版本 1.3.2

  • 已修复非Retina设备上的像素化问题。
  • 微调性能/质量权衡。

版本 1.3.1

  • 提高了模糊质量(1.3版本有点块状)。

版本 1.3

  • 添加了tintColor属性。
  • 通过基于模糊半径按比例减少快照比例,显著提高性能。
  • 不再包含在FXBlurView前面的视图层次结构中的视图在模糊效果中。
  • 已修复模糊视图有时部分透明的问题。
  • 添加了显示如何实现iOS 7控制中心样式覆盖层的示例。
  • FXBlurView现在需要ARC。

版本 1.2

  • 添加了+setUpdatesEnabled和+setUpdatesDisabled方法,以便在全球范围内启用/禁用动态模糊更新(例如,在进行动画时)。
  • 新增 -updateInterval 方法,以控制更新时的CPU负载
  • 将运行循环模式改为减少对滚动等操作的干扰

版本 1.1

  • 添加设置模糊迭代次数的功能
  • 修复了 dynamic = NO 时 setNeedsDisplay 的行为
  • 减少了模糊算法中的内存分配
  • 在示例应用中添加了动态模式的切换

版本 1.0

  • 首次发布