KyleGoddard / KGFloatingDrawer

A floating navigation drawer with an interesting animated presentation written in Swift.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

How to use the library without window?.rootViewController ?

diogo10 opened this issue · comments

I would use it in one view that is not the mainScreen(in my case one third viewController). Is it possible? I have been tried but I couldn't find out how to do that. The menu just pop up if I use....

 window?.rootViewController = drawerViewController

Yes this can be done although it is quite complex.

First begin by creating a protocol in which you can delegate all the methods which normally reside on the AppDelegate

protocol ExternalDrawerDelegate {
    // Methods that must be delegated
    var centerViewController: UIViewController { get set }
    func rightViewController() -> UIViewController
    func leftViewController() -> UIViewController
    func toggleLeftDrawer(sender:AnyObject, animated:Bool)
    func toggleRightDrawer(sender:AnyObject, animated:Bool)

    // App Specific Delegation
    func drawerSettingsViewController() -> UIViewController
    func sourcePageViewController() -> UIViewController
}

The view controller which the KGFloatingDrawer would be attached to would look something like this

class ViewController: UIViewController, ExternalDrawerDelegate {

    let kKGDrawersStoryboardName = "Drawers"

    let kKGDrawerSettingsViewControllerStoryboardId = "KGDrawerSettingsViewControllerStoryboardId"
    let kKGDrawerWebViewViewControllerStoryboardId = "KGDrawerWebViewControllerStoryboardId"
    let kKGLeftDrawerStoryboardId = "KGLeftDrawerViewControllerStoryboardId"
    let kKGRightDrawerStoryboardId = "KGRightDrawerViewControllerStoryboardId"


    private var _drawerViewController: KGDrawerViewController?
    var drawerViewController: KGDrawerViewController {
        get {
            if let viewController = _drawerViewController {
                return viewController
            }
            return prepareDrawerViewController()
        }
    }

    func prepareDrawerViewController() -> KGDrawerViewController {
        let drawerViewController = KGDrawerViewController()

        drawerViewController.centerViewController = drawerSettingsViewController()
        drawerViewController.leftViewController = leftViewController()
        drawerViewController.rightViewController = rightViewController()
        drawerViewController.backgroundImage = UIImage(named: "sky3")

        _drawerViewController = drawerViewController

        return drawerViewController
    }

    private func drawerStoryboard() -> UIStoryboard {
        let storyboard = UIStoryboard(name: kKGDrawersStoryboardName, bundle: nil)
        return storyboard
    }

    private func viewControllerForStoryboardId(storyboardId: String) -> UIViewController {
        let viewController: UIViewController = drawerStoryboard().instantiateViewControllerWithIdentifier(storyboardId)
        return viewController
    }

    func drawerSettingsViewController() -> UIViewController {
        let viewController = viewControllerForStoryboardId(kKGDrawerSettingsViewControllerStoryboardId) as! UINavigationController
        let settings = viewController.topViewController as! KGDrawerSettingsTableViewController
        settings.extDelegate = self
        return viewController
    }

    func sourcePageViewController() -> UIViewController {
        let viewController = viewControllerForStoryboardId(kKGDrawerWebViewViewControllerStoryboardId) as! UINavigationController
        let sourcePage = viewController.topViewController as! KGDrawerWebViewViewController
        sourcePage.extDelegate = self
        return viewController
    }

    func leftViewController() -> UIViewController {
        let viewController: LeftDrawerTableViewController = viewControllerForStoryboardId(kKGLeftDrawerStoryboardId) as! LeftDrawerTableViewController
        viewController.extDelegate = self;
        return viewController
    }

    func rightViewController() -> UIViewController {
        let viewController = viewControllerForStoryboardId(kKGRightDrawerStoryboardId)
        return viewController
    }

    func toggleLeftDrawer(sender:AnyObject, animated:Bool) {
        _drawerViewController?.toggleDrawer(.Left, animated: true, complete: { (finished) -> Void in
            // do nothing
        })
    }

    func toggleRightDrawer(sender:AnyObject, animated:Bool) {
        _drawerViewController?.toggleDrawer(.Right, animated: true, complete: { (finished) -> Void in
            // do nothing
        })
    }

    private var _centerViewController: UIViewController?
    var centerViewController: UIViewController {
        get {
            if let viewController = _centerViewController {
                return viewController
            }
            return drawerSettingsViewController()
        }
        set {
            if let drawerViewController = _drawerViewController {
                drawerViewController.closeDrawer(drawerViewController.currentlyOpenedSide, animated: true) { finished in }
                if drawerViewController.centerViewController != newValue {
                    drawerViewController.centerViewController = newValue
                }
            }
            _centerViewController = newValue
        }
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.view.addSubview(self.drawerViewController.view)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

notice the delegation set in the various view controllers that would be presented as content, and also the left and right view controllers. If the left view controller was a table view it may look something like this

class LeftDrawerTableViewController: UITableViewController {

    var extDelegate: ExternalDrawerDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: <TableViewDataSource>

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        if indexPath.row == 2 {
            extDelegate?.centerViewController = (extDelegate?.sourcePageViewController())!
        } else if indexPath.row == 3 {
            extDelegate?.centerViewController = (extDelegate?.drawerSettingsViewController())!
        }
    }

    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        cell.backgroundColor = UIColor.clearColor()
    }

}

And the content view controller (which is a web view controller inside a navigation view controller on the storyboard) would look something like this.

class KGDrawerWebViewViewController: UIViewController {

    @IBOutlet weak var webView: UIWebView!

    var extDelegate : ExternalDrawerDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        let url: NSURL = NSURL(string: "https://github.com/KyleGoddard/KGFloatingDrawer")!
        let request = NSURLRequest(URL: url)

        webView.loadRequest(request)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

    @IBAction func toggleLeftDrawer(sender: AnyObject) {
        extDelegate?.toggleLeftDrawer(sender, animated: false)
    }

    @IBAction func toggleRightDrawer(sender: AnyObject) {
        extDelegate?.toggleRightDrawer(sender, animated: true)
    }
}

Hope you find this helpful.

Lovely KyleGoddard ! Thanks a lot

commented

This is very helpful. Thanks!