簡體   English   中英

如何禁用 QLPreviewController 打印按鈕

[英]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,我們無法再在viewDidLoadviewWillAppear添加自定義項。

目前我用這種方式:

  1. 創建一個新的UIViewController
  2. 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.2iOS 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM