Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

navigation bar under status bar after video playback in landscape mode

The problem:

Navigation bar is under status bar after playing video in landscape mode.

The application:

  • iOS9 only.
  • only supports portrait mode.
  • the view controller have a web view on it, web view will open a youtube link
  • the view controller is embedded in a navigation controller

Setups to reproduce:

  1. Play a video in a webView,
  2. Put device into landscape mode.
  3. Dismiss video play in landscape mode, app goes back to portrait mode
  4. Navigation bar is in wrong position

Screenshots:

  1. When app opens

when app opens

  1. Play video and put the device in landscape

enter image description here

  1. The problem:

enter image description here

like image 873
Honghao Zhang Avatar asked Mar 04 '16 19:03

Honghao Zhang


3 Answers

Swift 3

In the presenting view controller, override the prefersStatusBarHidden property to only hide the status bar if it's in landscape.

override var prefersStatusBarHidden: Bool {
    return UIApplication.shared.statusBarOrientation.isLandscape
}

Then add an observer for when the device is rotated.

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(videoDidRotate), name: .UIDeviceOrientationDidChange, object: nil)
}

In the observer's method, call setNeedsStatusBarAppearanceUpdate:

func videoDidRotate() {
    self.setNeedsStatusBarAppearanceUpdate()
}

That should do it.

like image 121
Aaron Avatar answered Nov 08 '22 16:11

Aaron


It's very simple,

swift 3

override func viewWillLayoutSubviews() {
   super.viewWillLayoutSubviews();
   UIApplication.shared.isStatusBarHidden = false
}
like image 11
Dan Developer Avatar answered Nov 08 '22 17:11

Dan Developer


@Aaron answer almost works, there's only one problem: when you tap "done" in the video, while still holding the device in landscape orientation, it won't show status bar until you'll rotate your device back into portrait.

In that case, I've added notification observer when "done" button is tapped and then I switch to portrait programmatically.

My code is in Objective C:

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoDidRotate) name:UIDeviceOrientationDidChangeNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closedFullScreen:) name:UIWindowDidBecomeHiddenNotification object:nil];
}

-(void)closedFullScreen:(NSNotification *)myNotification{
    [[UIDevice currentDevice] setValue:
     [NSNumber numberWithInteger: UIInterfaceOrientationPortrait]
                                    forKey:@"orientation"];
}

- (BOOL)prefersStatusBarHidden {
    return UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation);
}

- (void)videoDidRotate {
    [self setNeedsStatusBarAppearanceUpdate];
}

EDIT:

View controller-based status bar appearance in .plist file must be set to YES.

like image 8
Makalele Avatar answered Nov 08 '22 17:11

Makalele