/Pods/ChameleonFramework/Pod/Classes/Objective-C/Chameleon_.m

https://gitlab.com/yangle1111/knoware · Objective C · 793 lines · 615 code · 130 blank · 48 comment · 44 complexity · b8e1c534f1e69f2dab59135c25193db6 MD5 · raw file

  1. //
  2. // ChameleonInternal.m
  3. // Chameleon
  4. //
  5. // Created by Vicc Alexander on 6/4/15.
  6. // Copyright (c) 2015 Vicc Alexander. All rights reserved.
  7. //
  8. #import "Chameleon_.h"
  9. #import "UILabel+Chameleon.h"
  10. #import "UIButton+Chameleon.h"
  11. #import "UIAppearance+Swift.h"
  12. @implementation Chameleon
  13. #pragma GCC diagnostic push
  14. #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
  15. + (void)setGlobalThemeUsingPrimaryColor:(UIColor *)primaryColor
  16. withContentStyle:(UIContentStyle)contentStyle {
  17. if (contentStyle == UIContentStyleContrast) {
  18. if ([ContrastColor(primaryColor, YES) isEqual:FlatWhite]) {
  19. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
  20. } else {
  21. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
  22. }
  23. } else if (contentStyle == UIContentStyleLight) {
  24. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
  25. } else {
  26. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
  27. }
  28. [[self class] customizeBarButtonItemWithPrimaryColor:primaryColor contentStyle:contentStyle];
  29. [[self class] customizeButtonWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  30. [[self class] customizeNavigationBarWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  31. [[self class] customizePageControlWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  32. [[self class] customizeProgressViewWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  33. [[self class] customizeSearchBarWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  34. [[self class] customizeSegmentedControlWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  35. [[self class] customizeSliderWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  36. [[self class] customizeStepperWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  37. [[self class] customizeSwitchWithPrimaryColor:primaryColor];
  38. [[self class] customizeTabBarWithBarTintColor:FlatWhite andTintColor:primaryColor];
  39. [[self class] customizeToolbarWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  40. [[self class] customizeImagePickerControllerWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  41. }
  42. + (void)setGlobalThemeUsingPrimaryColor:(UIColor *)primaryColor
  43. withSecondaryColor:(UIColor *)secondaryColor
  44. andContentStyle:(UIContentStyle)contentStyle {
  45. if (contentStyle == UIContentStyleContrast) {
  46. if ([ContrastColor(primaryColor, YES) isEqual:FlatWhite]) {
  47. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
  48. } else {
  49. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
  50. }
  51. } else if (contentStyle == UIContentStyleLight) {
  52. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
  53. } else {
  54. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
  55. }
  56. [[self class] customizeBarButtonItemWithPrimaryColor:primaryColor contentStyle:contentStyle];
  57. [[self class] customizeButtonWithPrimaryColor:primaryColor secondaryColor:secondaryColor withContentStyle:contentStyle];
  58. [[self class] customizeNavigationBarWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  59. [[self class] customizePageControlWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  60. [[self class] customizeProgressViewWithPrimaryColor:primaryColor andSecondaryColor:secondaryColor];
  61. [[self class] customizeSearchBarWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  62. [[self class] customizeSegmentedControlWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  63. [[self class] customizeSliderWithPrimaryColor:primaryColor andSecondaryColor:secondaryColor];
  64. [[self class] customizeStepperWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  65. [[self class] customizeSwitchWithPrimaryColor:primaryColor andSecondaryColor:secondaryColor];
  66. [[self class] customizeTabBarWithBarTintColor:FlatWhite andTintColor:primaryColor];
  67. [[self class] customizeToolbarWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  68. [[self class] customizeImagePickerControllerWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  69. }
  70. + (void)setGlobalThemeUsingPrimaryColor:(UIColor *)primaryColor
  71. withSecondaryColor:(UIColor *)secondaryColor
  72. usingFontName:(NSString *)fontName
  73. andContentStyle:(UIContentStyle)contentStyle {
  74. if (contentStyle == UIContentStyleContrast) {
  75. if ([ContrastColor(primaryColor, YES) isEqual:FlatWhite]) {
  76. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
  77. } else {
  78. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
  79. }
  80. } else if (contentStyle == UIContentStyleLight) {
  81. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
  82. } else {
  83. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
  84. }
  85. [[UILabel appearance] setSubstituteFontName:fontName];
  86. [[UIButton appearance] setSubstituteFontName:fontName];
  87. [[self class] customizeNavigationBarWithBarColor:primaryColor textColor:ContrastColor(primaryColor, YES) fontName:fontName fontSize:20 buttonColor:ContrastColor(primaryColor, YES)];
  88. [[self class] customizeBarButtonItemWithPrimaryColor:primaryColor fontName:fontName fontSize:18 contentStyle:contentStyle];
  89. [[self class] customizeSegmentedControlWithPrimaryColor:primaryColor withFontName:fontName withFontSize:14 withContentStyle:contentStyle];
  90. [[self class] customizeButtonWithPrimaryColor:primaryColor secondaryColor:secondaryColor withContentStyle:contentStyle];
  91. [[self class] customizePageControlWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  92. [[self class] customizeProgressViewWithPrimaryColor:primaryColor andSecondaryColor:secondaryColor];
  93. [[self class] customizeSearchBarWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  94. [[self class] customizeSliderWithPrimaryColor:primaryColor andSecondaryColor:secondaryColor];
  95. [[self class] customizeStepperWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  96. [[self class] customizeSwitchWithPrimaryColor:primaryColor andSecondaryColor:secondaryColor];
  97. [[self class] customizeTabBarWithBarTintColor:FlatWhite andTintColor:primaryColor];
  98. [[self class] customizeToolbarWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  99. [[self class] customizeImagePickerControllerWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  100. /*
  101. if (contentStyle == UIContentStyleContrast) {
  102. if ([ContrastColor(primaryColor, YES) isEqual:FlatWhite]) {
  103. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
  104. } else {
  105. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
  106. }
  107. } else if (contentStyle == UIContentStyleLight) {
  108. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
  109. } else {
  110. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
  111. }
  112. [[self class] customizeBarButtonItemWithPrimaryColor:primaryColor fontName:fontName fontSize:18 contentStyle:contentStyle];
  113. [[self class] customizeButtonWithPrimaryColor:primaryColor fontName:fontName fontSize:17 contentStyle:contentStyle];
  114. [[self class] customizeLabelWithPrimaryColor:primaryColor fontName:fontName fontSize:18 withContentStyle:contentStyle];
  115. [[self class] customizePageControlWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  116. [[self class] customizeProgressViewWithPrimaryColor:primaryColor andSecondaryColor:secondaryColor];
  117. [[self class] customizeSearchBarWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  118. [[self class] customizeSliderWithPrimaryColor:primaryColor andSecondaryColor:secondaryColor];
  119. [[self class] customizeStepperWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  120. [[self class] customizeSwitchWithPrimaryColor:primaryColor andSecondaryColor:secondaryColor];
  121. [[self class] customizeTabBarWithBarTintColor:FlatWhite tintColor:primaryColor fontName:fontName fontSize:11];
  122. [[self class] customizeToolbarWithPrimaryColor:primaryColor withContentStyle:contentStyle];
  123. */
  124. }
  125. #pragma mark - UIBarButtonItem
  126. + (void)customizeBarButtonItemWithPrimaryColor:(UIColor *)primaryColor
  127. contentStyle:(UIContentStyle)contentStyle {
  128. UIColor *contentColor;
  129. switch (contentStyle) {
  130. case UIContentStyleContrast: {
  131. contentColor = ContrastColor(primaryColor, NO);
  132. break;
  133. }
  134. case UIContentStyleLight: {
  135. contentColor = [UIColor whiteColor];
  136. break;
  137. }
  138. case UIContentStyleDark: {
  139. contentColor = FlatBlackDark;
  140. break;
  141. }
  142. default: {
  143. contentColor = ContrastColor(primaryColor, NO);
  144. break;
  145. }
  146. }
  147. [[UIBarButtonItem appearance] setTintColor:primaryColor];
  148. [[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:contentColor];
  149. [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:contentColor];
  150. [[UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], nil] setTintColor:contentColor];
  151. }
  152. + (void)customizeBarButtonItemWithPrimaryColor:(UIColor *)primaryColor
  153. fontName:(NSString *)fontName
  154. fontSize:(float)fontSize
  155. contentStyle:(UIContentStyle)contentStyle {
  156. UIColor *contentColor;
  157. switch (contentStyle) {
  158. case UIContentStyleContrast: {
  159. contentColor = ContrastColor(primaryColor, NO);
  160. break;
  161. }
  162. case UIContentStyleLight: {
  163. contentColor = [UIColor whiteColor];
  164. break;
  165. }
  166. case UIContentStyleDark: {
  167. contentColor = FlatBlackDark;
  168. break;
  169. }
  170. default: {
  171. contentColor = ContrastColor(primaryColor, NO);
  172. break;
  173. }
  174. }
  175. [[UIBarButtonItem appearance] setTintColor:primaryColor];
  176. [[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:contentColor];
  177. [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:contentColor];
  178. [[UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], nil] setTintColor:contentColor];
  179. if ([UIFont fontWithName:fontName size:fontSize]) {
  180. [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:@{ NSForegroundColorAttributeName:contentColor,
  181. NSFontAttributeName:[UIFont fontWithName:fontName size:fontSize]} forState:UIControlStateNormal];
  182. }
  183. }
  184. #pragma mark - UIButton
  185. + (void)customizeButtonWithPrimaryColor:(UIColor *)primaryColor
  186. withContentStyle:(UIContentStyle)contentStyle {
  187. UIColor *contentColor;
  188. switch (contentStyle) {
  189. case UIContentStyleContrast: {
  190. contentColor = ContrastColor(primaryColor, NO);
  191. break;
  192. }
  193. case UIContentStyleLight: {
  194. contentColor = [UIColor whiteColor];
  195. break;
  196. }
  197. case UIContentStyleDark: {
  198. contentColor = FlatBlackDark;
  199. break;
  200. }
  201. default: {
  202. contentColor = ContrastColor(primaryColor, NO);
  203. break;
  204. }
  205. }
  206. [[UIButton appearance] setTintColor:contentColor];
  207. [[UIButton appearance] setBackgroundColor:primaryColor];
  208. [[UIButton appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:contentColor];
  209. [[UIButton appearanceWhenContainedIn:[UISearchBar class], nil] setBackgroundColor:ClearColor];
  210. [[UIButton appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:contentColor];
  211. [[UIButton appearanceWhenContainedIn:[UINavigationBar class], nil] setBackgroundColor:ClearColor];
  212. [[UIButton appearanceWhenContainedIn:[UIToolbar class], nil] setTintColor:contentColor];
  213. [[UIButton appearanceWhenContainedIn:[UIToolbar class], nil] setBackgroundColor:ClearColor];
  214. [[UIButton appearanceWhenContainedIn:[UIStepper class], nil] setTintColor:primaryColor];
  215. [[UIButton appearanceWhenContainedIn:[UIStepper class], nil] setBackgroundColor:ClearColor];
  216. [[UIButton appearance] setTitleShadowColor:ClearColor forState:UIControlStateNormal];
  217. }
  218. + (void)customizeButtonWithPrimaryColor:(UIColor *)primaryColor
  219. secondaryColor:(UIColor *)secondaryColor
  220. withContentStyle:(UIContentStyle)contentStyle {
  221. UIColor *contentColor;
  222. UIColor *secondaryContentColor;
  223. switch (contentStyle) {
  224. case UIContentStyleContrast: {
  225. contentColor = ContrastColor(primaryColor, NO);
  226. secondaryContentColor = ContrastColor(secondaryColor, NO);
  227. break;
  228. }
  229. case UIContentStyleLight: {
  230. contentColor = [UIColor whiteColor];
  231. secondaryContentColor = [UIColor whiteColor];
  232. break;
  233. }
  234. case UIContentStyleDark: {
  235. contentColor = FlatBlackDark;
  236. secondaryContentColor = FlatBlackDark;
  237. break;
  238. }
  239. default: {
  240. contentColor = ContrastColor(primaryColor, NO);
  241. secondaryContentColor = ContrastColor(secondaryColor, NO);
  242. break;
  243. }
  244. }
  245. [[UIButton appearance] setTintColor:secondaryContentColor];
  246. [[UIButton appearance] setBackgroundColor:secondaryColor];
  247. [[UIButton appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:contentColor];
  248. [[UIButton appearanceWhenContainedIn:[UISearchBar class], nil] setBackgroundColor:ClearColor];
  249. [[UIButton appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:contentColor];
  250. [[UIButton appearanceWhenContainedIn:[UINavigationBar class], nil] setBackgroundColor:ClearColor];
  251. [[UIButton appearanceWhenContainedIn:[UIToolbar class], nil] setTintColor:contentColor];
  252. [[UIButton appearanceWhenContainedIn:[UIToolbar class], nil] setBackgroundColor:ClearColor];
  253. [[UIButton appearanceWhenContainedIn:[UIStepper class], nil] setTintColor:primaryColor];
  254. [[UIButton appearanceWhenContainedIn:[UIStepper class], nil] setBackgroundColor:ClearColor];
  255. [[UIButton appearance] setTitleShadowColor:ClearColor forState:UIControlStateNormal];
  256. }
  257. #pragma mark - UIImagePickerController
  258. + (void)customizeImagePickerControllerWithPrimaryColor:(UIColor *)primaryColor withContentStyle:(UIContentStyle)contentStyle {
  259. UIColor *contentColor;
  260. switch (contentStyle) {
  261. case UIContentStyleContrast: {
  262. contentColor = ContrastColor(primaryColor, NO);
  263. break;
  264. }
  265. case UIContentStyleLight: {
  266. contentColor = [UIColor whiteColor];
  267. break;
  268. }
  269. case UIContentStyleDark: {
  270. contentColor = FlatBlackDark;
  271. break;
  272. }
  273. default: {
  274. contentColor = ContrastColor(primaryColor, NO);
  275. break;
  276. }
  277. }
  278. //Workaround for Swift http://stackoverflow.com/a/28765193
  279. [[UIButton appearanceWhenContainedWithin:@[[UIView class],[UIImagePickerController class]]] setBackgroundColor:ClearColor];
  280. [[UIButton appearanceWhenContainedWithin:@[[UIView class],[UIImagePickerController class]]] setTintColor:ClearColor];
  281. [[UIButton appearanceWhenContainedWithin:@[[UINavigationBar class],[UIImagePickerController class]]] setBackgroundColor:ClearColor];
  282. [[UIButton appearanceWhenContainedWithin:@[[UINavigationBar class],[UIImagePickerController class]]] setTintColor:contentColor];
  283. [[UIButton appearanceWhenContainedWithin:@[[UITableViewCell class],[UIImagePickerController class]]] setBackgroundColor:ClearColor];
  284. //[[UIButton appearanceWhenContainedInInstancesOfClasses:@[[UIView class],[UIImagePickerController class]]] setBackgroundColor:ClearColor];
  285. //[[UIButton appearanceWhenContainedInInstancesOfClasses:@[[UIView class],[UIImagePickerController class]]] setTintColor:contentColor];
  286. //[[UIButton appearanceWhenContainedInInstancesOfClasses:@[[UINavigationBar class],[UIImagePickerController class]]] setBackgroundColor:ClearColor];
  287. //[[UIButton appearanceWhenContainedInInstancesOfClasses:@[[UINavigationBar class],[UIImagePickerController class]]] setTintColor:contentColor];
  288. //[[UIButton appearanceWhenContainedInInstancesOfClasses:@[[UITableViewCell class],[UIImagePickerController class]]] setBackgroundColor:ClearColor];
  289. }
  290. #pragma mark - UILabel
  291. + (void)customizeLabelWithPrimaryColor:(UIColor *)primaryColor
  292. fontName:(NSString *)fontName
  293. fontSize:(CGFloat)fontSize
  294. withContentStyle:(UIContentStyle)contentStyle {
  295. UIColor *contentColor;
  296. switch (contentStyle) {
  297. case UIContentStyleContrast: {
  298. contentColor = ContrastColor(primaryColor, NO);
  299. break;
  300. }
  301. case UIContentStyleLight: {
  302. contentColor = [UIColor whiteColor];
  303. break;
  304. }
  305. case UIContentStyleDark: {
  306. contentColor = FlatBlackDark;
  307. break;
  308. }
  309. default: {
  310. contentColor = ContrastColor(primaryColor, NO);
  311. break;
  312. }
  313. }
  314. [[UILabel appearanceWhenContainedIn:[UINavigationBar class], nil] setTextColor:contentColor];
  315. [[UILabel appearanceWhenContainedIn:[UIToolbar class], nil] setTextColor:contentColor];
  316. UIFont *font = [UIFont fontWithName:fontName size:fontSize];
  317. if (font) {
  318. [[UILabel appearance] setFont:[UIFont fontWithName:fontName size:fontSize]];
  319. [[UILabel appearanceWhenContainedIn:[UITextField class], nil] setFont:[UIFont fontWithName:fontName size:14]];
  320. [[UILabel appearanceWhenContainedIn:[UIButton class], nil] setFont:[UIFont fontWithName:fontName size:18]];
  321. }
  322. }
  323. #pragma mark - UINavigationBar
  324. + (void)customizeNavigationBarWithPrimaryColor:(UIColor *)primaryColor
  325. withContentStyle:(UIContentStyle)contentStyle {
  326. UIColor *contentColor;
  327. switch (contentStyle) {
  328. case UIContentStyleContrast: {
  329. contentColor = ContrastColor(primaryColor, NO);
  330. break;
  331. }
  332. case UIContentStyleLight: {
  333. contentColor = [UIColor whiteColor];
  334. break;
  335. }
  336. case UIContentStyleDark: {
  337. contentColor = FlatBlackDark;
  338. break;
  339. }
  340. default: {
  341. contentColor = ContrastColor(primaryColor, NO);
  342. break;
  343. }
  344. }
  345. [[UINavigationBar appearance] setBarTintColor:primaryColor];
  346. [[UINavigationBar appearance] setTintColor:contentColor];
  347. [[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:contentColor}];
  348. [[UINavigationBar appearance] setShadowImage:[UIImage new]];
  349. // [[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
  350. }
  351. + (void)customizeNavigationBarWithBarColor:(UIColor *)barColor
  352. textColor:(UIColor *)textColor
  353. buttonColor:(UIColor *)buttonColor {
  354. [[UINavigationBar appearance] setBarTintColor:barColor];
  355. [[UINavigationBar appearance] setTintColor:buttonColor];
  356. [[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:textColor}];
  357. [[UINavigationBar appearance] setShadowImage:[UIImage new]];
  358. // [[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
  359. }
  360. + (void)customizeNavigationBarWithBarColor:(UIColor *)barColor
  361. textColor:(UIColor *)textColor
  362. fontName:(NSString *)fontName
  363. fontSize:(CGFloat)fontSize
  364. buttonColor:(UIColor *)buttonColor {
  365. [[UINavigationBar appearance] setBarTintColor:barColor];
  366. [[UINavigationBar appearance] setTintColor:buttonColor];
  367. [[UINavigationBar appearance] setShadowImage:[UIImage new]];
  368. // [[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
  369. if ([UIFont fontWithName:fontName size:fontSize]) {
  370. [[UINavigationBar appearance] setTitleTextAttributes:@{ NSForegroundColorAttributeName:textColor, NSFontAttributeName:[UIFont fontWithName:fontName size:fontSize] }];
  371. }
  372. }
  373. #pragma mark - UIPageControl
  374. + (void)customizePageControlWithPrimaryColor:(UIColor *)primaryColor
  375. withContentStyle:(UIContentStyle)contentStyle {
  376. UIColor *contentColor;
  377. switch (contentStyle) {
  378. case UIContentStyleContrast: {
  379. contentColor = ContrastColor(primaryColor, NO);
  380. break;
  381. }
  382. case UIContentStyleLight: {
  383. contentColor = [UIColor whiteColor];
  384. break;
  385. }
  386. case UIContentStyleDark: {
  387. contentColor = FlatBlackDark;
  388. break;
  389. }
  390. default: {
  391. contentColor = ContrastColor(primaryColor, NO);
  392. break;
  393. }
  394. }
  395. [[UIPageControl appearance] setCurrentPageIndicatorTintColor:primaryColor];
  396. [[UIPageControl appearance] setPageIndicatorTintColor:[primaryColor colorWithAlphaComponent:0.4]];
  397. [[UIPageControl appearanceWhenContainedIn:[UINavigationBar class], nil] setCurrentPageIndicatorTintColor:contentColor];
  398. [[UIPageControl appearanceWhenContainedIn:[UINavigationBar class], nil] setPageIndicatorTintColor:[contentColor colorWithAlphaComponent:0.4]];
  399. [[UIPageControl appearanceWhenContainedIn:[UIToolbar class], nil] setCurrentPageIndicatorTintColor:contentColor];
  400. [[UIPageControl appearanceWhenContainedIn:[UIToolbar class], nil] setPageIndicatorTintColor:[contentColor colorWithAlphaComponent:0.4]];
  401. }
  402. #pragma mark - UIProgressView
  403. + (void)customizeProgressViewWithPrimaryColor:(UIColor *)primaryColor
  404. withContentStyle:(UIContentStyle)contentStyle {
  405. UIColor *contentColor;
  406. switch (contentStyle) {
  407. case UIContentStyleContrast: {
  408. contentColor = ContrastColor(primaryColor, NO);
  409. break;
  410. }
  411. case UIContentStyleLight: {
  412. contentColor = [UIColor whiteColor];
  413. break;
  414. }
  415. case UIContentStyleDark: {
  416. contentColor = FlatBlackDark;
  417. break;
  418. }
  419. default: {
  420. contentColor = ContrastColor(primaryColor, NO);
  421. break;
  422. }
  423. }
  424. [[UIProgressView appearance] setProgressTintColor:primaryColor];
  425. [[UIProgressView appearanceWhenContainedIn:[UINavigationBar class], nil] setProgressTintColor:contentColor];
  426. [[UIProgressView appearanceWhenContainedIn:[UIToolbar class], nil] setProgressTintColor:contentColor];
  427. [[UIProgressView appearance] setTrackTintColor:[UIColor lightGrayColor]];
  428. [[UIProgressView appearanceWhenContainedIn:[UINavigationBar class], nil] setTrackTintColor:[[primaryColor darkenByPercentage:0.25] flatten]];
  429. [[UIProgressView appearanceWhenContainedIn:[UIToolbar class], nil] setTrackTintColor:[[primaryColor darkenByPercentage:0.25] flatten]];
  430. }
  431. + (void)customizeProgressViewWithPrimaryColor:(UIColor *)primaryColor
  432. andSecondaryColor:(UIColor *)secondaryColor {
  433. [[UIProgressView appearance] setProgressTintColor:secondaryColor];
  434. [[UIProgressView appearanceWhenContainedIn:[UINavigationBar class], nil] setProgressTintColor:secondaryColor];
  435. [[UIProgressView appearanceWhenContainedIn:[UIToolbar class], nil] setProgressTintColor:secondaryColor];
  436. [[UIProgressView appearance] setTrackTintColor:[UIColor lightGrayColor]];
  437. [[UIProgressView appearanceWhenContainedIn:[UINavigationBar class], nil] setTrackTintColor:[[primaryColor darkenByPercentage:0.25] flatten]];
  438. [[UIProgressView appearanceWhenContainedIn:[UIToolbar class], nil] setTrackTintColor:[[primaryColor darkenByPercentage:0.25] flatten]];
  439. }
  440. #pragma mark - UISearchBar
  441. + (void)customizeSearchBarWithPrimaryColor:(UIColor *)primaryColor withContentStyle:(UIContentStyle)contentStyle {
  442. UIColor *contentColor;
  443. switch (contentStyle) {
  444. case UIContentStyleContrast: {
  445. contentColor = ContrastColor(primaryColor, NO);
  446. break;
  447. }
  448. case UIContentStyleLight: {
  449. contentColor = [UIColor whiteColor];
  450. break;
  451. }
  452. case UIContentStyleDark: {
  453. contentColor = FlatBlackDark;
  454. break;
  455. }
  456. default: {
  457. contentColor = ContrastColor(primaryColor, NO);
  458. break;
  459. }
  460. }
  461. [[UISearchBar appearance] setBarTintColor:primaryColor];
  462. [[UISearchBar appearance] setBackgroundColor:primaryColor];
  463. [[UISearchBar appearance] setTintColor:contentColor];
  464. [[UISearchBar appearance] setBackgroundImage:[UIImage new] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
  465. }
  466. #pragma mark - UISegmentedControl
  467. + (void)customizeSegmentedControlWithPrimaryColor:(UIColor *)primaryColor
  468. withContentStyle:(UIContentStyle)contentStyle {
  469. UIColor *contentColor;
  470. switch (contentStyle) {
  471. case UIContentStyleContrast: {
  472. contentColor = ContrastColor(primaryColor, NO);
  473. break;
  474. }
  475. case UIContentStyleLight: {
  476. contentColor = [UIColor whiteColor];
  477. break;
  478. }
  479. case UIContentStyleDark: {
  480. contentColor = FlatBlackDark;
  481. break;
  482. }
  483. default: {
  484. contentColor = ContrastColor(primaryColor, NO);
  485. break;
  486. }
  487. }
  488. [[UISegmentedControl appearance] setTintColor:primaryColor];
  489. [[UISegmentedControl appearanceWhenContainedIn:[UINavigationBar class], nil]
  490. setTintColor:contentColor];
  491. [[UISegmentedControl appearanceWhenContainedIn:[UIToolbar class], nil]
  492. setTintColor:contentColor];
  493. }
  494. + (void)customizeSegmentedControlWithPrimaryColor:(UIColor *)primaryColor
  495. withFontName:(NSString *)fontName
  496. withFontSize:(CGFloat)fontSize
  497. withContentStyle:(UIContentStyle)contentStyle {
  498. UIColor *contentColor;
  499. switch (contentStyle) {
  500. case UIContentStyleContrast: {
  501. contentColor = ContrastColor(primaryColor, NO);
  502. break;
  503. }
  504. case UIContentStyleLight: {
  505. contentColor = [UIColor whiteColor];
  506. break;
  507. }
  508. case UIContentStyleDark: {
  509. contentColor = FlatBlackDark;
  510. break;
  511. }
  512. default: {
  513. contentColor = ContrastColor(primaryColor, NO);
  514. break;
  515. }
  516. }
  517. [[UISegmentedControl appearance] setTintColor:primaryColor];
  518. [[UISegmentedControl appearanceWhenContainedIn:[UINavigationBar class], nil]
  519. setTintColor:contentColor];
  520. [[UISegmentedControl appearanceWhenContainedIn:[UIToolbar class], nil]
  521. setTintColor:contentColor];
  522. UIFont *font = [UIFont fontWithName:fontName size:fontSize];
  523. if (font) {
  524. [[UISegmentedControl appearance] setTitleTextAttributes:@{NSFontAttributeName:font}
  525. forState:UIControlStateNormal];
  526. }
  527. }
  528. #pragma mark - UISlider
  529. + (void)customizeSliderWithPrimaryColor:(UIColor *)primaryColor
  530. withContentStyle:(UIContentStyle)contentStyle {
  531. UIColor *contentColor;
  532. switch (contentStyle) {
  533. case UIContentStyleContrast: {
  534. contentColor = ContrastColor(primaryColor, NO);
  535. break;
  536. }
  537. case UIContentStyleLight: {
  538. contentColor = [UIColor whiteColor];
  539. break;
  540. }
  541. case UIContentStyleDark: {
  542. contentColor = FlatBlackDark;
  543. break;
  544. }
  545. default: {
  546. contentColor = ContrastColor(primaryColor, NO);
  547. break;
  548. }
  549. }
  550. [[UISlider appearance] setMinimumTrackTintColor:primaryColor];
  551. [[UISlider appearanceWhenContainedIn:[UINavigationBar class], nil] setMinimumTrackTintColor:contentColor];
  552. [[UISlider appearanceWhenContainedIn:[UIToolbar class], nil] setMinimumTrackTintColor:contentColor];
  553. [[UISlider appearance] setMaximumTrackTintColor:[UIColor lightGrayColor]];
  554. [[UISlider appearanceWhenContainedIn:[UINavigationBar class], nil] setMaximumTrackTintColor:[[primaryColor darkenByPercentage:0.25] flatten]];
  555. [[UISlider appearanceWhenContainedIn:[UIToolbar class], nil] setMaximumTrackTintColor:[[primaryColor darkenByPercentage:0.25] flatten]];
  556. [[UISlider appearance] setThumbTintColor:primaryColor];
  557. [[UISlider appearanceWhenContainedIn:[UIToolbar class], nil] setThumbTintColor:contentColor];
  558. }
  559. + (void)customizeSliderWithPrimaryColor:(UIColor *)primaryColor
  560. andSecondaryColor:(UIColor *)secondaryColor {
  561. [[UISlider appearance] setMinimumTrackTintColor:secondaryColor];
  562. [[UISlider appearanceWhenContainedIn:[UINavigationBar class], nil] setMinimumTrackTintColor:secondaryColor];
  563. [[UISlider appearanceWhenContainedIn:[UIToolbar class], nil] setMinimumTrackTintColor:secondaryColor];
  564. [[UISlider appearance] setMaximumTrackTintColor:[UIColor lightGrayColor]];
  565. [[UISlider appearanceWhenContainedIn:[UINavigationBar class], nil] setMaximumTrackTintColor:[[primaryColor darkenByPercentage:0.25] flatten]];
  566. [[UISlider appearanceWhenContainedIn:[UIToolbar class], nil] setMaximumTrackTintColor:[[primaryColor darkenByPercentage:0.25] flatten]];
  567. [[UISlider appearance] setThumbTintColor:secondaryColor];
  568. [[UISlider appearanceWhenContainedIn:[UIToolbar class], nil] setThumbTintColor:ContrastColor(primaryColor, NO)];
  569. }
  570. #pragma mark - UIStepper
  571. + (void)customizeStepperWithPrimaryColor:(UIColor *)primaryColor
  572. withContentStyle:(UIContentStyle)contentStyle {
  573. UIColor *contentColor;
  574. switch (contentStyle) {
  575. case UIContentStyleContrast: {
  576. contentColor = ContrastColor(primaryColor, NO);
  577. break;
  578. }
  579. case UIContentStyleLight: {
  580. contentColor = [UIColor whiteColor];
  581. break;
  582. }
  583. case UIContentStyleDark: {
  584. contentColor = FlatBlackDark;
  585. break;
  586. }
  587. default: {
  588. contentColor = ContrastColor(primaryColor, NO);
  589. break;
  590. }
  591. }
  592. [[UIStepper appearance] setTintColor:primaryColor];
  593. [[UIStepper appearanceWhenContainedIn:[UINavigationBar class], nil]
  594. setTintColor:contentColor];
  595. [[UIStepper appearanceWhenContainedIn:[UIToolbar class], nil]
  596. setTintColor:contentColor];
  597. }
  598. #pragma mark - UISwitch
  599. + (void)customizeSwitchWithPrimaryColor:(UIColor *)primaryColor {
  600. [[UISwitch appearance] setOnTintColor:primaryColor];
  601. [[UISwitch appearanceWhenContainedIn:[UINavigationBar class], nil] setOnTintColor:[[primaryColor darkenByPercentage:0.25] flatten]];
  602. [[UISwitch appearanceWhenContainedIn:[UIToolbar class], nil] setOnTintColor:[[primaryColor darkenByPercentage:0.25] flatten]];
  603. }
  604. + (void)customizeSwitchWithPrimaryColor:(UIColor *)primaryColor
  605. andSecondaryColor:(UIColor *)secondaryColor {
  606. [[UISwitch appearance] setOnTintColor:secondaryColor];
  607. [[UISwitch appearanceWhenContainedIn:[UINavigationBar class], nil] setOnTintColor:secondaryColor];
  608. [[UISwitch appearanceWhenContainedIn:[UIToolbar class], nil] setOnTintColor:secondaryColor];
  609. }
  610. #pragma mark - UITabBar
  611. + (void)customizeTabBarWithBarTintColor:(UIColor *)barTintColor
  612. andTintColor:(UIColor *)tintColor {
  613. [[UITabBar appearance] setBarTintColor:barTintColor];
  614. [[UITabBar appearance] setTintColor:tintColor];
  615. }
  616. + (void)customizeTabBarWithBarTintColor:(UIColor *)barTintColor
  617. tintColor:(UIColor *)tintColor
  618. fontName:(NSString *)fontName
  619. fontSize:(CGFloat)fontSize {
  620. [[UITabBar appearance] setBarTintColor:barTintColor];
  621. [[UITabBar appearance] setTintColor:tintColor];
  622. UIFont *font = [UIFont fontWithName:fontName size:fontSize];
  623. if (font) {
  624. [[UITabBarItem appearance] setTitleTextAttributes:@{NSFontAttributeName:font}
  625. forState:UIControlStateNormal];
  626. }
  627. }
  628. #pragma mark - UIToolbar
  629. + (void)customizeToolbarWithPrimaryColor:(UIColor *)primaryColor
  630. withContentStyle:(UIContentStyle)contentStyle {
  631. UIColor *contentColor;
  632. switch (contentStyle) {
  633. case UIContentStyleContrast: {
  634. contentColor = ContrastColor(primaryColor, NO);
  635. break;
  636. }
  637. case UIContentStyleLight: {
  638. contentColor = [UIColor whiteColor];
  639. break;
  640. }
  641. case UIContentStyleDark: {
  642. contentColor = FlatBlackDark;
  643. break;
  644. }
  645. default: {
  646. contentColor = ContrastColor(primaryColor, NO);
  647. break;
  648. }
  649. }
  650. [[UIToolbar appearance] setTintColor:contentColor];
  651. [[UIToolbar appearance] setBarTintColor:primaryColor];
  652. [[UIToolbar appearance] setClipsToBounds:YES];
  653. }
  654. #pragma GCC diagnostic pop
  655. @end