Ios 如何禁用QLViewController打印按钮

Ios 如何禁用QLViewController打印按钮,ios,pdf,qlpreviewcontroller,Ios,Pdf,Qlpreviewcontroller,有人能告诉我如何删除QLViewController打印按钮吗?还想禁用剪切/粘贴/复制。更新: 这在iOS 6中不再有效。Quick Look使用XPC在另一个进程中运行。有关详细信息,请参见[此处][3]。我没有预见到任何定制QLPreviewController的方法。以下答案仍然适用于对iOS 6之前版本感兴趣的任何人 如果只想删除操作按钮,则需要将其子类化为qlviewcontroller。然后在-view中将出现:您需要通过调用[[self-navigationItem]SetRi

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

更新:

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


如果只想删除操作按钮,则需要将其子类化为
qlviewcontroller
。然后在
-view中将出现:
您需要通过调用
[[self-navigationItem]SetRightBarButtonim:nil]删除操作按钮这也将删除与其他应用程序共享文件的功能。如果你对这一损失感到满意,那么这是最简单的解决办法。需要注意的一点是,
QLPreviewController
不是定制的。你可以在Github上查看这个。它包含一个已经被安全地子类化的QLPreviewController。只需添加一行即可删除操作按钮。回购协议还有其他一些便利

更好但更复杂的解决方案是使用
UIDocumentInteractionController
。根据我对
qlviewcontroller
的理解,它是使用
UIDocumentInteractionController
构建的
QLEVIEWCONTROLLER
是为通用和易于添加而设计的
UIDocumentInteractionController
提供了更多的控制,但更难使用。我无法充分描述如何在这里使用它。我建议查看WWDC 2010会话106了解文档交互控制器

至于禁用剪切/复制/粘贴,您不能使用
QLPreviewController
。您可能可以使用
UIDocumentInteractionController
实现这一点,但我不会指望它。根据您想要显示的文件,您可能可以执行完全自定义的实现,但这需要大量的工作。制作纯文本、照片、视频和PDF的查看器相对容易。办公室文档的工作量超过了它的价值

编辑:


我已经建立了将操作按钮直接删除到
RBFilePreviewer
中的功能,这样您就不必担心自己做了

如果您子类化
QLPreviewController
,然后添加此方法:

-(void)viewDidAppear:(BOOL)animated{

    [[self navigationItem] setRightBarButtonItem:nil]; 
}
在子类中,动作按钮将消失,如上面rbrown所述。如果使用
视图将出现
,则此操作将不起作用。此外,执行此操作的一个意外副作用是,预览上的工具栏现在始终显示,而不是仅在点击视图时显示

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

适用于我,而不是
[[self-navigationItem]setRightBarButtonim:nil]

我还需要自定义
QLPreviewController
的导航项。正如前面所说,使用了XPC,我们不能再在
viewDidLoad
viewwillbeen
中添加自定义项

目前我使用这种方式:

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];
  • 创建一个新的
    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];
    

    如果我没有将previewController合并到UIView中,那么它将无法工作

    我找到了一个在
    QLPreviewController
    中禁用
    rightBarButtonItem
    的解决方案,它在iOS8和iOS9中对我很好

    您只需子类化
    qlviewcontroller
    并覆盖以下方法,然后使用子类而不是原始的
    qlviewcontroller

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

    谢谢只有在我设置RightBarbuttonItem时才起作用:在“ViewDidAspect”中为零-ViewDidAspect是一个奇怪的地方。它在视图中工作吗?如果可能的话,那会好得多。另外,你是否会同意/接受我的答案是正确的?事实证明,删除操作按钮并不像我想的那么简单。QLPreviewController下面有很多怪癖。RBFilePreviewer现在内置了该功能,可以处理所有不同的情况。另外,我还修复了原始QLPreviewController中的一个“bug”,该bug导致它在按下时不显示文档导航栏,而不是以模式显示。您还可以在我的演示存储库中看到RBFilePreviewer的演示:。RBFilePreviewer从iOS6起不再工作:(至少,移除按钮部分不适用……它不适用于iOS 8 GM种子。请提供一些其他建议。对我也适用,但“下一步”和“上一步”按钮的箭头奇怪地消失了,留下两个黑色的空按钮。对于iOS 6的解决方案,请看这里:使用Xcode 8.3对我来说效果很好。这不起作用,正如Neogene之前的回答一样Sparanza,如果您有许多文档要预览-更改文档后,一切都会像之前一样。