diff --git a/lib/ios/RNNBackButtonOptions.h b/lib/ios/RNNBackButtonOptions.h index 354ac46ac31..0a7f25db8b5 100644 --- a/lib/ios/RNNBackButtonOptions.h +++ b/lib/ios/RNNBackButtonOptions.h @@ -9,4 +9,6 @@ @property (nonatomic, strong) Bool* showTitle; @property (nonatomic, strong) Bool* visible; +- (BOOL)hasValue; + @end diff --git a/lib/ios/RNNBackButtonOptions.m b/lib/ios/RNNBackButtonOptions.m index d763be64dfe..aceb8cb125c 100644 --- a/lib/ios/RNNBackButtonOptions.m +++ b/lib/ios/RNNBackButtonOptions.m @@ -15,4 +15,12 @@ - (instancetype)initWithDict:(NSDictionary *)dict { return self; } +- (BOOL)hasValue { + return self.icon.hasValue || + self.showTitle.hasValue || + self.color.hasValue || + self.title.hasValue; +} + + @end diff --git a/lib/ios/RNNViewControllerPresenter.m b/lib/ios/RNNViewControllerPresenter.m index 2e68871daeb..781a3338d41 100644 --- a/lib/ios/RNNViewControllerPresenter.m +++ b/lib/ios/RNNViewControllerPresenter.m @@ -161,9 +161,11 @@ - (void)mergeOptions:(RNNNavigationOptions *)newOptions currentOptions:(RNNNavig [_customTitleView removeFromSuperview]; _customTitleView = nil; } - - if (newOptions.topBar.backButton.icon.hasValue || newOptions.topBar.backButton.showTitle.hasValue || newOptions.topBar.backButton.color.hasValue || newOptions.topBar.backButton.title.hasValue) { - [viewController rnn_setBackButtonIcon:[newOptions.topBar.backButton.icon getWithDefaultValue:nil] withColor:[newOptions.topBar.backButton.color getWithDefaultValue:nil] title:[newOptions.topBar.backButton.showTitle getWithDefaultValue:YES] ? [newOptions.topBar.backButton.title getWithDefaultValue:nil] : @""]; + + if (newOptions.topBar.backButton.hasValue) { + UIViewController *lastViewControllerInStack = viewController.navigationController.viewControllers.count > 1 ? viewController.navigationController.viewControllers[viewController.navigationController.viewControllers.count - 2] : viewController.navigationController.topViewController; + RNNNavigationOptions * resolvedOptions = (RNNNavigationOptions *) [[currentOptions overrideOptions:newOptions] withDefault:[self defaultOptions]]; + [lastViewControllerInStack applyBackButton:resolvedOptions.topBar.backButton]; } } diff --git a/lib/ios/UIViewController+RNNOptions.h b/lib/ios/UIViewController+RNNOptions.h index 5e5e026e5b4..6e6f957a311 100644 --- a/lib/ios/UIViewController+RNNOptions.h +++ b/lib/ios/UIViewController+RNNOptions.h @@ -2,6 +2,7 @@ @class RNNBottomTabOptions; @class RNNNavigationOptions; +@class RNNBackButtonOptions; @interface UIViewController (RNNOptions) @@ -41,6 +42,8 @@ - (void)rnn_setBackButtonIcon:(UIImage *)icon withColor:(UIColor *)color title:(NSString *)title; +- (void)applyBackButton:(RNNBackButtonOptions *)backButton; + - (BOOL)isModal; @end diff --git a/lib/ios/UIViewController+RNNOptions.m b/lib/ios/UIViewController+RNNOptions.m index 5f781657542..6b792a33db9 100644 --- a/lib/ios/UIViewController+RNNOptions.m +++ b/lib/ios/UIViewController+RNNOptions.m @@ -3,6 +3,7 @@ #import "UIImage+tint.h" #import "RNNBottomTabOptions.h" #import "RNNNavigationOptions.h" +#import "RNNBackButtonOptions.h" #define kStatusBarAnimationDuration 0.35 const NSInteger BLUR_STATUS_TAG = 78264801; @@ -177,12 +178,12 @@ - (void)rnn_setBackButtonIcon:(UIImage *)icon withColor:(UIColor *)color title:( backItem.image = color ? [[icon withTintColor:color] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] : icon; - + [self.navigationController.navigationBar setBackIndicatorImage:[UIImage new]]; [self.navigationController.navigationBar setBackIndicatorTransitionMaskImage:[UIImage new]]; } - UIViewController *lastViewControllerInStack = self.navigationController.viewControllers.count > 1 ? [self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count-2] : self.navigationController.topViewController; + UIViewController *lastViewControllerInStack = self.navigationController.viewControllers.count > 1 ? self.navigationController.viewControllers[self.navigationController.viewControllers.count - 2] : self.navigationController.topViewController; backItem.title = title ? title : lastViewControllerInStack.navigationItem.title; backItem.tintColor = color; @@ -190,4 +191,21 @@ - (void)rnn_setBackButtonIcon:(UIImage *)icon withColor:(UIColor *)color title:( lastViewControllerInStack.navigationItem.backBarButtonItem = backItem; } +- (void)applyBackButton:(RNNBackButtonOptions *)backButton { + UIBarButtonItem *backItem = [UIBarButtonItem new]; + if (backButton.icon.hasValue) { + UIColor *color = [backButton.color getWithDefaultValue:nil]; + backItem.image = color ? + [[backButton.icon.get withTintColor:color] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] : + backButton.icon.get; + + [self.navigationController.navigationBar setBackIndicatorImage:[UIImage new]]; + [self.navigationController.navigationBar setBackIndicatorTransitionMaskImage:[UIImage new]]; + } + + if ([backButton.showTitle getWithDefaultValue:YES]) backItem.title = [backButton.title getWithDefaultValue:nil]; + if (backButton.color.hasValue) backItem.tintColor = [backButton.color get]; + self.navigationItem.backBarButtonItem = backItem; +} + @end