繁体   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