12
votes

I'm working on an React Native app that needs to view/share PDF files. I'm use the react-native-open-file module which uses the UIDocumentInteractionController to view PDF files. When the PDF file is opened the status bar appears over the PDF. My app has the staus bar hidden at all times. How do I hide the status bar when viewing the PDF?

Here's the code from the module:

//
//  RNDocumentInteractionController.m
//  RNDocumentInteractionController
//
//  Created by Aaron Greenwald on 7/5/16.
//  Copyright © 2016 Wix.com. All rights reserved.
//

#import "RNDocumentInteractionController.h"
#import <UIKit/UIKit.h>

@implementation RNDocumentInteractionController

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(open: (NSURL *)path)
{
    UIDocumentInteractionController *interactionController = [UIDocumentInteractionController interactionControllerWithURL:path];
    interactionController.delegate = self;
    [interactionController presentPreviewAnimated:YES];
}

- (UIViewController *) documentInteractionControllerViewControllerForPreview: (UIDocumentInteractionController *) controller
{
    return [[[[UIApplication sharedApplication] delegate] window] rootViewController];
}


@end

I was able to add a documentInteractionControllerDidEndPreview method that hides the status after it closes but I would rather never have the status bar open at all:

- (void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}

Update:

Here's a picture of the status bar over the menu bar:

Here's a picture of the status bar over the menu bar

3
using setStatusBarHidden hide status bar forever?Sunil Prajapati
@SunilPrajapati yeah, I don't want to see the status bar at all. Is that what you're asking?Dev01
please see this answerSunil Prajapati
@SunilPrajapati after I add the changes you linked to, do I need to make any changes to the above code?Dev01
no,not need any other changes to the above code. for whole application hide the status barSunil Prajapati

3 Answers

5
votes

I think the below code should do:

- (UIViewController *) documentInteractionControllerViewControllerForPreview: (UIDocumentInteractionController *) controller
{
    [[[[UIApplication sharedApplication] delegate] window] setWindowLevel:UIWindowLevelStatusBar];

    return [[[[UIApplication sharedApplication] delegate] window] rootViewController];
}
2
votes

Another hacky solution:

static NSTimer* timer = nil;
- (void)documentInteractionControllerWillBeginPreview:(UIDocumentInteractionController *)controller
{
    timer = [NSTimer scheduledTimerWithTimeInterval:0.1 repeats:YES block:^(NSTimer * _Nonnull timer) {
        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }];
}

-(void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller
{
    [timer invalidate];
}

You can put the timer definition anywhere you want, just make sure to invalidate it once you close the preview. I have also noticed that if you put the line with setStatusBarHidden:YES inside an if clause where you check if it is actually hidden, this solution no longer works. It seems like a bug in UIDocumentInteractionController.

1
votes

Please add below code and configuration in your project and check it.

In Info.plist set View controller-based status bar appearance to NO

And set statusBarHidden in AppDelegate method

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    UIApplication.sharedApplication().statusBarHidden = true
    return true
}

For whole application hide the status bar. Please comment your code and check.

Hope it's Work.