隐藏右键n QLPreviewController?

时间:2014-04-09 04:58:41

标签: ios qlpreviewcontroller

我在我的应用程序中使用以下代码继承QLPreviewController。

QLPreviewControllerSubClass* preview = [[QLPreviewControllerSubClass alloc] init];
  [self presentViewController:preview
                       animated:YES
                     completion:^()
                    {
                         // do more stuff here
                     }];

我想隐藏正确的按钮.Tried

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

但它没有隐藏。任何帮助都会很明显

8 个答案:

答案 0 :(得分:0)

我也在处理同样的问题。

我隐藏了rightBarButton,但是当加载pdf持续很长时间时可能会遇到一些问题。

以下是我的流程。

1.制作QLPreviewController的子类。

2.添加一个计时器,重复在类init时将rightBarButton设置为nil。

_hideRightBarButtonTimmer = [NSTimer scheduledTimerWithTimeInterval:0.01
                                                                 target:self
                                                               selector:@selector(hideRightButton)
                                                               userInfo:nil
                                                                repeats:YES];

3.在viewDidAppear中使计时器失效。

[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(cancelTimmer) userInfo:nil repeats:NO];

我发现在加载pdf文件完成时设置了rightBarButton。如果我们能够检测到该事件,那么解决方案将变得更加容易和清晰。

希望它会有所帮助。

答案 1 :(得分:0)

对此的简单解决方案是向当前viewController添加一个虚拟视图,并将QLPreviewControlle.view添加到虚拟视图。

 previewController = [[QLPreviewController alloc] init];
 previewController.dataSource = self;
 previewController.delegate = self;
 previewController.currentPreviewItemIndex = 0;

[self.ContentView addSubview:previewController.view];



- (IBAction)removeQPView:(id)sender {

    [previewController.view removeFromSuperview];
}

答案 2 :(得分:0)

我找到了一个解决方案,禁用(不隐藏rightBarButtonItem中的QLPreviewController

该解决方案适用于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
}

答案 3 :(得分:0)

使用swift在iOS 9上测试。

最近不得不解决这个问题并且找不到隐藏这个按钮的方法。我终于使用this stackoverflow post的答案设法隐藏了正确的分享按钮。

基本上,您希望子类化QLPreviewController并在viewWillAppear()函数中调用inspectSubviewForView()函数。找到包含共享按钮的导航项后,您可以将其删除:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    // ** traverse subviews until we find the share button ** //
    inspectSubviewForView(self.view)
}

func inspectSubviewForView(view: UIView) {
    for subview in view.subviews {
        if subview is UINavigationBar {
            // ** Found a Nav bar, check for navigation items. ** //
            let bar = subview as! UINavigationBar

            if bar.items?.count > 0 {
                if let navItem = bar.items?[0] {
                    // ** Found the share button, hide it! ** //
                    hideRightBarItem(navItem)
                }
            }
        }
        if subview.subviews.count > 0 {
            // ** this subview has more subviews! Inspect them! ** //
            inspectSubviewForView(subview)
        }
    }
}

func hideRightBarItem(navigationItem: UINavigationItem) {
    // ** Hide/Remove the Share button ** //
    navigationItem.setRightBarButtonItem(nil, animated: false)
}

上述链接中的上一张海报警告说,当您访问私有API时,可能无法通过Apple的审核流程,因此请自行承担风险!此外,如果Apple在更高版本的iOS中更新QLPreviewController,则此代码可能不再有效。

尽管如此,这是唯一对我有用的解决方案。我希望它也适合你!

答案 4 :(得分:0)

感谢Matthew Kostelecky,我能够隐藏分享按钮,但我想在具有多个文件的通用应用程序中添加一些需要此功能的细节。

首先,如果您以模态方式使用QLPreviewController,Matthew的答案将起作用。 如果您从导航控制器中按下这样的QLPreviewController;

navigationController?.pushViewController(quickLookController, animated: true)

它无法找到任何NavigationBar或ToolBar。 你应该像这样以模态方式调用QLPreviewController;

presentViewController(quickLookController, animated: true, completion: nil)

此外,如果您正在开发通用应用程序,并且您有要播放的文件列表。将有另一个按钮(列表按钮);

在iPhone中,如果您有多个文件,QLPreviewController将创建工具栏以显示“列表按钮”和“共享按钮”,这两个文件都将在ToolBar上。
在iPad中,这两个按钮都在NavigationBar上,没有ToolBar。

除了Matthew的回答之外,如果你在iphone中有多个文件,你应该搜索toolBar;

 func inspectSubviewForView(view: UIView) {
    for subview in view.subviews {
        if subview is UINavigationBar {
            // ** Found a Nav bar, check for navigation items. ** //
            let bar = subview as! UINavigationBar

            if bar.items?.count > 0 {
                if let navItem = bar.items?[0] {
                    navItem.setRightBarButtonItem(nil, animated: false)
                }
            }
        }
        if subview is UIToolbar {
            // ** Found a Tool bar, check for ToolBar items. ** //
            let bar = subview as! UIToolbar
            if bar.items?.count > 0 {
                if let toolBarItem = bar.items?[0] {
                    toolBarItem.enabled = false
                }
            }
        }

        if subview.subviews.count > 0 {
            // ** this subview has more subviews! Inspect them! ** //
            inspectSubviewForView(subview)
        }
    }
}

这段代码将隐藏iPad上的分享按钮并禁用iPhone上的分享按钮。

希望对那些仍然需要它的人有所帮助。

答案 5 :(得分:0)

实现此目标的另一种方法是通过继承UIToolbar并覆盖setItems(_:animated:)。如果要删除所有或仅返回要保留的按钮,则可以返回空数组。以下是PreviewControllerHideBottomButtons

的示例

答案 6 :(得分:0)

转到QLPreviewController的子类并使用下面提到的代码,这对我使用Xcode 8.3只能正常工作。

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if let firstView = self.childViewControllers.first    {
            for view in firstView.view.subviews    {
                if view.isKind(of: UIToolbar.self) {
                    view.removeFromSuperview()
                }
            }
        }
    }

答案 7 :(得分:0)

简单易用,可以导入quicklook并创建QL-Click here for Result which u all need, working well

导入UIKit
导入QuickLook。
类QLSubclass:QLPreviewController,QLPreviewControllerDataSource {

<script src="https://d3js.org/d3-selection.v1.min.js"></script>
<script src="https://d3js.org/d3-path.v1.min.js"></script>
<script src="https://d3js.org/d3-shape.v1.min.js"></script>

<svg width="700" height="110">
  <path></path>
</svg>

}

然后在您的视图控制器类中-

PatternVC类:UIViewController,UIDocumentInteractionControllerDelegate,UINavigationControllerDelegate {

var p = NSURL()
override func viewDidLoad() {
    super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
}
override func viewDidLayoutSubviews() {
    navigationItem.rightBarButtonItems?[0] = UIBarButtonItem()
}
func show(controller: UIViewController, url: NSURL) {
    // Refreshing the view
    p = url
    self.dataSource = self
    self.reloadData()
    // Printing the doc
    if let navController = controller.navigationController {
        navController.pushViewController(self, animated: true)
    }
    else {
        controller.show(self, sender: nil)
    }
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
    let doc = p
    return doc
}
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
    return 1
}

还添加了用于保存在视图控制器本地中的功能- //下载请求-----

var link = ""
override func viewDidLoad() {
    super.viewDidLoad()
    let url = "YOUR_URL_LINK"
  //check file exist in local or not------
    if  isFileExist(imgURL: url) {
     //Found then show
        let loadPath = loadDataFromDirectory(imgURL: url)
        showFileWithPath(path: loadPath)
    }else {
        //save in local
        saveDataOnDocumentDirectory(imgURL: url)
    }
}
override func viewDidLayoutSubviews() {
    self.navigationController?.setNavigationBarHidden(true, animated: false)
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}//Open data
func showFileWithPath(path: String){
    let isFileFound:Bool? = FileManager.default.fileExists(atPath: path)
    if isFileFound == true{
        QLSubclass().show(controller: self, url: URL(fileURLWithPath: path) as NSURL)
    }else{}}

此后包括视图扩展PatternVC的扩展:URLSessionDelegate,URLSessionDownloadDelegate {

private var downloadTask: URLSessionDownloadTask?
func saveDataOnDocumentDirectory(imgURL: String) {
    //let url = URL(string: imgURL)
    let escapedAddress = imgURL.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
    let url2 = URL(string: escapedAddress!)
    let sessionConfig = URLSessionConfiguration.default
    //let sessionConfig = URLSessionConfiguration.background(withIdentifier: "backgroundSession")
    let session: URLSession! = URLSession(configuration: sessionConfig, delegate: self, delegateQueue:  nil)
    downloadTask = session.downloadTask(with: url2!)
    downloadTask?.resume()
    DispatchQueue.main.async {
    }
}}