天天看點

iOS系統預覽檔案但不分享的實用技巧 (iOS10, QLPreviewController)

蘋果系統的檔案預覽能力對于很多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功能比較強大,有開發者想到這種解決方案也是正常的。

繼續閱讀