FXImageView 1.3.6

FXImageView 1.3.6

测试已测试
Lang语言 Obj-CObjective C
许可证 zlib
发布最后发布2017年4月

Nick Lockwood维护。



  • Nick Lockwood

目的

FXImageView 是一个用来简化将反射和阴影等常见视觉效果应用于图像的类。FXImageView 包含了复杂的排队和缓存逻辑,以最大化渲染这些效果的实时性能。

此外,FXImageView 还包含一个独立的 UIImage 分类,可以直接对图像进行裁剪、缩放和应用效果。

支持的 iOS & SDK 版本

  • 支持的构建目标 - iOS 10.3 (Xcode 8.3, Apple LLVM 编译器 8.1)
  • 最早支持的部署目标 - iOS 8.0
  • 最早兼容的部署目标 - iOS 6.0

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

ARC 兼容性

从版本 1.3 开始,FXImageView 需要 ARC。如果您想在非 ARC 项目中使用 FXImageView,只需将 -fobjc-arc 编译器标志添加到 FXImageView.m 类。要做到这一点,请转到目标设置中的编译阶段选项卡,打开编译源文件组,在列表中双击 FXImageView.m,然后在弹出窗口中输入 -fobjc-arc。

如果您希望将整个项目转换为 ARC,请注释掉 FXImageView.m 中的 #error 行,然后在 Xcode 中运行 Edit > Refactor > Convert to Objective-C ARC... 工具,并确保您希望使用 ARC 的所有文件都已勾选(包括 FXImageView.m)。

线程安全

FXImageView 是从 UIView 派生出来的,就像所有 UIKit 组件一样,它应该只从主线程访问。FXImageView 内部使用线程以避免阻塞用户交互,但仅应从主线程访问 FXImageView 的属性。

UIImage(FX) 类别的方法都是线程安全的,可以安全地从多个线程上对同一 UIImage 实例并发调用。

安装

手动安装

要使用FXImageView,只需将类文件拖入您的项目即可。您可以通过编程方式创建FXImageView,或者在Interface Builder中通过将普通的UIImageView拖放到视图中并将其类设置为FXImageView来创建它们。

UIImage扩展方法

- (UIImage *)imageCroppedToRect:(CGRect)rect;

返回一个裁剪到指定矩形(在图像坐标中)的图像副本。

- (UIImage *)imageScaledToSize:(CGSize)size;

返回一个按指定大小缩放后的图像副本。此方法可能会改变图像的纵横比。

- (UIImage *)imageScaledToFitSize:(CGSize)size;

返回一个按指定大小缩放的图像副本,不改变其纵横比。如果纵横比不匹配,结果图像可能在其中一个维度上小于指定的大小。不会添加空白。

- (UIImage *)imageScaledToFillSize:(CGSize)size;

返回一个按指定大小缩放的图像副本,不改变其纵横比。如果图像纵横比与指定大小不相匹配,图像将被裁剪以适应。

- (UIImage *)imageCroppedAndScaledToSize:(CGSize)size
                             contentMode:(UIViewContentMode)contentMode
                                padToFit:(BOOL)padToFit;

返回一个使用指定UIViewContentMode缩放和/或裁剪到指定大小的图像副本。此方法有助于匹配在UIImageView中显示时UIViewContentMode对图像的影响。如果padToFit参数为NO,并且纵横比不匹配,结果图像可能小于指定的大小。如果padToFit为YES,将在图像周围添加额外的透明像素以填充到指定的大小。

- (UIImage *)reflectedImageWithScale:(CGFloat)scale;

返回一个垂直反转并带有渐变的透明度衰减图像副本。scale参数确定图像何时开始透明度衰减,其值应在0.0到1.0之间。

- (UIImage *)imageWithReflectionWithScale:(CGFloat)scale gap:(CGFloat)gap alpha:(CGFloat)alpha;

返回一个包含指定缩放、间隔和透明度(不透明度)反射的图像副本。原始图像将垂直居中于新图像中,图像上面的空间用与下面反射高度相匹配的透明像素填充。这使得在UIImageView中定位图像更容易。

- (UIImage *)imageWithShadowColor:(UIColor *)color offset:(CGSize)offset blur:(CGFloat)blur;

返回一个带有指定颜色、偏移和模糊处理的阴影渲染图像副本。无论偏移值如何,原始图像都将垂直居中于新图像中,以便在UIImageView中更容易定位图像。

- (UIImage *)imageWithCornerRadius:(CGFloat)radius;

返回一个角部被裁剪到指定曲率半径的图像副本。

- (UIImage *)imageWithAlpha:(CGFloat)alpha;

返回一个具有指定透明度(不透明度)的图像副本。alpha与图像的原始alpha通道相乘,因此此方法只能用于使图像变得更透明,而不能使其更不透明。

- (UIImage *)imageWithMask:(UIImage *)maskImage;

使用指定的遮罩图像裁剪图像。遮罩图像应是一个不透明的灰度alpha遮罩。如果您希望使用透明遮罩图像,请使用maskImageFromImageAlpha方法将其转换为正确的格式。

- (UIImage *)maskImageFromImageAlpha;

此方法从具有嵌入式alpha遮罩的图像中提取alpha通道,并将其作为独立的灰度遮罩图像返回,适合与imageWithMask:方法一起使用。

FXImageView类方法

+ (NSOperationQueue *)processingQueue;

这是用于排队FXImageView图像以供处理的共享NSOperationQueue。您可以使用此方法来操作队列的maxConcurrentOperationCount,这在微调性能时可能很有用。默认最大并发操作数是4。

+ (NSCache *)processedImageCache;

这是用于缓存处理过的FXImageView图像以供重用的共享NSCache。iOS在iOS内存不足时会自动管理清除此缓存,但您可能希望操作countLimit值,或在应用中的特定点上手动清除缓存。

FXImageView方法

- (void)setImage:(UIImage *)image;

这个方法是用于设置图像属性的setter方法。详见下文的图像属性文档。

- (void)setImageWithContentsOfFile:(NSString *)file;

这个方法通过从指定的文件加载来设置图像。如果指定的文件不是一个绝对路径,则假定它是在应用程序资源目录的相对路径内。如果文件没有包含扩展名,则假定它是PNG格式。如果设置了asynchronous属性,则文件将在后台线程上加载。

- (void)setImageWithContentsOfURL:(NSURL *)URL;

这个方法通过从指定的URL加载来设置图像。如果启用了asynchronous属性,图像将在后台线程上加载。指定的URL可以是本地或远程文件,但请注意,在同步模式下加载远程URL并不推荐,因为它可能会阻塞主线程一段时间。

FXImageView属性

@property (nonatomic, assign, getter = isAsynchronous) BOOL asynchronous;

阴影和反射效果需要时间来渲染。在很多情况下这将是不可察觉的,但对于高性能应用程序,如滚动轮播图,这种渲染延迟可能会导致动画卡顿。此方法切换阴影和反射效果是否立即在主线程上应用(异步=NO),或者在后台线程上渲染(异步=YES)。通过在后台渲染效果,可以避免性能问题。默认为NO。

@property (nonatomic, assign) NSTimeInterval crossfadeDuration;

此属性控制图像处理完毕并在显示时的交叉淡入动画的持续时间,时间单位为秒。默认持续时间为0.25。将持续时间设置为零以完全禁用交叉淡入。

@property (nonatomic, assign) CGFloat reflectionGap;

图像与其反射之间的间隙,以像素为单位(或Retina Display设备上的点)。默认为零。

@property (nonatomic, assign) CGFloat reflectionScale;

相对于图像的反射高度。应在0.0到1.0的范围内。默认为0.0(无反射)。

@property (nonatomic, assign) CGFloat reflectionAlpha;

反射的不透明度。应在0.0到1.0的范围内。默认为0.0(完全透明)。

@property (nonatomic, strong) UIColor *shadowColor;

阴影的颜色(默认为黑色)。

@property (nonatomic, assign) CGSize shadowOffset;

阴影的偏移量,以点或像素为单位。默认为CGSizeZero(无阴影)。

@property (nonatomic, assign) CGFloat shadowBlur;

图像阴影的柔和度。默认为零,会产生硬阴影。

@property (nonatomic, assign) CGFloat cornerRadius;

圆角剪裁的半径。将其设置为零以禁用圆角。

@property (nonatomic, strong) UIImage *image;

此属性继承自UIImageView,但其行为不同。设置此属性不会直接设置图像,而是应用指定的效果,然后显示处理后的图像。如果设置了asynchronous属性,则此处理将在后台线程上执行,因此图像不会立即出现。访问图像属性的getter将返回原始的未处理图像。

@property (nonatomic, strong) UIImage *processedImage;

应用反射和阴影效果后的结果图像。有时直接设置和获取此非常有用,例如您可能希望在图像处理时设置一个占位图像,或者检索和存储处理后的图像以便稍后可以缓存重用,而无需从原始图像重新生成(请注意,FXImageView已包含处理图像的内存缓存)。

@property (nonatomic, copy) UIImage *(^customEffectsBlock)(UIImage *image);

如果您想对自己的图像应用自定义效果,您可以使用customEffectsBlock属性进行自定义绘制。这个块会传递正确的裁剪和缩放后的图像,您应该返回一个应用了自定义效果的新版本。您的自定义绘图块将在任何其他效果之前应用(除了裁剪和缩放)。FXImageView的缓存机制不知道您的自定义效果,因此如果您的应用程序使用多个效果块,或者您的块依赖于任何外部数据,您应该更新customEffectsIdentifier属性,以便FXImageView缓存可以正确处理。请注意,如果以异步模式使用,您应该确保您的块代码是线程安全的。

@property (nonatomic, copy) NSString *cacheKey;

FXImageView根据您指定的图像对象或URL缓存处理后的图像,结合您选择的具体效果集。这种机制在大多数情况下都有效,但是对于即时生成的图像对象或从ALAssets库加载的对象,由于相同的图像对象永远不会重复使用,因此缓存不会带来任何好处。在这种情况下,您可以通过使用自定义缓存键来提高性能。键可以是任何字符串,唯一的要求是它对于您使用FXImageView的每个唯一的图像和效果组合都应该唯一。如果您在轮播图中显示图像,则基于轮播图项索引的字符串将是不错的选择作为缓存键。将cacheKey属性设置为nil以恢复默认的缓存键计算。

发布说明

版本 1.3.6

  • 适配Xcode 8.3

版本 1.3.5

  • 修复了设置FXImageView高亮属性会导致其损坏的问题(这可能会发生在FXImageView被放置在UICollectionViewCell内部的情况下)

版本 1.3.4

  • 修复了在某些情况下FXImageView可能会丢失样式的问题

版本 1.3.3

  • 修复了iOS 7.1上的渲染错误
  • 不再使用内部UIImageView

版本 1.3.2

  • 现在符合-Weverything警告级别
  • 修复了KVO示例

版本 1.3.1

  • 添加了QuartzCore导入以解决podspecs问题

版本 1.3

  • 添加了crossfadeDuration属性以控制或禁用交叉淡入淡出效果
  • 现在需要ARC
  • 现在符合-Wall和-Wextra警告级别
  • 内存低警告发生时缓存会清除

版本 1.2.3

  • 修复了使用自定义效果块时潜在的崩溃问题
  • 用更通用的cacheKey属性替换了customEffectsIdentifier属性
  • 修复了UIImage+FX分类中的编译器警告

版本 1.2.2

  • 修复了一些额外的缓存错误
  • FXImageView的image和processedImage属性现在符合KVO规范
  • 添加了KVO示例

版本 1.2.1

  • 由于不可解决的缓存问题,去掉了setWithBlock:方法
  • 添加了一些额外的UIImage+FX方法
  • 修复了一些缓存错误

版本 1.2

  • 添加了圆角裁剪效果
  • 添加了用于应用自定义效果的customEffects块属性
  • 添加了setWithContentsOfFile/URL:方法以实现动态加载和下载
  • 添加了setWithBlock:方法以实现动态图像生成或加载逻辑

版本 1.1.2

  • 修复了在设置processQueue maxConcurrentOperationCount为-1(无限)时可能发生的潜在的崩溃问题
  • 添加了高级示例

版本 1.1.1

  • 性能改进

版本 1.1

  • 添加了后进先出队列以处理操作
  • 添加了处理图像的缓存
  • 修复了一些错误

版本 1.0

  • 首次发布