Files
OrderScheduling/Pods/CocoaDebug/Sources/Sandbox/_FilePreviewController.m
DDIsFriend 63ca919ed5 update
2023-08-23 09:24:40 +08:00

226 lines
7.5 KiB
Objective-C
Executable File

//
// Example
// man
//
// Created by man 11/11/2018.
// Copyright © 2020 man. All rights reserved.
//
#import "_FilePreviewController.h"
#import "_FileInfo.h"
#import <QuickLook/QuickLook.h>
#import <WebKit/WebKit.h>
#import "_Sandboxer-Header.h"
#import "_Sandboxer.h"
@interface _FilePreviewController () <QLPreviewControllerDataSource, WKNavigationDelegate, WKUIDelegate, UIDocumentInteractionControllerDelegate>
@property (nonatomic, strong) WKWebView *wkWebView;
@property (nonatomic, strong) UITextView *textView;
@property (nonatomic, strong) UIActivityIndicatorView *activityIndicatorView;
@property (nonatomic, strong) UIDocumentInteractionController *documentInteractionController;
@end
@implementation _FilePreviewController
#pragma mark - View Lifecycle
- (void)viewDidLoad {
[super viewDidLoad];
self.title = self.fileInfo.displayName.stringByDeletingPathExtension;
self.view.backgroundColor = [UIColor whiteColor];
[self init_documentInteractionController];
[self initDatas];
[self setupViews];
[self loadFile];
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
if (self.wkWebView) {
self.wkWebView.frame = self.view.bounds;
}
// if (self.webView) {
// self.webView.frame = self.view.bounds;
// }
if (self.textView) {
self.textView.frame = self.view.bounds;
}
self.activityIndicatorView.center = self.view.center;
}
#pragma mark - Private Methods
- (void)init_documentInteractionController {
if (!self.documentInteractionController) {
self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:self.fileInfo.URL];
self.documentInteractionController.delegate = self;
self.documentInteractionController.name = self.fileInfo.displayName;
}
}
- (void)initDatas {
}
- (void)setupViews {
if ([_Sandboxer shared].isShareable) {
UIBarButtonItem *shareItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(sharingAction)];
self.navigationItem.rightBarButtonItem = shareItem;
}
if (self.fileInfo.isCanPreviewInWebView) {
self.wkWebView = [[WKWebView alloc] initWithFrame:self.view.bounds];
self.wkWebView.backgroundColor = [UIColor whiteColor];
self.wkWebView.navigationDelegate = self;
[self.view addSubview:self.wkWebView];
} else {
switch (self.fileInfo.type) {
case _FileTypePList: {
self.textView = [[UITextView alloc] initWithFrame:self.view.bounds];
self.textView.editable = NO;
self.textView.alwaysBounceVertical = YES;
[self.view addSubview:self.textView];
break;
}
default:
break;
}
}
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showOrHideNavigationBar)]];
self.activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[self.view addSubview:self.activityIndicatorView];
}
- (void)loadFile {
if (self.fileInfo.isCanPreviewInWebView) {
if (@available(iOS 9.0, *)) {
[self.wkWebView loadFileURL:self.fileInfo.URL allowingReadAccessToURL:self.fileInfo.URL];
} else {
// Fallback on earlier versions
}
} else {
switch (self.fileInfo.type) {
case _FileTypePList: {
[self.activityIndicatorView startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [NSData dataWithContentsOfFile:self.fileInfo.URL.path];
if (data) {
NSString *content = [[NSPropertyListSerialization propertyListWithData:data options:kNilOptions format:nil error:nil] description];
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicatorView stopAnimating];
self.textView.text = content;
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicatorView stopAnimating];
[self showAlert];
});
}
});
break;
}
default: {
[self showAlert];
}
break;
}
}
}
#pragma mark - alert
- (void)showAlert {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Not supported" message:nil preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:nil];
[alert addAction:cancelAction];
alert.popoverPresentationController.permittedArrowDirections = 0;
alert.popoverPresentationController.sourceView = self.view;
alert.popoverPresentationController.sourceRect = CGRectMake(self.view.bounds.size.width / 2.0, self.view.bounds.size.height / 2.0, 0, 0);
[self presentViewController:alert animated:YES completion:nil];
}
#pragma mark - Action
- (void)showOrHideNavigationBar {
[self.navigationController setNavigationBarHidden:!self.navigationController.isNavigationBarHidden animated:YES];
}
- (void)sharingAction {
if (![_Sandboxer shared].isShareable) { return; }
[self init_documentInteractionController];
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {
[self.documentInteractionController presentOptionsMenuFromBarButtonItem:self.navigationItem.rightBarButtonItem animated:YES];
} else {
[self.documentInteractionController presentOptionsMenuFromRect:CGRectZero inView:self.view animated:YES];
}
}
#pragma mark - UIDocumentInteractionControllerDelegate
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller {
return self.navigationController;
}
- (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController *)controller {
return self.view.bounds;
}
- (UIView *)documentInteractionControllerViewForPreview:(UIDocumentInteractionController *)controller {
return self.view;
}
#pragma mark - QLPreviewControllerDataSource
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller {
return 1;
}
- (id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index {
return self.fileInfo.URL;
}
#pragma mark - WKNavigationDelegate
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
////NSLog(@"%@", NSStringFromSelector(_cmd));
[self.activityIndicatorView startAnimating];
}
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {
////NSLog(@"%@", NSStringFromSelector(_cmd));
[self.activityIndicatorView stopAnimating];
}
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
////NSLog(@"%@", NSStringFromSelector(_cmd));
[self.activityIndicatorView stopAnimating];
}
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {
////NSLog(@"%@, error = %@", NSStringFromSelector(_cmd), error);
[self.activityIndicatorView stopAnimating];
}
#pragma mark - WKUIDelegate
@end