When I am navigating back & forth between parent and child controllers in a master - detail navigation controller, i see a dark shadow on the right side of navigation ba
While it's not the same as the stock iOS implementation, this is a nice way to fix the problem:
- (void)viewWillAppear:(BOOL)animated {
[UIView animateWithDuration:0.35f animations:^{
self.tabBarController.tabBar.alpha = 1.0f;
}];
}
- (void)viewWillDisappear:(BOOL)animated {
[UIView animateWithDuration:0.35f animations:^{
self.tabBarController.tabBar.alpha = 0.0f;
}];
}
You'll get a nice fade-in/fade-out animation of the tab bar. Add the code in the root UIViewController
.
Or if you're using interface builder, you can just select Navigation Bar from your navigation controller and uncheck the Translucent checkbox between Style and Bar Tint in the Attributes Inspector to get rid of that weird effect -
The following also works and leaves the Navigation Bar transparent:
[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor whiteColor];
This works for me on iOS 13 with both light and dark themes and also on older iOS versions.
Add the following code to the AppDelegate to the application(didFinishLaunchingWithOptions)
method:
if #available(iOS 13.0, *) {
window?.backgroundColor = UIColor.systemBackground
} else {
window?.backgroundColor = UIColor.white
}
self.navigationController!.navigationBar.translucent = false;
This works for me place it inside the function where you push the new ViewController
It seems to happen with any bar (TabBar or ToolBar) that is translucent.
So one way to fix it is to set the _tabBar.translucent = NO;
(in my case). This prevents the undesired shadow under the top navigation bar while leaving the navigation bar translucent. Unfortunately the bottom bar is no longer translucent though.
It can be set back to translucent but all this has to happen after the whole pushing animation is finished thus switching this property is well noticeable.
In case, however the bottom bar also has to be translucent and I don't want the user to see the change I resolved it with the following:
/* create a simple quick animation of the bottom bar
just before pushing the new controller */
[UIView animateWithDuration:0.1
animations:^{
_tabBar.barTintColor = [UIColor colorWithWhite:0.97254901960784 alpha:1.0]; // this is the closest color for my case
_tabBar.translucent = NO;
} completion:^(BOOL finished) {
/* now when the animation that makes the bar not translucent
is finished we can push the new controller
the controller is instantiated before the animation code */
[self.navigationController pushViewController:controller animated:YES];
}];
Then in the viewDidAppear:
I simply reverts that back:
[UIView animateWithDuration:0.1
animations:^{
_tabBar.barTintColor = nil;
_tabBar.translucent = YES;
}];
There is just a little change in the appearance especially but it's barely noticeable and it's way better than having the shadow under the navigation bar.
Hope it'll help others to keep bars translucent until Apple fix this behaviour as bars ARE meant to be hidden in some cases unlike it was suggested in other posts especially for the UITabBar