蘋果系統的檔案預覽能力對于很多app來說是必要的,但其提供的UI相關api并不是可以定制的,比如需要定制toolbar, navigationbar的情況,直接使用QLPreviewController或者
UIDocumentInteractionController 并不能達到想要的效果。
根據筆者的試驗來看,現在 iOS10 QLPreviewController 和 UIDocumentInteractionController一樣,都是直接在下面顯示一個分享按鈕,上面是标題欄。
如何對其UI進行定制呢?
QLPreviewController 作為一個正兒八經的viewcontroller,可以對其進行子類化操作,改變其行為,代碼類似這樣:
(void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
self.navigationController.navigationBar.hidden = YES;
self.navigationController.toolbar.hidden = YES;
// custom view demonstrate
UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
topView.backgroundColor = [UIColor redColor];
[self.view addSubview:topView];
}
為何在viewWillLayoutSubviews執行操作呢?
preview過程中可以點選全屏放大縮小,在這個過程中,你會發現此前所做的view操作被恢複了;這裡的viewWillLayoutSubviews相當于是一個hook,可以讓我們在view改變以後再把他置回來,達到我們想要的效果。
還有另外一種方案,隻add QLPreviewController的 view 作為subview,代碼類似這樣:
MyPreviewViewController *qlVc = [[MyPreviewViewController alloc] init];
qlVc.delegate = self;
qlVc.dataSource = self;
qlVc.view.frame = CGRectMake(0, 100, 300, 300);
[self.view addSubview:qlVc.view];
對于該frame以外的部分則可以由我們來自由定制。
而UIDocumentInteractionController作為一個nsobject對象,産生的新UI要對其操縱所需要的手法可能更加tricky,這裡筆者也沒有做更多的實踐,如果大家有好的思路也請分享給我,謝謝!
對于以前版本(iOS10以前)的QLPreviewController,分享按鈕貌似是在右上角的,對其定制的方案讨論有很多,這裡貼對外連結接供大家參考:
http://blog.csdn.net/jeffasd/article/details/49662483
https://stackoverflow.com/questions/6957091/qlpreviewcontroller-remove-or-add-uibarbuttonitems
http://www.jianshu.com/p/73048dbe6a7d
其思路主要是以下幾種:
1. 子類化 ; 2. category, method swizz; 3. 隻使用它的view
比我們上面的方案多了一種使用oc runtime的做法;oc中的runtime功能比較強大,有開發者想到這種解決方案也是正常的。