YBIBIconManager.m 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //
  2. // YBIBIconManager.m
  3. // YBImageBrowserDemo
  4. //
  5. // Created by 波儿菜 on 2018/8/29.
  6. // Copyright © 2018年 波儿菜. All rights reserved.
  7. //
  8. #import "YBIBIconManager.h"
  9. // The best order for path scale search.
  10. static NSArray *_NSBundlePreferredScales() {
  11. static NSArray *scales;
  12. static dispatch_once_t onceToken;
  13. dispatch_once(&onceToken, ^{
  14. CGFloat screenScale = [UIScreen mainScreen].scale;
  15. if (screenScale <= 1) {
  16. scales = @[@1,@2,@3];
  17. } else if (screenScale <= 2) {
  18. scales = @[@2,@3,@1];
  19. } else {
  20. scales = @[@3,@2,@1];
  21. }
  22. });
  23. return scales;
  24. }
  25. // Add scale modifier to the file name (without path extension), from @"name" to @"name@2x".
  26. static NSString *_NSStringByAppendingNameScale(NSString *string, CGFloat scale) {
  27. if (!string) return nil;
  28. if (fabs(scale - 1) <= __FLT_EPSILON__ || string.length == 0 || [string hasSuffix:@"/"]) return string.copy;
  29. return [string stringByAppendingFormat:@"@%@x", @(scale)];
  30. }
  31. @implementation UIImage (YBImageBrowser)
  32. + (instancetype)ybib_imageNamed:(NSString *)name bundle:(NSBundle *)bundle {
  33. if (name.length == 0) return nil;
  34. if ([name hasSuffix:@"/"]) return nil;
  35. NSString *res = name.stringByDeletingPathExtension;
  36. NSString *ext = name.pathExtension;
  37. NSString *path = nil;
  38. CGFloat scale = 1;
  39. // If no extension, guess by system supported (same as UIImage).
  40. NSArray *exts = ext.length > 0 ? @[ext] : @[@"", @"png", @"jpeg", @"jpg", @"gif", @"webp", @"apng"];
  41. NSArray *scales = _NSBundlePreferredScales();
  42. for (int s = 0; s < scales.count; s++) {
  43. scale = ((NSNumber *)scales[s]).floatValue;
  44. NSString *scaledName = _NSStringByAppendingNameScale(res, scale);
  45. for (NSString *e in exts) {
  46. path = [bundle pathForResource:scaledName ofType:e];
  47. if (path) break;
  48. }
  49. if (path) break;
  50. }
  51. if (path.length == 0) {
  52. // Assets.xcassets supported.
  53. return [self imageNamed:name];
  54. }
  55. NSData *data = [NSData dataWithContentsOfFile:path];
  56. if (data.length == 0) return nil;
  57. return [[self alloc] initWithData:data scale:scale];
  58. }
  59. @end
  60. NSBundle *YBIBDefaultBundle(void) {
  61. static NSBundle *bundle = nil;
  62. static dispatch_once_t onceToken;
  63. dispatch_once(&onceToken, ^{
  64. NSBundle *_bundle = [NSBundle bundleForClass:NSClassFromString(@"YBImageBrowser")];
  65. NSString *path = [_bundle pathForResource:@"YBImageBrowser" ofType:@"bundle"];
  66. bundle = [NSBundle bundleWithPath:path];
  67. });
  68. return bundle;
  69. }
  70. NSBundle *YBIBVideoBundle(void) {
  71. static NSBundle *bundle = nil;
  72. static dispatch_once_t onceToken;
  73. dispatch_once(&onceToken, ^{
  74. NSBundle *_bundle = [NSBundle bundleForClass:NSClassFromString(@"YBImageBrowser")];
  75. NSString *path = [_bundle pathForResource:@"YBImageBrowserVideo" ofType:@"bundle"];
  76. bundle = [NSBundle bundleWithPath:path];
  77. });
  78. return bundle;
  79. }
  80. @implementation YBIBIconManager
  81. + (instancetype)sharedManager {
  82. static YBIBIconManager *manager = nil;
  83. static dispatch_once_t onceToken;
  84. dispatch_once(&onceToken, ^{
  85. manager = [YBIBIconManager new];
  86. });
  87. return manager;
  88. }
  89. - (instancetype)init {
  90. self = [super init];
  91. if (self) {
  92. _loadingImage = ^UIImage * _Nullable{
  93. return [UIImage ybib_imageNamed:@"ybib_loading" bundle:YBIBDefaultBundle()];
  94. };
  95. _toolSaveImage = ^UIImage * _Nullable{
  96. return [UIImage ybib_imageNamed:@"ybib_save" bundle:YBIBDefaultBundle()];
  97. };
  98. _toolMoreImage = ^UIImage * _Nullable{
  99. return [UIImage ybib_imageNamed:@"ybib_more" bundle:YBIBDefaultBundle()];
  100. };
  101. _videoPlayImage = ^UIImage * _Nullable{
  102. return [UIImage ybib_imageNamed:@"ybib_play" bundle:YBIBVideoBundle()];
  103. };
  104. _videoPauseImage = ^UIImage * _Nullable{
  105. return [UIImage ybib_imageNamed:@"ybib_pause" bundle:YBIBVideoBundle()];
  106. };
  107. _videoCancelImage = ^UIImage * _Nullable{
  108. return [UIImage ybib_imageNamed:@"ybib_cancel" bundle:YBIBVideoBundle()];
  109. };
  110. _videoBigPlayImage = ^UIImage * _Nullable{
  111. return [UIImage ybib_imageNamed:@"ybib_bigPlay" bundle:YBIBVideoBundle()];
  112. };
  113. _videoDragCircleImage = ^UIImage * _Nullable{
  114. return [UIImage ybib_imageNamed:@"ybib_circlePoint" bundle:YBIBVideoBundle()];
  115. };
  116. }
  117. return self;
  118. }
  119. @end