如何禁用QLPreviewController的打印按钮

9

有人能告诉我如何移除QLPreviewController的打印按钮吗?还希望禁用剪切/复制/粘贴。


寻找iOS6的解决方案,请查看此处:http://stackoverflow.com/questions/13083546/qlpreviewcontroller-hide-print-button-in-ios6 - Krumelur
使用Xcode 8.3对我来说工作正常。https://stackoverflow.com/a/45344701/1603380 - Buntylm
9个回答

6

更新:

在iOS 6中,这种方法已经不再适用。快速查看在另一个使用XPC的进程中运行。更多细节请参见[此处][3]。我预计没有办法自定义QLPreviewController。以下答案仅适用于iOS 6之前的版本。


如果您想简单地移除操作按钮,您需要子类化QLPreviewController。然后在-viewWillAppear:中,通过调用[[self navigationItem] setRightBarButtonItem:nil];来移除操作按钮。这也将删除与其他应用程序共享文件的功能。如果您可以接受这种损失,那么这是最简单的解决方案。需要注意的一件事是,QLPreviewController不打算进行自定义。您可以查看Github上的 repository。它包含一个已经安全地子类化的QLPreviewController。您只需要添加一行代码以删除操作按钮。该存储库还具有其他一些便利功能。
更好但更复杂的解决方案是使用UIDocumentInteractionController。据我了解,QLPreviewController是使用UIDocumentInteractionController构建的。 QLPreviewController是为通用使用和简单添加而制作的。 UIDocumentInteractionController提供了更多的控制,但使用起来更困难。我无法在此处充分描述如何使用它。我建议查看WWDC 2010会议106 Understanding Document Interaction Controller。

至于禁用剪切/复制/粘贴,您无法使用QLPreviewController实现。您可能可以使用UIDocumentInteractionController实现,但我不会指望它。根据您想要显示的文件类型,您可以进行完全自定义的实现,但那是很多工作。制作纯文本、照片、视频和PDF的查看器相对容易。办公文档比它值得的努力要多。

编辑:

我已经将删除操作按钮的功能直接构建到RBFilePreviewer中,因此您不必担心自己完成它。


谢谢。只有在“viewDidAppear”中设置“setRightBarButtonItem:nil”时才有效。 - ricardo somarriba
1
-viewDidAppear 不是一个合适的放置位置。如果可能的话,在 -viewWillAppear 中会更好。另外,您是否会点赞/接受我的答案为正确答案? - rbrown
1
事实证明,删除操作按钮并不像我想象的那么简单。QLPreviewController在底层有很多怪癖。现在,RBFilePreviewer已经内置了该功能,并处理了所有不同的情况。此外,我还修复了原始QLPreviewController中的一个“错误”,导致它在被推送而不是以模态方式呈现时无法显示文档导航栏。您还可以在我的演示存储库中查看RBFilePreviewer的演示:https://github.com/rob-brown/Demos。 - rbrown
@rbrown:我已经开始测试QuickLook框架,但在iPhone 3GS + iOS4.0上测试时出现了奇怪的泄漏问题。即使使用纯框架也会出现泄漏。然而,在iPhone 4 + iOS 5.0上使用时没有泄漏。最近,我已经在http://stackoverflow.com/questions/7992308/strange-leak-when-using-quicklook-framework-in-ios4-0上发布了这个问题。如果您也能测试一下这个泄漏问题,那就太有趣了 :) - Centurion
2
RBFilePreviewer在iOS6以上的版本中不再可用 :( 至少,删除按钮部分不可用... - DOOManiac
1
它不适用于iOS 8 GM Seed。请提供其他建议。 - Meet

2
如果你要子类化 QLPreviewController 并添加一个方法:
-(void)viewDidAppear:(BOOL)animated{

    [[self navigationItem] setRightBarButtonItem:nil]; 
}

在子类中,如rbrown所述,操作按钮将消失。如果使用viewWillAppear,这种方法将无效。此外,这样做的一个意外副作用是,在预览模式下,工具栏现在始终显示,而不仅仅在您点击视图时显示。

这种方法行不通,就像Neogene Sparanza之前的回答一样,如果你有很多文档要预览 - 在更改文档后,所有东西都会变成之前的样子。 - Eugene Dudnyk

2
-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    [self navigationItem].rightBarButtonItems = nil;
}

使用Works for me替代[[self navigationItem] setRightBarButtonItem:nil];


对我也有效,但是箭头的“下一个”和“上一个”按钮神奇地消失了,只剩下两个黑色的空按钮。 - Gonzo Oin

1
我还需要自定义QLPreviewController的导航项。就像rbrown所说,使用了XPC,我们不能再在viewDidLoadviewWillAppear中添加自定义项。
目前我是这样做的:
  1. 创建一个新的UIViewController
  2. QLPreviewController的视图添加到新类中
看起来有些奇怪,但是可行。

0

这对我有用。你必须调试子导航控制器。

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
            }
        }
    }
}

0

我找到了一个在iOS8和iOS9中对QLPreviewControllerrightBarButtonItem进行禁用的解决方案,对我来说效果很好。

你只需要子类化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
}

0

我用以下方法解决了相同的问题:

let previewVC = QLPreviewController()

override func viewDidLoad() {

    super.viewDidLoad()

    previewVC.navigationItem.rightBarButtonItem = UIBarButtonItem()
}

0

这个子类适用于 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
    }
}

0
我用以下方法解决了这个问题:
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];

如果我没有将previewController嵌入到UIView中,那么它就无法工作!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接