// // KJBannerTool.m // KJBannerViewDemo // // Created by 杨科军 on 2019/7/30. // Copyright © 2019 杨科军. All rights reserved. // #import "KJBannerTool.h" #import @implementation KJBannerDatasInfo - (void)setImageUrl:(NSString *)imageUrl{ _imageUrl = imageUrl; switch (_superType) { case 0:{ // 混合,本地图片、网络图片、网络GIF //1.判断是本地还是网络 if ([KJBannerTool kj_bannerImageWithImageUrl:_imageUrl] == YES) { /// 本地图片 _type = KJBannerImageInfoTypeLocality; _image = [UIImage imageNamed:_imageUrl]; }else{ //2.判断是GIF还是网络图片 if ([KJBannerTool kj_bannerIsGifWithURL:_imageUrl] == YES) { _image = [KJBannerTool kj_bannerGetImageWithURL:_imageUrl]; _type = KJBannerImageInfoTypeGIFImage; }else{ //3.网络图片 _type = KJBannerImageInfoTypeNetIamge; } } } break; case 1:{ // 网络GIF和网络图片混合 if ([KJBannerTool kj_bannerIsGifWithURL:_imageUrl] == YES) { _image = [KJBannerTool kj_bannerGetImageWithURL:_imageUrl]; _type = KJBannerImageInfoTypeGIFImage; }else{ //3.网络图片 _type = KJBannerImageInfoTypeNetIamge; } } break; case 2:{ // 本地图片 _type = KJBannerImageInfoTypeLocality; _image = [UIImage imageNamed:_imageUrl]; } break; case 3:{ // 网络图片 _type = KJBannerImageInfoTypeNetIamge; } break; case 4:{ // 网络GIF图片 _image = [KJBannerTool kj_bannerGetImageWithURL:_imageUrl]; _type = KJBannerImageInfoTypeGIFImage; } break; default: break; } } #pragma mark - 内部方法 /// 本地GIF和本地图片 - (void)kj_ImageLociaWithURL:(NSString*)imageUrl{ //2.判断是否为本地的gif if ([KJBannerTool kj_bannerIsGifImageWithImageName:imageUrl] == NO) { } } @end @implementation KJBannerTool + (instancetype)sharedInstance { static dispatch_once_t onceToken; static id _sharedInstance; dispatch_once(&onceToken, ^{ _sharedInstance = [[self alloc] init]; }); return _sharedInstance; } /** 判断该字符串是不是一个有效的URL */ + (BOOL)kj_bannerValidUrl:(NSString*)url{ NSString *regex = @"[a-zA-z]+://[^\\s]*"; NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex]; return [urlTest evaluateWithObject:url]; } /** 根据图片名 判断是否是gif图 */ + (BOOL)kj_bannerIsGifImageWithImageName:(NSString*)imageName{ NSString *ext = imageName.pathExtension.lowercaseString; return [ext isEqualToString:@"gif"] ? YES : NO; } /** 根据图片url 判断是否是gif图 */ + (BOOL)kj_bannerIsGifWithURL:(id)url{ if (![url isKindOfClass:[NSURL class]]) { url = [NSURL URLWithString:url]; } NSData *data = [NSData dataWithContentsOfURL:url]; return [self contentTypeWithImageData:data] == KJBannerImageTypeGif ? YES : NO; } /// 根据image的data 判断图片类型 + (KJBannerImageType)contentTypeWithImageData:(NSData *)data { uint8_t c; [data getBytes:&c length:1]; switch (c) { case 0xFF: return KJBannerImageTypeJpeg; case 0x89: return KJBannerImageTypePng; case 0x47: return KJBannerImageTypeGif; case 0x49: case 0x4D: return KJBannerImageTypeTiff; case 0x52: if ([data length] < 12) return KJBannerImageTypeUnknown; NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) return KJBannerImageTypeWebp; return KJBannerImageTypeUnknown; } return KJBannerImageTypeUnknown; } /// 判断是网络图片还是本地 + (BOOL)kj_bannerImageWithImageUrl:(NSString*)imageUrl{ return ([imageUrl hasPrefix:@"http"] || [imageUrl hasPrefix:@"https"]) ? NO : YES; } /// 播放网络Gif + (NSTimeInterval)kj_bannerPlayGifWithImageView:(UIImageView*)imageView URL:(id)url{ if (![url isKindOfClass:[NSURL class]]) url = [NSURL URLWithString:url]; NSData *data = [NSData dataWithContentsOfURL:url]; CGImageSourceRef imageSource = CGImageSourceCreateWithData(CFBridgingRetain(data), nil); size_t imageCount = CGImageSourceGetCount(imageSource); NSMutableArray *images = [NSMutableArray array]; NSTimeInterval totalDuration = 0; for (int i = 0; i