FXBlurView 是一个 UIView 子类,可以复现 iOS 7 的实时背景模糊效果,但可以在 iOS 5 及以上版本上工作。它被设计成尽可能快且使用简单。FXBlurView 提供两种操作模式:静态模式,在此模式下,视图只在其被添加到父视图时渲染一次(尽管可以通过调用 setNeedsDisplay
或 updateAsynchronously:completion:
来更新)或在动态模式下,它会尽可能地在后台线程上自动重新绘制自己。
注意:'支持的'意味着库已被测试与此版本兼容。'兼容的'意味着库应该在此 iOS 版本上工作(即它不依赖任何不可用的 SDK 特性),但不再测试兼容性,可能需要调整或错误修复才能正确运行。
自版本 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 及以上版本)。
FXBlurView 通过以下方法扩展了 UIImage:
- (UIImage *)blurredImageWithRadius:(CGFloat)radius
iterations:(NSUInteger)iterations
tintColor:(UIColor *)tintColor;
此方法应用模糊效果并返回经模糊后的图像,而不会修改原始图像。radius 属性控制模糊效果的扩展范围。iterations 属性控制迭代次数。迭代次数越多,质量越高。tintColor 是可选的颜色,将与生成的图像混合。注意,tintColor 的 alpha 组件将被忽略。
+ (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]
。
@property (nonatomic, getter = isBlurEnabled) BOOL blurEnabled;
此属性可以切换单个 FXBlurView 实例的模糊开启和关闭。默认启用模糊。注意,如果使用 +setBlurEnabled
方法禁用模糊,则将覆盖此设置。
@property (nonatomic, getter = isDynamic) BOOL dynamic;
此属性控制 FXBlurView 是否动态更新,或在将视图添加到其父视图时只更新一次。默认为 YES。注意,如果 dynamic 设置为 NO,仍可以通过调用 setNeedsDisplay
或 updateAsynchronously: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(默认值),这将自动设置为模糊视图的父视图,但如果需要,您可以重写此属性。
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格式时也能正常工作版本 1.6.3
版本 1.6.2
版本 1.6.1
版本 1.6
版本 1.5.6
版本 1.5.5
版本 1.5.4
版本 1.5.3
版本 1.5.2
版本 1.5.1
版本 1.5
版本 1.4.4
版本 1.4.3
版本 1.4.2
版本 1.4.1
版本 1.4
版本 1.3.3
版本 1.3.2
版本 1.3.1
版本 1.3
版本 1.2
版本 1.1
版本 1.0