[英]How to Disable QLPreviewController print Button
誰能告訴我如何刪除 QLPreviewController 打印按鈕? 還想禁用剪切/粘貼/復制。
更新:
這在iOS 6中不再有效。快速查看在使用XPC的另一個進程中運行。 有關詳細信息,請參見[此處] [3]。 我沒有預見到任何定制QLPreviewController的方法。 以下答案適用於對iOS 6之前感興趣的任何人。
如果您只想刪除操作按鈕,則需要QLPreviewController
。 然后在-viewWillAppear:
你需要通過調用[[self navigationItem] setRightBarButtonItem:nil];
來刪除動作按鈕[[self navigationItem] setRightBarButtonItem:nil];
這也將刪除與其他應用共享文件的功能。 如果您對這種損失感到滿意,那么這是最簡單的解決方案。 需要注意的一點是, QLPreviewController
不是為了自定義。 您可以在Github上查看此存儲庫 。 它包含一個已經安全子類化的QLPreviewController。 您只需添加一行即可刪除操作按鈕。 回購還有其他一些便利。
更好但更復雜的解決方案是使用UIDocumentInteractionController
。 根據我對QLPreviewController
理解,它是使用UIDocumentInteractionController
。 QLPreviewController
是為一般使用而且易於添加的。 UIDocumentInteractionController
提供了更多的控制,但更UIDocumentInteractionController
。 我不能在這里充分描述如何使用它。 我建議您查看WWDC 2010會話106了解文檔交互控制器。
至於禁用剪切/復制/粘貼,你不能用QLPreviewController
做到這QLPreviewController
。 您可以使用UIDocumentInteractionController
執行此UIDocumentInteractionController
,但我不會指望它。 根據您要顯示的文件,您可以執行完全自定義的實現,但這需要做很多工作。 為純文本,照片,視頻和PDF制作觀眾相對容易。 Office文檔比它的價值更多。
編輯:
我已經建立了將動作按鈕移到RBFilePreviewer
因此您不必擔心自己動手。
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self navigationItem].rightBarButtonItems = nil;
}
適用於我而不是[[self navigationItem] setRightBarButtonItem:nil];
如果你QLPreviewController
,然后添加這個方法:
-(void)viewDidAppear:(BOOL)animated{
[[self navigationItem] setRightBarButtonItem:nil];
}
在子類中,動作按鈕將消失,如上面的rbrown說明。 如果使用viewWillAppear
則無效。 此外,執行此操作的意外副作用是預覽中的工具欄現在始終顯示,而不是僅在您點擊視圖時。
我還需要定制的導覽樹狀項目QLPreviewController
。 就像rbrown說的那樣,使用了XPC,我們無法再在viewDidLoad
或viewWillAppear
添加自定義項。
目前我用這種方式:
UIViewController
類 QLPreviewController
的視圖添加到新類 它似乎有線但有效。
我用這種方式解決了這個問題:
UIView *viewPreviewController; //from storyboard
QLPreviewController *previewController = [[QLPreviewController alloc] init];
previewController.delegate = self;
previewController.dataSource = self;
previewController.currentPreviewItemIndex = 0;
[previewController.view setFrame:CGRectMake(0,0, self.viewPreviewController.frame.size.width, self.viewPreviewController.frame.size.height)];
[previewController.navigationController setHidesBarsOnTap:YES];
previewController.navigationItem.rightBarButtonItems = nil;
[self.viewPreviewController addSubview:previewController.view];
如果我沒有在UIView中包含previewController,那么它將無法工作!
我找到了一個解決方案來禁用QLPreviewController
中的rightBarButtonItem
,它在iOS8和iOS9中對我來說很好用
您只需要子類化QLPreviewController
並覆蓋以下方法,然后使用您的子類而不是原始的QLPreviewController
- (void)viewDidLoad {
[super viewDidLoad];
// When coming back from background we make sure the share button on the rightbBarButtonItem is disabled
__weak typeof(self) weakSelf = self;
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
weakSelf.navigationItem.rightBarButtonItem.enabled = NO;
}];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationItem.rightBarButtonItem.enabled = NO; // Disable the share button
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.navigationItem.rightBarButtonItem.enabled = NO; // Disable the share button
}
這項工作對我來說。 你必須調試子導航控制器
class QLSPreviewController : QLPreviewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true )
//This hides the share item
if let add = self.childViewControllers.first as? UINavigationController {
if let layoutContainerView = add.view.subviews[1] as? UINavigationBar {
layoutContainerView.subviews[2].subviews[1].isHidden = true
}
}
}
}
此子類適用於Swift 4.2和iOS 12 。 它使用一種技巧來確保共享圖標被隱藏而不會在用戶眼中閃爍。
import QuickLook
import UIKit
class PreviewController: QLPreviewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
guard let layoutContainerView = self.children.first?.view.subviews[1] as? UINavigationBar else { return }
layoutContainerView.isHidden = true
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
guard let layoutContainerView = self.children.first?.view.subviews[1] as? UINavigationBar else { return }
layoutContainerView.subviews[2].subviews[1].isHidden = true
layoutContainerView.isHidden = false
}
}
我解決了同樣的問題:
let previewVC = QLPreviewController()
override func viewDidLoad() {
super.viewDidLoad()
previewVC.navigationItem.rightBarButtonItem = UIBarButtonItem()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.