有人能告诉我如何移除QLPreviewController的打印按钮吗?还希望禁用剪切/复制/粘贴。
有人能告诉我如何移除QLPreviewController的打印按钮吗?还希望禁用剪切/复制/粘贴。
更新:
在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
中,因此您不必担心自己完成它。
QLPreviewController
并添加一个方法:-(void)viewDidAppear:(BOOL)animated{
[[self navigationItem] setRightBarButtonItem:nil];
}
viewWillAppear
,这种方法将无效。此外,这样做的一个意外副作用是,在预览模式下,工具栏现在始终显示,而不仅仅在您点击视图时显示。-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self navigationItem].rightBarButtonItems = nil;
}
使用Works for me
替代[[self navigationItem] setRightBarButtonItem:nil];
QLPreviewController
的导航项。就像rbrown所说,使用了XPC,我们不能再在viewDidLoad
或viewWillAppear
中添加自定义项。UIViewController
类QLPreviewController
的视图添加到新类中这对我有用。你必须调试子导航控制器。
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
}
}
}
}
我找到了一个在iOS8和iOS9中对QLPreviewController
的rightBarButtonItem
进行禁用的解决方案,对我来说效果很好。
你只需要子类化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
}
我用以下方法解决了相同的问题:
let previewVC = QLPreviewController()
override func viewDidLoad() {
super.viewDidLoad()
previewVC.navigationItem.rightBarButtonItem = UIBarButtonItem()
}
这个子类适用于 Swift 4.2 和 iOS 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
}
}
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];