react-native-navigation的迁移库

RNNNavigationController.m 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #import "RNNNavigationController.h"
  2. #import "RNNModalAnimation.h"
  3. #import "RNNRootViewController.h"
  4. const NSInteger TOP_BAR_TRANSPARENT_TAG = 78264803;
  5. @interface RNNNavigationController()
  6. @property (nonatomic, strong) NSMutableDictionary* originalTopBarImages;
  7. @end
  8. @implementation RNNNavigationController
  9. - (instancetype)initWithLayoutInfo:(RNNLayoutInfo *)layoutInfo childViewControllers:(NSArray *)childViewControllers options:(RNNNavigationOptions *)options defaultOptions:(RNNNavigationOptions *)defaultOptions presenter:(RNNNavigationControllerPresenter *)presenter {
  10. self = [super init];
  11. self.presenter = presenter;
  12. [self.presenter bindViewController:self];
  13. self.defaultOptions = defaultOptions;
  14. self.options = options;
  15. self.layoutInfo = layoutInfo;
  16. [self setViewControllers:childViewControllers];
  17. return self;
  18. }
  19. - (void)willMoveToParentViewController:(UIViewController *)parent {
  20. if (parent) {
  21. [_presenter applyOptionsOnWillMoveToParentViewController:self.resolveOptions];
  22. }
  23. }
  24. - (void)onChildWillAppear {
  25. [_presenter applyOptions:self.resolveOptions];
  26. [((UIViewController<RNNParentProtocol> *)self.parentViewController) onChildWillAppear];
  27. }
  28. - (RNNNavigationOptions *)resolveOptions {
  29. return [(RNNNavigationOptions *)[self.getCurrentChild.resolveOptions.copy mergeOptions:self.options] withDefault:self.defaultOptions];
  30. }
  31. - (void)mergeOptions:(RNNNavigationOptions *)options {
  32. [_presenter mergeOptions:options currentOptions:self.options defaultOptions:self.defaultOptions];
  33. [((UIViewController<RNNLayoutProtocol> *)self.parentViewController) mergeOptions:options];
  34. }
  35. - (void)overrideOptions:(RNNNavigationOptions *)options {
  36. [self.options overrideOptions:options];
  37. }
  38. - (UITabBarItem *)tabBarItem {
  39. return self.viewControllers.firstObject.tabBarItem;
  40. }
  41. - (UIInterfaceOrientationMask)supportedInterfaceOrientations {
  42. return self.getCurrentChild.supportedInterfaceOrientations;
  43. }
  44. - (UINavigationController *)navigationController {
  45. return self;
  46. }
  47. - (UIStatusBarStyle)preferredStatusBarStyle {
  48. return self.getCurrentChild.preferredStatusBarStyle;
  49. }
  50. - (UIModalPresentationStyle)modalPresentationStyle {
  51. return self.getCurrentChild.modalPresentationStyle;
  52. }
  53. - (UIViewController *)popViewControllerAnimated:(BOOL)animated {
  54. if (self.viewControllers.count > 1) {
  55. UIViewController *controller = self.viewControllers[self.viewControllers.count - 2];
  56. if ([controller isKindOfClass:[RNNRootViewController class]]) {
  57. RNNRootViewController *rnnController = (RNNRootViewController *)controller;
  58. [self.presenter applyOptionsBeforePopping:rnnController.resolveOptions];
  59. }
  60. }
  61. return [super popViewControllerAnimated:animated];
  62. }
  63. - (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
  64. return [[RNNModalAnimation alloc] initWithScreenTransition:self.getCurrentChild.resolveOptions.animations.showModal isDismiss:NO];
  65. }
  66. - (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
  67. return [[RNNModalAnimation alloc] initWithScreenTransition:self.getCurrentChild.resolveOptions.animations.dismissModal isDismiss:YES];
  68. }
  69. - (UIViewController *)getCurrentChild {
  70. return ((UIViewController<RNNParentProtocol>*)self.topViewController);
  71. }
  72. - (UIViewController<RNNLeafProtocol> *)getCurrentLeaf {
  73. return [[self getCurrentChild] getCurrentLeaf];
  74. }
  75. - (UIViewController *)childViewControllerForStatusBarStyle {
  76. return self.topViewController;
  77. }
  78. - (void)setTopBarBackgroundColor:(UIColor *)backgroundColor {
  79. if (backgroundColor) {
  80. CGFloat bgColorAlpha = CGColorGetAlpha(backgroundColor.CGColor);
  81. if (bgColorAlpha == 0.0) {
  82. if (![self.navigationBar viewWithTag:TOP_BAR_TRANSPARENT_TAG]){
  83. [self storeOriginalTopBarImages:self];
  84. UIView *transparentView = [[UIView alloc] initWithFrame:CGRectZero];
  85. transparentView.backgroundColor = [UIColor clearColor];
  86. transparentView.tag = TOP_BAR_TRANSPARENT_TAG;
  87. [self.navigationBar insertSubview:transparentView atIndex:0];
  88. }
  89. self.navigationBar.translucent = YES;
  90. [self.navigationBar setBackgroundColor:[UIColor clearColor]];
  91. self.navigationBar.shadowImage = [UIImage new];
  92. [self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
  93. } else {
  94. self.navigationBar.barTintColor = backgroundColor;
  95. UIView *transparentView = [self.navigationBar viewWithTag:TOP_BAR_TRANSPARENT_TAG];
  96. if (transparentView){
  97. [transparentView removeFromSuperview];
  98. [self.navigationBar setBackgroundImage:self.originalTopBarImages[@"backgroundImage"] forBarMetrics:UIBarMetricsDefault];
  99. self.navigationBar.shadowImage = self.originalTopBarImages[@"shadowImage"];
  100. self.originalTopBarImages = nil;
  101. }
  102. }
  103. } else {
  104. UIView *transparentView = [self.navigationBar viewWithTag:TOP_BAR_TRANSPARENT_TAG];
  105. if (transparentView){
  106. [transparentView removeFromSuperview];
  107. [self.navigationBar setBackgroundImage:self.originalTopBarImages[@"backgroundImage"] ? self.originalTopBarImages[@"backgroundImage"] : [self.navigationBar backgroundImageForBarMetrics:UIBarMetricsDefault] forBarMetrics:UIBarMetricsDefault];
  108. self.navigationBar.shadowImage = self.originalTopBarImages[@"shadowImage"] ? self.originalTopBarImages[@"shadowImage"] : self.navigationBar.shadowImage;
  109. self.originalTopBarImages = nil;
  110. }
  111. self.navigationBar.barTintColor = nil;
  112. }
  113. }
  114. - (void)storeOriginalTopBarImages:(UINavigationController *)navigationController {
  115. NSMutableDictionary *originalTopBarImages = [@{} mutableCopy];
  116. UIImage *bgImage = [navigationController.navigationBar backgroundImageForBarMetrics:UIBarMetricsDefault];
  117. if (bgImage != nil) {
  118. originalTopBarImages[@"backgroundImage"] = bgImage;
  119. }
  120. UIImage *shadowImage = navigationController.navigationBar.shadowImage;
  121. if (shadowImage != nil) {
  122. originalTopBarImages[@"shadowImage"] = shadowImage;
  123. }
  124. self.originalTopBarImages = originalTopBarImages;
  125. }
  126. @end