YBIBImageData.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. //
  2. // YBIBImageData.h
  3. // YBImageBrowserDemo
  4. //
  5. // Created by 波儿菜 on 2019/6/5.
  6. // Copyright © 2019 波儿菜. All rights reserved.
  7. //
  8. #import <Photos/Photos.h>
  9. #import "YBIBDataProtocol.h"
  10. #import "YBIBImageLayout.h"
  11. #import "YBIBImageCache.h"
  12. #import "YBIBInteractionProfile.h"
  13. NS_ASSUME_NONNULL_BEGIN
  14. @class YBIBImageData;
  15. /// 获取 NSData 的闭包
  16. typedef NSData * _Nullable (^YBIBImageDataBlock)(void);
  17. /// 获取 UIImage 的闭包
  18. typedef UIImage * _Nullable (^YBIBImageBlock)(void);
  19. /// 修改 NSURLRequest 并返回的闭包
  20. typedef NSURLRequest * _Nullable (^YBIBRequestModifierBlock)(YBIBImageData *imageData, NSURLRequest *request);
  21. /// 根据图片逻辑像素和 scale 判断是否需要预解码的闭包
  22. typedef BOOL (^YBIBPreDecodeDecisionBlock)(YBIBImageData *imageData, CGSize imageSize, CGFloat scale);
  23. /// 修改 UIImage 并返回的闭包
  24. typedef void (^YBIBImageModifierBlock)(YBIBImageData *imageData, UIImage *image, void(^completion)(UIImage *processedImage));
  25. /// 单击事件的处理闭包
  26. typedef void (^YBIBImageSingleTouchBlock)(YBIBImageData *imageData);
  27. /// 内部图片滚动视图状态回调闭包
  28. typedef void (^YBIBImageScrollViewStatusBlock)(YBIBImageData *imageData, UIScrollView *scrollView);
  29. /**
  30. 图片数据类,承担配置数据和处理数据的责任
  31. */
  32. @interface YBIBImageData : NSObject <YBIBDataProtocol>
  33. /// 本地图片名字
  34. @property (nonatomic, copy, nullable) NSString *imageName;
  35. /// 本地图片路径
  36. @property (nonatomic, copy, nullable) NSString *imagePath;
  37. /// 本地图片字节码,返回 NSData
  38. @property (nonatomic, copy, nullable) YBIBImageDataBlock imageData;
  39. /// 本地图片,返回 UIImage 及其衍生类 (若不是遵循'YYAnimatedImage'协议的类型,将失去对动图和拓展格式的支持)
  40. @property (nonatomic, copy, nullable) YBIBImageBlock image;
  41. /// 网络图片资源
  42. @property (nonatomic, copy, nullable) NSURL *imageURL;
  43. /// 修改 NSURLRequest 并返回
  44. @property (nonatomic, copy, nullable) YBIBRequestModifierBlock requestModifier;
  45. /// 相册图片资源
  46. @property (nonatomic, strong, nullable) PHAsset *imagePHAsset;
  47. /// 投影视图,当前数据模型对应外界业务的 UIView (通常为 UIImageView),做转场动效用
  48. @property (nonatomic, weak, nullable) __kindof UIView *projectiveView;
  49. /// 预览图/缩约图,注意若这个图片过大会导致内存压力(若 projectiveView 存在且是 UIImageView 类型将会自动获取缩约图)
  50. @property (nonatomic, strong, nullable) UIImage *thumbImage;
  51. /// 预览图/缩约图 URL,缓存中未找到则忽略(若 projectiveView 存在且是 UIImageView 类型将会自动获取缩约图)
  52. @property (nonatomic, copy, nullable) NSURL *thumbURL;
  53. /// 是否允许保存到相册
  54. @property (nonatomic, assign) BOOL allowSaveToPhotoAlbum;
  55. /// 根据图片信息判断是否需要预解码
  56. @property (nonatomic, copy, nullable) YBIBPreDecodeDecisionBlock preDecodeDecision;
  57. /// 是否异步预解码,默认为 YES
  58. @property (nonatomic, assign) BOOL shouldPreDecodeAsync;
  59. /// 压缩物理像素界限大小,当图片超过这个值将会被压缩显示,默认为 4096*4096
  60. @property (nonatomic, assign) CGFloat compressingSize;
  61. /// 触发裁剪的缩放比例,必须大于等于 1,默认情况内部会动态计算 (仅当图片需要压缩显示时有效)
  62. @property (nonatomic, assign) CGFloat cuttingZoomScale;
  63. /**
  64. 判断图片是否需要压缩显示
  65. */
  66. - (BOOL)shouldCompressWithImage:(UIImage *)image;
  67. /**
  68. 修改原始图片并返回处理后的图片 (特别注意当 image 是大图的时候,避免 OOM)
  69. Example:
  70. [... setImageModifier:^(YBIBImageData *imageData, UIImage * _Nonnull image, void (^ _Nonnull completion)(UIImage * _Nonnull)) {
  71. //step 1 : Add watermark, trademark, etc. (Sync or async).
  72. ... processing code ...
  73. //step 2 : Return the processed UIImage.
  74. completion(image);
  75. }];
  76. */
  77. @property (nonatomic, copy, nullable) YBIBImageModifierBlock originImageModifier;
  78. /// 修改压缩图片并返回处理后的图片 (仅在当前图片需要被压缩时有效)
  79. @property (nonatomic, copy, nullable) YBIBImageModifierBlock compressedImageModifier;
  80. /// 修改裁剪图片并返回处理后的图片 (仅在当前图片需要被裁剪时有效)
  81. @property (nonatomic, copy, nullable) YBIBImageModifierBlock cuttedImageModifier;
  82. /// 预留属性可随意使用
  83. @property (nonatomic, strong, nullable) id extraData;
  84. /// 手势交互动效配置文件
  85. @property (nonatomic, strong) YBIBInteractionProfile *interactionProfile;
  86. /// 单击的处理,默认是退出图片浏览器
  87. @property (nonatomic, copy, nullable) YBIBImageSingleTouchBlock singleTouchBlock;
  88. /// 图片滚动的回调
  89. @property (nonatomic, copy, nullable) YBIBImageScrollViewStatusBlock imageDidScrollBlock;
  90. /// 图片缩放的回调
  91. @property (nonatomic, copy, nullable) YBIBImageScrollViewStatusBlock imageDidZoomBlock;
  92. /// 图片布局类 (赋值可自定义)
  93. @property (nonatomic, strong) id<YBIBImageLayout> layout;
  94. /// 默认图片布局类 (可配置其属性)
  95. @property (nonatomic, weak, readonly) YBIBImageLayout *defaultLayout;
  96. /**
  97. 终止处理数据程序
  98. */
  99. - (void)stopLoading;
  100. /**
  101. 清除缓存的数据
  102. */
  103. - (void)clearCache;
  104. /**
  105. 加载数据,一般不需要调用这个方法,当该数据对象做了数据更新时调用
  106. */
  107. - (void)loadData;
  108. /// 处理后的原始图片
  109. @property (nonatomic, strong, readonly) UIImage *originImage;
  110. /// 处理后的压缩图片
  111. @property (nonatomic, strong, readonly) UIImage *compressedImage;
  112. @end
  113. NS_ASSUME_NONNULL_END