An iOS drawer controller in swift
- Xcode 10.2+
- Swift 5.0+
- iOS Deployment Target 10.0+
CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:
$ gem install cocoapods
To integrate ZKDrawerController into your Xcode project using CocoaPods, specify it in your Podfile
:
source 'https://github.com/superk589/ZKDrawerController.git'
platform :ios, '8.0'
use_frameworks!
target 'YourApp' do
pod 'ZKDrawerController'
end
Then, run the following command:
$ pod install
Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.
You can install Carthage with Homebrew using the following command:
$ brew update
$ brew install carthage
To integrate ZKDrawerController into your Xcode project using Carthage, specify it in your Cartfile
:
github "superk589/ZKDrawerController"
Run carthage update
to build the framework and drag the built ZKDrawerController.framework
into your Xcode project.
Declare ZKDrawerController as a package dependency.
.package(
name: "ZKDrawerController",
url: "https://github.com/superk589/ZKDrawerController",
.upToNextMinor(from: "0.6.1")),
If you prefer not to use either of the aforementioned dependency managers, you can integrate ZKDrawerController into your project manually.
let centerController = UIViewController()
let leftController = UIViewController()
let rightController = UIViewController()
let drawerController = ZKDrawerController(center: centerController, right: rightController)
let drawerController = ZKDrawerController(center: centerController, left: leftController)
let drawerController = ZKDrawerController(center: centerController, right: rightController, left: leftController)
// have none of the two sides, and then add dynamically
let drawerController = ZKDrawerController(center: centerController)
drawerController.rightViewController = UIViewController()
// side controller covers the main controller, shadows the edge of side controllers' view
drawerController.drawerStyle = .cover
// side controller inserts below the main controller, shadows the edge of main controller's view
drawerController.drawerStyle = .insert
// side controller lays beside the main controller
drawerController.drawerStyle = .plain
drawerController.show(.right, animated: true)
drawerController.show(.left, animated: true)
drawerController.hide(animated: true)
// scale should be 0 to 1
drawerController.mainScale = 0.8
// set background color
drawerController.containerView.backgroundColor = UIColor.white
// set background image
drawerController.backgroundImageView.image = image
// this view will change it's alpha while side view is showing from 0 to 1
drawerController.mainCoverView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
drawerController.defaultRightWidth = 300
drawerController.defaultLeftWidth = 300
drawerController.shadowWidth = 5
drawerController.gestureRecognizerWidth = 40
The default is true (if set to false, showing left drawer gesture will have higher priority)
drawerController.shouldRequireFailureOfNavigationPopGesture = true
Higher priority gestures will process before drawer controller's gesture and lower priority gestures will process after failure of drawer controller's gesture
drawerController.higherPriorityGestures = [gesture1, gesture2]
drawerController.lowerPriorityGestures = [gesture3, gesture4]
// set or replace
drawerController.centerViewController = newViewController
drawerController.rightViewController = newViewController
drawerController.leftViewController = newViewController
// remove the side view controller, mainVC can not be removed
drawerController.rightViewController = nil
drawerController.leftViewController = nil
Use ZKDrawerController as your root controller and show various main controller-based side controllers.
// in AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let home = ViewController()
let nav = UINavigationController(rootViewController: home)
let drawer = ZKDrawerController(center: nav, right: nil, left: nil)
// do some setup
drawer.mainScale = 0.8
drawer.drawerStyle = .cover
// ...
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = drawer
window?.makeKeyAndVisible()
home.drawerController = drawer
return true
}
// in ViewController.swift
var drawerController: ZKDrawerController!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let vc = UIViewController()
drawerController.rightViewController = vc
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
drawerController.rightViewController = nil
}