QLPreviewController remove or add UIBarButtonItems

后端 未结 5 791
滥情空心
滥情空心 2020-12-01 11:21

I have seen this kind of question a lot on the internet but it seems no one really knows the answer?

I am using QLPreviewController for displaying PDF documents. I f

5条回答
  •  北海茫月
    2020-12-01 11:34

    I took the response from Lukas Gross and applied it in Swift on iOS 8 and came up with this solution that worked for me:

    NOTE: I have the QLPreviewController embedded in a UINavigationController!

    Code:

    var QLNavigationBar: UINavigationBar?
    var overlayNavigationBar: UINavigationBar?
    
    func getQLNavigationBar(fromView view: UIView) -> UINavigationBar? {
        for v in view.subviews {
            if v is UINavigationBar {
                return v as? UINavigationBar
            } else {
                if let navigationBar = self.getQLNavigationBar(fromView: (v as! UIView)) {
                    return navigationBar
                }
            }
        }
    
        return nil
    }
    
    func handleNavigationBar() {
        self.QLNavigationBar = self.getQLNavigationBar(fromView: self.navigationController!.view)
    
        self.overlayNavigationBar = UINavigationBar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 64.0))
        self.overlayNavigationBar?.autoresizingMask = UIViewAutoresizing.FlexibleWidth
    
        if let qln = self.QLNavigationBar {
            qln.addObserver(self, forKeyPath: "hidden", options: (NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old), context: nil)
            qln.superview?.addSubview(self.overlayNavigationBar!)
        }
    
        var item = UINavigationItem(title: self.navigationItem.title!)
        var doneBtn = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: "doneBtnPressed")
        item.leftBarButtonItem = doneBtn
        item.hidesBackButton = true
    
        self.overlayNavigationBar?.pushNavigationItem(item, animated: false)
        self.overlayNavigationBar?.tintColor = .whiteColor()
        self.overlayNavigationBar?.barTintColor = .blackColor()
        self.overlayNavigationBar?.titleTextAttributes = [
            NSForegroundColorAttributeName : UIColor.whiteColor() ]
    }
    

    And applying this code like this:

    override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer) {
        if self.QLNavigationBar!.hidden {
            self.overlayNavigationBar?.hidden = self.QLNavigationBar!.hidden
        }
    
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), {
            self.QLNavigationBar?.superview?.sendSubviewToBack(self.QLNavigationBar!)
    
            if !self.QLNavigationBar!.hidden {
                self.overlayNavigationBar?.hidden = self.QLNavigationBar!.hidden
            }
        })
    }
    
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
    
        self.handleNavigationBar()
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        self.overlayNavigationBar?.frame = CGRectMake(0, 0, self.view.bounds.size.width, 64.0)
    }
    

提交回复
热议问题