MXNavigationBarManager.m 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. //
  2. // MXNavigationBarManager.m
  3. // MXBarManagerDemo
  4. //
  5. // Created by apple on 16/5/25.
  6. // Copyright © 2016年 desn. All rights reserved.
  7. //
  8. #import "MXNavigationBarManager.h"
  9. static const CGFloat kNavigationBarHeight = 64.0f;
  10. static const CGFloat kDefaultFullOffset = 200.0f;
  11. static const float kMaxAlphaValue = 0.995f;
  12. static const float kMinAlphaValue = 0.0f;
  13. static const float kDefaultAnimationTime = 0.35f;
  14. #define SCREEN_RECT [UIScreen mainScreen].bounds
  15. #define BACKGROUNDVIEW_FRAME CGRectMake(0, -20, CGRectGetWidth(SCREEN_RECT), kNavigationBarHeight)
  16. @interface MXNavigationBarManager ()
  17. @property (nonatomic, strong) UINavigationBar *selfNavigationBar;
  18. @property (nonatomic, strong) UINavigationController *selfNavigationController;
  19. @property (nonatomic, strong) UIImage *saveImage;
  20. @property (nonatomic, strong) UIColor *saveColor;
  21. @property (nonatomic, strong) UIColor *saveTintColor;
  22. @property (nonatomic, strong) NSDictionary *saveTitleAttribute;
  23. @property (nonatomic, assign) UIStatusBarStyle saveBarStyle;
  24. @property (nonatomic, assign) BOOL setFull;
  25. @property (nonatomic, assign) BOOL setZero;
  26. @property (nonatomic, assign) BOOL setChange;
  27. @end
  28. @implementation MXNavigationBarManager
  29. #pragma mark - property set
  30. + (void)setBarColor:(UIColor *)color {
  31. [self sharedManager].barColor = color;
  32. }
  33. + (void)setTintColor:(UIColor *)color {
  34. [self sharedManager].tintColor = color;
  35. [self sharedManager].selfNavigationBar.tintColor = color;
  36. [self setTitleColorWithColor:color];
  37. }
  38. + (void)setBackgroundImage:(UIImage *)image {
  39. [[self sharedManager].selfNavigationBar setBackgroundImage:image
  40. forBarMetrics:UIBarMetricsDefault];
  41. }
  42. + (void)setStatusBarStyle:(UIStatusBarStyle)style {
  43. [self sharedManager].statusBarStyle = style;
  44. [[UIApplication sharedApplication] setStatusBarStyle:style];
  45. }
  46. + (void)setZeroAlphaOffset:(float)offset {
  47. [self sharedManager].zeroAlphaOffset = offset;
  48. }
  49. + (void)setFullAlphaOffset:(float)offset {
  50. [self sharedManager].fullAlphaOffset = offset;
  51. }
  52. + (void)setMinAlphaValue:(float)value {
  53. value = value < kMinAlphaValue ? kMinAlphaValue : value;
  54. [self sharedManager].minAlphaValue = value;
  55. }
  56. + (void)setMaxAlphaValue:(float)value {
  57. value = value > kMaxAlphaValue ? kMaxAlphaValue : value;
  58. [self sharedManager].maxAlphaValue = value;
  59. }
  60. + (void)setFullAlphaTintColor:(UIColor *)color {
  61. [self sharedManager].fullAlphaTintColor = color;
  62. }
  63. + (void)setFullAlphaBarStyle:(UIStatusBarStyle)style {
  64. [self sharedManager].fullAlphaBarStyle = style;
  65. }
  66. + (void)setAllChange:(BOOL)allChange {
  67. [self sharedManager].allChange = allChange;
  68. }
  69. + (void)setReversal:(BOOL)reversal {
  70. [self sharedManager].reversal = reversal;
  71. }
  72. + (void)setContinues:(BOOL)continues {
  73. [self sharedManager].continues = continues;
  74. }
  75. + (void)reStoreToSystemNavigationBar {
  76. [[self sharedManager].selfNavigationController setValue:[UINavigationBar new] forKey:@"navigationBar"];
  77. }
  78. #pragma mark - Public Method
  79. + (void)managerWithController:(UIViewController *)viewController {
  80. UINavigationBar *navigationBar = viewController.navigationController.navigationBar;
  81. [self sharedManager].selfNavigationController = viewController.navigationController;
  82. [self sharedManager].selfNavigationBar = navigationBar;
  83. [navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
  84. [navigationBar setShadowImage:[UIImage new]];
  85. }
  86. + (void)changeAlphaWithCurrentOffset:(CGFloat)currentOffset {
  87. MXNavigationBarManager *manager = [self sharedManager];
  88. float currentAlpha = [self curretAlphaForOffset:currentOffset];
  89. if (![manager.barColor isEqual:[UIColor clearColor]]) {
  90. if (!manager.continues) {
  91. if (currentAlpha == manager.minAlphaValue) {
  92. [self setNavigationBarColorWithAlpha:manager.minAlphaValue];
  93. } else if (currentAlpha == manager.maxAlphaValue) {
  94. [UIView animateWithDuration:kDefaultAnimationTime animations:^{
  95. [self setNavigationBarColorWithAlpha:manager.maxAlphaValue];
  96. }];
  97. manager.setChange = YES;
  98. } else {
  99. if (manager.setChange) {
  100. [UIView animateWithDuration:kDefaultAnimationTime animations:^{
  101. [self setNavigationBarColorWithAlpha:manager.minAlphaValue];
  102. }];
  103. manager.setChange = NO;
  104. }
  105. }
  106. } else {
  107. [self setNavigationBarColorWithAlpha:currentAlpha];
  108. }
  109. }
  110. if (manager.allChange) [self changeTintColorWithOffset:currentAlpha];
  111. }
  112. #pragma mark - calculation
  113. + (float)curretAlphaForOffset:(CGFloat)offset {
  114. MXNavigationBarManager *manager = [self sharedManager];
  115. float currentAlpha = (offset - manager.zeroAlphaOffset) / (float)(manager.fullAlphaOffset - manager.zeroAlphaOffset);
  116. currentAlpha = currentAlpha < manager.minAlphaValue ? manager.minAlphaValue : (currentAlpha > manager.maxAlphaValue ? manager.maxAlphaValue : currentAlpha);
  117. currentAlpha = manager.reversal ? manager.maxAlphaValue + manager.minAlphaValue - currentAlpha : currentAlpha;
  118. return currentAlpha;
  119. }
  120. + (void)changeTintColorWithOffset:(float)currentAlpha {
  121. MXNavigationBarManager *manager = [self sharedManager];
  122. if (currentAlpha >= manager.maxAlphaValue && manager.fullAlphaTintColor != nil) {
  123. if (manager.setFull) {
  124. manager.setFull = NO;
  125. manager.setZero = YES;
  126. } else {
  127. if (manager.reversal) {
  128. manager.setFull = YES;
  129. }
  130. return;
  131. }
  132. manager.selfNavigationBar.tintColor = manager.fullAlphaTintColor;
  133. [self setTitleColorWithColor:manager.fullAlphaTintColor];
  134. [self setUIStatusBarStyle:manager.fullAlphaBarStyle];
  135. } else if (manager.tintColor != nil) {
  136. if (manager.setZero) {
  137. manager.setZero = NO;
  138. manager.setFull = YES;
  139. } else {
  140. return;
  141. }
  142. manager.selfNavigationBar.tintColor = manager.tintColor;
  143. [self setTitleColorWithColor:manager.tintColor];
  144. [self setUIStatusBarStyle:manager.statusBarStyle];
  145. }
  146. }
  147. #pragma mark - private method
  148. + (MXNavigationBarManager *)sharedManager {
  149. static MXNavigationBarManager *manager;
  150. static dispatch_once_t onceToken;
  151. dispatch_once(&onceToken, ^{
  152. manager = [[MXNavigationBarManager alloc] init];
  153. [self initBaseData:manager];
  154. });
  155. return manager;
  156. }
  157. + (void)initBaseData:(MXNavigationBarManager *)manager {
  158. manager.maxAlphaValue = kMaxAlphaValue;
  159. manager.minAlphaValue = kMinAlphaValue;
  160. manager.fullAlphaOffset = kDefaultFullOffset;
  161. manager.zeroAlphaOffset = -kNavigationBarHeight;
  162. manager.setZero = YES;
  163. manager.setFull = YES;
  164. manager.allChange = YES;
  165. manager.continues = YES;
  166. }
  167. + (void)setTitleColorWithColor:(UIColor *)color {
  168. NSMutableDictionary *textAttr = [NSMutableDictionary dictionaryWithDictionary:[self sharedManager].selfNavigationBar.titleTextAttributes];
  169. [textAttr setObject:color forKey:NSForegroundColorAttributeName];
  170. [self sharedManager].selfNavigationBar.titleTextAttributes = textAttr;
  171. }
  172. + (void)setNavigationBarColorWithAlpha:(float)alpha {
  173. MXNavigationBarManager *manager = [self sharedManager];
  174. NSLog(@"alpha = %f", alpha);
  175. [self setBackgroundImage:[self imageWithColor:[manager.barColor colorWithAlphaComponent:alpha]]];
  176. }
  177. + (void)setUIStatusBarStyle:(UIStatusBarStyle)style {
  178. [[UIApplication sharedApplication] setStatusBarStyle:style];
  179. }
  180. + (UIImage *)imageWithColor:(UIColor *)color {
  181. CGRect rect = CGRectMake(0, 0, 1, 1);
  182. UIGraphicsBeginImageContext(rect.size);
  183. CGContextRef context = UIGraphicsGetCurrentContext();
  184. [color setFill];
  185. CGContextFillRect(context, rect);
  186. UIImage *imgae = UIGraphicsGetImageFromCurrentImageContext();
  187. UIGraphicsEndImageContext();
  188. return imgae;
  189. }
  190. @end