Скрыть строку состояния при использовании 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];
}
Обновление:
Здесь отображается строка состояния в строке меню:
![Вот изображение строки состояния в строке меню]()
Ответы
Ответ 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
}
Для всего приложения скрыть строку состояния.
Прокомментируйте свой код и проверьте.
Надеюсь, что это сработает.