FXImageView 是一个用来简化将反射和阴影等常见视觉效果应用于图像的类。FXImageView 包含了复杂的排队和缓存逻辑,以最大化渲染这些效果的实时性能。
此外,FXImageView 还包含一个独立的 UIImage 分类,可以直接对图像进行裁剪、缩放和应用效果。
注:'支持'意味着已测试过此版本。'兼容'意味着库应在此 iOS 版本上运行(即不依赖任何不可用的 SDK 功能),但不再对兼容性进行测试,可能需要调整或修复错误才能正确运行。
从版本 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 *)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:
方法一起使用。
+ (NSOperationQueue *)processingQueue;
这是用于排队FXImageView图像以供处理的共享NSOperationQueue。您可以使用此方法来操作队列的maxConcurrentOperationCount
,这在微调性能时可能很有用。默认最大并发操作数是4。
+ (NSCache *)processedImageCache;
这是用于缓存处理过的FXImageView图像以供重用的共享NSCache。iOS在iOS内存不足时会自动管理清除此缓存,但您可能希望操作countLimit
值,或在应用中的特定点上手动清除缓存。
- (void)setImage:(UIImage *)image;
这个方法是用于设置图像属性的setter方法。详见下文的图像属性文档。
- (void)setImageWithContentsOfFile:(NSString *)file;
这个方法通过从指定的文件加载来设置图像。如果指定的文件不是一个绝对路径,则假定它是在应用程序资源目录的相对路径内。如果文件没有包含扩展名,则假定它是PNG格式。如果设置了asynchronous
属性,则文件将在后台线程上加载。
- (void)setImageWithContentsOfURL:(NSURL *)URL;
这个方法通过从指定的URL加载来设置图像。如果启用了asynchronous
属性,图像将在后台线程上加载。指定的URL可以是本地或远程文件,但请注意,在同步模式下加载远程URL并不推荐,因为它可能会阻塞主线程一段时间。
@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
版本 1.3.5
版本 1.3.4
版本 1.3.3
版本 1.3.2
版本 1.3.1
版本 1.3
版本 1.2.3
版本 1.2.2
版本 1.2.1
版本 1.2
版本 1.1.2
版本 1.1.1
版本 1.1
版本 1.0