/Chameleon_.m

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