I have a UIWebView included in a UIViewController which is a descendant of UINavigationController. It looks like this:
I faced this problem yesterday, where @entropid answer worked for iOS 9 and below, but for iOS 10 it didn't (since iOS 10 did actually hide the status bar, where on iOS 9 and below it was just the UINavigationBar
that changed its frame without hiding the status bar and, thus, it overlapped that bar).
Also, subscribing to MPMoviePlayerControllerDidExitFullScreen
notification didn't work either, sometimes it simply wasn't called (in my particular case, it was because it was a video from a UIWebView
, which used a different class of player which looks similar to MPMoviePlayerController
).
So I solved it using a solution like the one @StanislavPankevich suggested, but I subscribed to notifications when a UIWindow
has become hidden (which can be in several cases, like when a video has finished, but also when a UIActivityViewController
dismisses and other cases) instead of viewWillLayoutSubviews
. For my particular case (a subclass of UINavigationController
), methods like viewDidAppear
, viewWillAppear
, etc. simply weren't being called.
viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(videoDidExitFullscreen:)
name:UIWindowDidBecomeHiddenNotification
object:nil];
// Some other logic...
}
dealloc
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
And finally, videoDidExitFullscreen
- (void)videoDidExitFullscreen:(NSNotification *)notification {
// You would want to check here if the window dismissed was actually a video one or not.
[[UIApplication sharedApplication] setStatusBarHidden:NO
withAnimation:UIStatusBarAnimationFade];
}
I used UIStatusBarAnimationFade
because it looks a lot smoother than UIStatusBarAnimationNone
, at least from a user perspective.