9

谁能告诉我如何删除 QLPreviewController 打印按钮?还想禁用剪切/粘贴/复制。

4

9 回答 9

6

更新:

这不再适用于 iOS 6。Quick Look 在另一个使用 XPC 的进程中运行。有关详细信息,请参阅 [此处][3]。我没有预见到任何自定义 QLPreviewController 的方法。以下答案仍然适用于对 iOS 6 之前的版本感兴趣的任何人。


如果您想简单地删除您需要子类化的操作按钮QLPreviewController。然后,-viewWillAppear:您需要通过调用删除操作按钮[[self navigationItem] setRightBarButtonItem:nil];这也将删除与其他应用程序共享文件的能力。如果您对这种损失感到满意,那么这是最简单的解决方案。需要注意的一件事是,QLPreviewController它不打算定制。你可以在 Github 上查看这个存储库。它包含一个已经安全子类化的 QLPreviewController。您只需要添加一行即可删除操作按钮。回购还有其他一些便利。

更好但更复杂的解决方案是使用UIDocumentInteractionController. 据我了解QLPreviewController,它是使用UIDocumentInteractionController. QLPreviewController用于一般用途和易于添加。UIDocumentInteractionController提供更多控制,但更难使用。我无法充分描述如何在这里使用它。我建议查看 WWDC 2010 会议 106 了解文档交互控制器。

至于禁用剪切/复制/粘贴,你不能用QLPreviewController. 你也许可以做到这一点UIDocumentInteractionController,但我不会指望它。根据您要显示的文件,您可能能够进行完全自定义的实现,但这需要大量工作。制作纯文本、照片、视频和 PDF 的查看器相对容易。Office 文档付出的努力多于其价值。

编辑:

我已经内置了删除操作按钮的功能,RBFilePreviewer因此您不必担心自己动手。

于 2011-08-03T02:53:49.047 回答
2

如果您子类化QLPreviewController然后添加这个方法:

-(void)viewDidAppear:(BOOL)animated{

    [[self navigationItem] setRightBarButtonItem:nil]; 
}

在子类中,操作按钮将像上面的 rbrown 注释一样消失。如果您使用viewWillAppear. 此外,这样做的一个意想不到的副作用是预览上的工具栏现在始终出现,而不是仅在您点击视图时出现。

于 2011-10-15T14:20:24.940 回答
2
-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    [self navigationItem].rightBarButtonItems = nil;
}

为我工作而不是[[self navigationItem] setRightBarButtonItem:nil];

于 2012-06-06T08:51:13.267 回答
1

我还需要自定义QLPreviewController. 就像rbrown说的那样,使用了 XPC,我们不能再在viewDidLoador中添加自定义项目viewWillAppear

目前我使用这种方式:

  1. 创建一个新的类UIViewController
  2. 将视图添加QLPreviewController到新类

它似乎有线但有效。

于 2013-10-13T08:37:03.347 回答
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 中,那么它将无法正常工作!

于 2014-11-17T16:51:54.770 回答
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
    }
}
于 2019-04-02T09:51:47.950 回答
0

我找到了一个在 iOS8 和 iOS9 中禁用rightBarButtonItemQLPreviewController我来说很好的解决方案

您只需要子类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
}
于 2016-01-22T08:57:23.197 回答
0

我解决了同样的问题:

let previewVC = QLPreviewController()

override func viewDidLoad() {

    super.viewDidLoad()

    previewVC.navigationItem.rightBarButtonItem = UIBarButtonItem()
}
于 2022-03-03T07:00:42.873 回答
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
            }
        }
    }
}
于 2018-09-27T10:15:42.997 回答