CKLBlurView 1.0.0

CKLBlurView 1.0.0

测试已测试
语言语言 Obj-CObjective C
许可证 zlib
发布上次发布2015年4月

Lucas Oceano维护。



  • By
  • Nick Lockwood

目的

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

支持的 iOS & SDK 版本

  • 支持的编译目标 - iOS 8.1 (Xcode 6.1, Apple LLVM 编译器 6.0)
  • 最早支持的部署目标 - iOS 6.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 中运行 Edit > Refactor > Convert to Objective-C ARC... 工具,并确保要使用 ARC 的所有文件都已勾选(包括 FXBlurView.m)。

安装

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

如果您正在使用 Interface Builder,要设置 FXBlurView 的自定义属性(那些常规 UIView 不支持属性),您可以创建一个 IBOutlet 并在代码中设置属性,或者使用 Interface Builder 中的 User Defined Runtime Attributes 功能(在 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 及以下版本的模糊(与 iOS 7 模糊视图行为保持一致)很有用。默认情况下启用模糊。

+ (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成分将被忽略。如果不希望应用着色,请将此值设置为nil或[UIColor clearColor]。请注意,如果您使用的是Xcode 5或更高版本,在Interface Builder中创建的FXBlurView默认会有蓝色着色。

@property (nonatomic, weak) UIView *underlyingView;

此属性指定FXBlurView将要采样以创建模糊效果的视图。如果设置为nil(默认值),这将是从模糊视图本身的父视图开始的,但如果需要,您可以覆盖此值。

常见问题解答

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.3

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

版本 1.6.2

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

版本 1.6.1

  • 修复了动画完成块未触发的问题

版本 1.6

  • 现在可以动画化blurRadius
  • 现在需要QuartzCore框架

版本 1.5.6

  • 修复了在版本1.5.4中引入的错误,其中快照始终从父视图的左上角获得

版本 1.5.5

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

版本 1.5.4

  • 现在可以通过普通的UIView动画来动画化FXBlurView的frame

版本 1.5.3

  • 修复了在运行iOS 6或更早版本的非Retina设备上的像素化问题

版本 1.5.2

  • 修复了当使用非“缩放以适应”的内容模式时,模糊边缘可能被裁剪的问题

版本 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层级结构之前且位于FXBlurView上的视图不再包含在模糊效果中
  • 修复了blurView有时部分透明的问题
  • 添加了展示如何实现iOS7控制中心样式覆盖层的示例
  • FXBlurView现在需要ARC

版本 1.2

  • 增加了 +setUpdatesEnabled 和 +setUpdatesDisabled 方法,以全局启用/禁用动态模糊更新(例如,在进行动画时)。
  • 增加了 -updateInterval 方法,以在更新时控制 CPU 负载。
  • 更改了 runloop 模式,以减少与滚动等操作的干扰。

版本 1.1

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

版本 1.0

  • 首次发布