Skip to content

Commit

Permalink
Fix styling options on iOS 13.4 (#6087)
Browse files Browse the repository at this point in the history
iOS 13.4 doesn't allow overriding UIViewController's methods in categories (and it's also discouraged by apple) which causes styles to break.

Move UIViewController override methods from category to controllers.
Fixes BottomTab style visibility
Fixes statusBar.style
Closes #6075
  • Loading branch information
yogevbd authored Mar 30, 2020
1 parent f487134 commit 950ac64
Show file tree
Hide file tree
Showing 13 changed files with 161 additions and 82 deletions.
8 changes: 5 additions & 3 deletions lib/ios/RNNBasePresenter.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,12 @@ typedef void (^RNNReactViewReadyCompletionBlock)(void);

- (UINavigationItem *)currentNavigationItem;

- (UIStatusBarStyle)getStatusBarStyle:(RNNNavigationOptions *)resolvedOptions;
- (void)willMoveToParentViewController:(UIViewController *)parent;

- (UIInterfaceOrientationMask)getOrientation:(RNNNavigationOptions *)options;
- (UIStatusBarStyle)getStatusBarStyle;

- (BOOL)statusBarVisibile:(UINavigationController *)stack resolvedOptions:(RNNNavigationOptions *)resolvedOptions;
- (UIInterfaceOrientationMask)getOrientation;

- (BOOL)getStatusBarVisibility;

@end
21 changes: 14 additions & 7 deletions lib/ios/RNNBasePresenter.m
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,13 @@ - (void)componentDidDisappear {

}

- (void)willMoveToParentViewController:(UIViewController *)parent {
if (parent) {
[self applyOptionsOnWillMoveToParentViewController:self.boundViewController.resolveOptions];
[self.boundViewController onChildAddToParent:self.boundViewController options:self.boundViewController.resolveOptions];
}
}

- (void)applyOptionsOnInit:(RNNNavigationOptions *)initialOptions {
UIViewController* viewController = self.boundViewController;
RNNNavigationOptions *withDefault = [initialOptions withDefault:[self defaultOptions]];
Expand Down Expand Up @@ -78,8 +85,8 @@ - (void)viewDidLayoutSubviews {

}

- (UIStatusBarStyle)getStatusBarStyle:(RNNNavigationOptions *)resolvedOptions {
RNNNavigationOptions *withDefault = [resolvedOptions withDefault:[self defaultOptions]];
- (UIStatusBarStyle)getStatusBarStyle {
RNNNavigationOptions *withDefault = [self.boundViewController.resolveOptions withDefault:[self defaultOptions]];
NSString* statusBarStyle = [withDefault.statusBar.style getWithDefaultValue:@"default"];
if ([statusBarStyle isEqualToString:@"light"]) {
return UIStatusBarStyleLightContent;
Expand All @@ -98,16 +105,16 @@ - (UINavigationItem *)currentNavigationItem {
return self.boundViewController.getCurrentChild.navigationItem;
}

- (UIInterfaceOrientationMask)getOrientation:(RNNNavigationOptions *)options {
return [options withDefault:[self defaultOptions]].layout.supportedOrientations;
- (UIInterfaceOrientationMask)getOrientation {
return [self.boundViewController.resolveOptions withDefault:self.defaultOptions].layout.supportedOrientations;
}

- (BOOL)statusBarVisibile:(UINavigationController *)stack resolvedOptions:(RNNNavigationOptions *)resolvedOptions {
RNNNavigationOptions *withDefault = [resolvedOptions withDefault:self.defaultOptions];
- (BOOL)getStatusBarVisibility {
RNNNavigationOptions *withDefault = [self.boundViewController.resolveOptions withDefault:self.defaultOptions];
if (withDefault.statusBar.visible.hasValue) {
return ![withDefault.statusBar.visible get];
} else if ([withDefault.statusBar.hideWithTopBar getWithDefaultValue:NO]) {
return stack.isNavigationBarHidden;
return self.boundViewController.stack.isNavigationBarHidden;
}
return NO;
}
Expand Down
27 changes: 19 additions & 8 deletions lib/ios/RNNBottomTabsController.m
Original file line number Diff line number Diff line change
Expand Up @@ -87,14 +87,6 @@ - (void)setSelectedIndex:(NSUInteger)selectedIndex {
[super setSelectedIndex:selectedIndex];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
return [[self presenter] getStatusBarStyle:self.resolveOptions];
}

- (BOOL)prefersStatusBarHidden {
return [self.presenter statusBarVisibile:self.navigationController resolvedOptions:self.resolveOptions];
}

#pragma mark UITabBarControllerDelegate

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
Expand All @@ -121,4 +113,23 @@ - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectView
return NO;
}

# pragma mark - UIViewController overrides

- (void)willMoveToParentViewController:(UIViewController *)parent {
[self.presenter willMoveToParentViewController:parent];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
return [self.presenter getStatusBarStyle];
}

- (BOOL)prefersStatusBarHidden {
return [self.presenter getStatusBarVisibility];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return [self.presenter getOrientation];
}


@end
27 changes: 18 additions & 9 deletions lib/ios/RNNComponentViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ @implementation RNNComponentViewController

- (instancetype)initWithLayoutInfo:(RNNLayoutInfo *)layoutInfo rootViewCreator:(id<RNNComponentViewCreator>)creator eventEmitter:(RNNEventEmitter *)eventEmitter presenter:(RNNComponentPresenter *)presenter options:(RNNNavigationOptions *)options defaultOptions:(RNNNavigationOptions *)defaultOptions {
self = [super initWithLayoutInfo:layoutInfo creator:creator options:options defaultOptions:defaultOptions presenter:presenter eventEmitter:eventEmitter childViewControllers:nil];
self.extendedLayoutIncludesOpaqueBars = YES;
if (@available(iOS 13.0, *)) {
self.navigationItem.standardAppearance = [UINavigationBarAppearance new];
self.navigationItem.scrollEdgeAppearance = [UINavigationBarAppearance new];
Expand Down Expand Up @@ -79,14 +78,6 @@ - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
[self.eventEmitter sendOnSearchBarCancelPressed:self.layoutInfo.componentId];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
return [_presenter getStatusBarStyle:[self resolveOptions]];
}

- (BOOL)prefersStatusBarHidden {
return [self.presenter statusBarVisibile:self.navigationController resolvedOptions:self.resolveOptions];
}

- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
return self.previewController;
}
Expand Down Expand Up @@ -139,5 +130,23 @@ -(void)onButtonPress:(RNNUIBarButtonItem *)barButtonItem {
[self.eventEmitter sendOnNavigationButtonPressed:self.layoutInfo.componentId buttonId:barButtonItem.buttonId];
}

# pragma mark - UIViewController overrides

- (void)willMoveToParentViewController:(UIViewController *)parent {
[self.presenter willMoveToParentViewController:parent];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
return [self.presenter getStatusBarStyle];
}

- (BOOL)prefersStatusBarHidden {
return [self.presenter getStatusBarVisibility];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return [self.presenter getOrientation];
}


@end
18 changes: 18 additions & 0 deletions lib/ios/RNNExternalViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,22 @@ - (void)render {
[self readyForPresentation];
}

# pragma mark - UIViewController overrides

- (void)willMoveToParentViewController:(UIViewController *)parent {
[self.presenter willMoveToParentViewController:parent];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
return [self.presenter getStatusBarStyle];
}

- (BOOL)prefersStatusBarHidden {
return [self.presenter getStatusBarVisibility];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return [self.presenter getOrientation];
}

@end
16 changes: 15 additions & 1 deletion lib/ios/RNNSideMenuChildVC.m
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,22 @@ - (UIViewController *)getCurrentChild {
return self.child;
}

# pragma mark - UIViewController overrides

- (void)willMoveToParentViewController:(UIViewController *)parent {
[self.presenter willMoveToParentViewController:parent];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
return [[self presenter] getStatusBarStyle:[self resolveOptions]];
return [self.presenter getStatusBarStyle];
}

- (BOOL)prefersStatusBarHidden {
return [self.presenter getStatusBarVisibility];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return [self.presenter getOrientation];
}

@end
26 changes: 18 additions & 8 deletions lib/ios/RNNSideMenuController.m
Original file line number Diff line number Diff line change
Expand Up @@ -130,14 +130,6 @@ -(void)setControllers:(NSArray*)controllers {
}
}

- (UIStatusBarStyle)preferredStatusBarStyle {
return self.openedViewController.preferredStatusBarStyle;
}

- (BOOL)prefersStatusBarHidden {
return [self.presenter statusBarVisibile:self.navigationController resolvedOptions:self.resolveOptions];
}

- (UIViewController<RNNLayoutProtocol> *)getCurrentChild {
return self.openedViewController;
}
Expand All @@ -163,4 +155,22 @@ - (RNNNavigationOptions *)resolveOptions {
return options;
}

# pragma mark - UIViewController overrides

- (void)willMoveToParentViewController:(UIViewController *)parent {
[self.presenter willMoveToParentViewController:parent];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
return [self.presenter getStatusBarStyle];
}

- (BOOL)prefersStatusBarHidden {
return [self.presenter getStatusBarVisibility];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return [self.presenter getOrientation];
}

@end
22 changes: 18 additions & 4 deletions lib/ios/RNNSplitViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,26 @@ - (void)setViewControllers:(NSArray<__kindof UIViewController *> *)viewControlle
self.delegate = masterViewController;
}

-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
}

- (UIViewController *)getCurrentChild {
return self.viewControllers[0];
}

# pragma mark - UIViewController overrides

- (void)willMoveToParentViewController:(UIViewController *)parent {
[self.presenter willMoveToParentViewController:parent];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
return [self.presenter getStatusBarStyle];
}

- (BOOL)prefersStatusBarHidden {
return [self.presenter getStatusBarVisibility];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return [self.presenter getOrientation];
}

@end
26 changes: 18 additions & 8 deletions lib/ios/RNNStackController.m
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,6 @@ - (void)mergeChildOptions:(RNNNavigationOptions *)options child:(UIViewControlle
[self.parentViewController mergeChildOptions:options child:child];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
return [_presenter getStatusBarStyle:self.resolveOptions];
}

- (BOOL)prefersStatusBarHidden {
return [self.presenter statusBarVisibile:self.navigationController resolvedOptions:self.resolveOptions];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
[self prepareForPop];
return [super popViewControllerAnimated:animated];
Expand All @@ -62,4 +54,22 @@ - (UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}

# pragma mark - UIViewController overrides

- (void)willMoveToParentViewController:(UIViewController *)parent {
[self.presenter willMoveToParentViewController:parent];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
return [self.presenter getStatusBarStyle];
}

- (BOOL)prefersStatusBarHidden {
return [self.presenter getStatusBarVisibility];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return [self.presenter getOrientation];
}

@end
17 changes: 1 addition & 16 deletions lib/ios/UIViewController+LayoutProtocol.m
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ - (instancetype)initWithLayoutInfo:(RNNLayoutInfo *)layoutInfo
self.eventEmitter = eventEmitter;
self.presenter = presenter;
[self.presenter bindViewController:self];
self.extendedLayoutIncludesOpaqueBars = YES;
if ([self respondsToSelector:@selector(setViewControllers:)]) {
[self performSelector:@selector(setViewControllers:) withObject:childViewControllers];
}
Expand Down Expand Up @@ -51,15 +52,6 @@ - (void)overrideOptions:(RNNNavigationOptions *)options {
[self.options overrideOptions:options];
}

- (BOOL)extendedLayoutIncludesOpaqueBars {
return YES;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
UIInterfaceOrientationMask interfaceOrientationMask = self.presenter ? [self.presenter getOrientation:[self resolveOptions]] : [[UIApplication sharedApplication] supportedInterfaceOrientationsForWindow:[[UIApplication sharedApplication] keyWindow]];
return interfaceOrientationMask;
}

- (UINavigationController *)stack {
if ([self isKindOfClass:UINavigationController.class]) {
return (UINavigationController *)self;
Expand Down Expand Up @@ -161,13 +153,6 @@ - (void)componentDidDisappear {
[self.parentViewController componentDidDisappear];
}

- (void)willMoveToParentViewController:(UIViewController *)parent {
if (parent) {
[self.presenter applyOptionsOnWillMoveToParentViewController:self.resolveOptions];
[self onChildAddToParent:self options:self.resolveOptions];
}
}

#pragma mark getters and setters to associated object

- (RNNNavigationOptions *)options {
Expand Down
2 changes: 1 addition & 1 deletion playground/ios/NavigationTests/BottomTabsControllerTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ - (void)testGetCurrentChild_shouldReturnSelectedViewController {
}

- (void)testPreferredStatusBarStyle_shouldInvokeSelectedViewControllerPreferredStatusBarStyle {
[[self.mockTabBarPresenter expect] getStatusBarStyle:[OCMArg any]];
[[self.mockTabBarPresenter expect] getStatusBarStyle];
[self.uut preferredStatusBarStyle];
[self.mockTabBarPresenter verify];
}
Expand Down
Loading

0 comments on commit 950ac64

Please sign in to comment.