Подтвердить что ты не робот

Скрыть строку состояния при использовании UIDocumentInteractionController?

Я работаю над приложением React Native, которое нужно просматривать/обмениваться файлами PDF. Я использую модуль react-native-open-file, который использует UIDocumentInteractionController для просмотра файлов PDF. Когда PDF файл открывается, в PDF файле появляется строка состояния. В моем приложении всегда хранится staus bar. Как скрыть строку состояния при просмотре PDF?

Здесь код из модуля:

//
//  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

Мне удалось добавить метод documentInteractionControllerDidEndPreview, который скрывает статус после его закрытия, но я бы предпочел никогда не открывать строку состояния:

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

Обновление:

Здесь отображается строка состояния в строке меню:

Вот изображение строки состояния в строке меню

4b9b3361

Ответ 1

Другое хакерское решение:

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];
}

Вы можете поместить определение timer в любом месте, просто убедитесь, что сделали его недействительным после закрытия предварительного просмотра. Я также заметил, что если вы поместите строку с setStatusBarHidden:YES внутри предложения if, где вы проверяете, действительно ли она скрыта, это решение больше не работает. Это похоже на ошибку в UIDocumentInteractionController.

Ответ 2

Я думаю, что приведенный ниже код должен делать:

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

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

Ответ 3

Пожалуйста, добавьте ниже код и конфигурацию в свой проект и проверьте его.

В Info.plist установите View controller-based status bar appearance в NO

И установите statusBarHidden в методе AppDelegate

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

Для всего приложения скрыть строку состояния. Прокомментируйте свой код и проверьте.

Надеюсь, что это сработает.