I tried @Makalele's answer but didn't not quite working (or it might but got blocked due to other test code). After some test and try, I end up with something simpler than that.
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(setNeedsStatusBarAppearanceUpdate)
name:UIDeviceOrientationDidChangeNotification
object:nil];
[center addObserver:self
selector:@selector(setNeedsStatusBarAppearanceUpdate)
name:UIWindowDidBecomeHiddenNotification
object:nil];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (BOOL)prefersStatusBarHidden {
return UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation);
}
A few things to notice
- You can call
setNeedsStatusBarAppearanceUpdate
directly using selector.
- Added a
removeObserver
call when view disappears.
- The return value of
prefersStatusBarHidden
must be changed from time-to-time.
So, in the view controller that contains the YouTube view, you will see the status bar disappears before entering YouTube fullscreen. It will returns when the YouTube playing is completed (via UIWindowDidBecomeHiddenNotification
event).
Just in case that this event doesn't trigger, the other event: UIDeviceOrientationDidChangeNotification
, will still trigger whenever user rotates the screen (even the orientation is locked).
So, @Makalele's solution has double route to trigger status bar.
I found that I don't need UIDevice:setValue:forKey:
but your mileage may vary.
Credit to @Makalele and @Aaron.