Files
yinmeng-ios/xplan-ios/Base/Tool/SpriteSheetManager/SpriteSheetImageManager.m
2022-01-14 15:48:47 +08:00

157 lines
4.6 KiB
Objective-C

//
// SpriteSheetImageManager.m
// XChat
//
// Created by Macx on 2018/5/11.
// Copyright © 2018年 XC. All rights reserved.
//
#import "SpriteSheetImageManager.h"
#import <SDWebImage/SDWebImageDownloader.h>
#import <UIImageView+WebCache.h>
#import "YYUtility.h"
#import "XPMacro.h"
#import "GCDHelper.h"
static NSInteger retryCount = 3;
static CGFloat kdeafultFrameDurations = 0.2;
@interface SpriteSheetImageManager()
@property (nonatomic,strong) YYSpriteSheetImage *sprite;
@property (nonatomic,strong) NSMutableDictionary *parserQueue;
@property (nonatomic,strong) NSMutableDictionary *retryCache;
@property (nonatomic, strong) UIImageView *operationImageView;//
@end
@implementation SpriteSheetImageManager
- (void)loadSpriteSheetImageWithURL:(NSURL *_Nullable)url
completionBlock:(void ( ^ _Nonnull )(YYSpriteSheetImage * _Nullable sprit))completionBlock
failureBlock:(void ( ^ _Nullable)(NSError * _Nullable error))failureBlock {
if (!url) {
return;
}
@kWeakify(self);
NSString *key = [self cacheURL:url];
[self.operationImageView sd_setImageWithURL:url completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
@kStrongify(self);
if (error) {
if (error) {
if (![self.retryCache objectForKey:key]) {
[self.retryCache setObject:@(0) forKey:key];
}
[self.retryCache setObject:@([[self.retryCache objectForKey:key] integerValue] + 1) forKey:key];
if ([[self.retryCache objectForKey:key] integerValue] < retryCount) {
[self retryWithKey:key completionBlock:^(YYSpriteSheetImage * _Nullable sprit) {
completionBlock(sprit);
} failureBlock:^(NSError * _Nullable error) {
failureBlock(error);
}];
}
}
return ;
}
YYSpriteSheetImage *sheetImage = [SpriteSheetImageManager createSpriteSheet:image frameDurations:kdeafultFrameDurations];
dispatch_main_sync_safe(^{
if (sheetImage) {
completionBlock(sheetImage);
[self removeCacheWithKey:key];
[self.retryCache removeObjectForKey:key];
completionBlock(sheetImage);
}
});
}];
}
- (void)retryWithKey:(NSString *)key
completionBlock:(void (^)(YYSpriteSheetImage * _Nullable))completionBlock
failureBlock:(void (^)(NSError * _Nullable))failureBlock {
if (key) {
NSURL *url = [self.parserQueue objectForKey:key];
[self loadSpriteSheetImageWithURL:url completionBlock:^(YYSpriteSheetImage * _Nullable sprit) {
completionBlock(sprit);
} failureBlock:^(NSError * _Nullable error) {
}];
}
}
/**
* 这里与UI 协定 一张横向长图 每个帧 都是通过高度 来获取 正方形
* frameDurations 帧长
**/
+ (YYSpriteSheetImage *_Nullable)createSpriteSheet:(UIImage *_Nullable)image frameDurations:(CGFloat)frameDurations {
NSMutableArray *contentRects = [NSMutableArray new];
NSMutableArray *durations = [NSMutableArray new];
CGFloat imageHeight = image.size.height;
NSInteger spriteCount = image.size.width/imageHeight;
for (int i = 0; i < spriteCount; i++) {
CGRect rect;
rect.size = CGSizeMake(imageHeight, imageHeight);
rect.origin.x = imageHeight * i;
rect.origin.y = 0;
[contentRects addObject:[NSValue valueWithCGRect:rect]];
if (!frameDurations) {
frameDurations = kdeafultFrameDurations;
}
[durations addObject:@(frameDurations)];
}
YYSpriteSheetImage *sheetImage = [[YYSpriteSheetImage alloc] initWithSpriteSheetImage:image contentRects:contentRects frameDurations:durations loopCount:0];
return sheetImage;
}
- (NSString *)cacheURL:(NSURL *)url {
NSString *key = [self getUUid];
[self.parserQueue setObject:url forKey:key];
return key;
}
- (void)removeCacheWithKey:(NSString *)key {
[self.parserQueue removeObjectForKey:key];
}
- (NSString *)getUUid {
return [UIDevice currentDevice].identifierForVendor.UUIDString;
}
- (NSMutableDictionary *)parserQueue {
if (_parserQueue == nil) {
_parserQueue = [NSMutableDictionary dictionary];
}
return _parserQueue;
}
- (NSMutableDictionary *)retryCache {
if (_retryCache == nil) {
_retryCache = [NSMutableDictionary dictionary];
}
return _retryCache;
}
- (UIImageView *)operationImageView {
if (!_operationImageView) {
_operationImageView = [[UIImageView alloc] init];
}
return _operationImageView;
}
@end