iOS Interactive Side Menu written in Swift.
It supports following customization:
- Animation duration
- Visible content width
- Content scale
- Using spring animation with params customization
- Animation options like animation curve
All these parameters could vary for different orientations.
- If you need help or found a bug, please, open an issue.
- If you have a feature request, open an issue.
- If you are ready to contribute, submit a pull request.
- If you like Interactive Side Menu, please, give it a star.
- If you use Interactive Side Menu in your application published to AppStore, send us a link and we'll create the list with applications used our library.
You can find more details into CONTRIBUTING file.
To install it through CocoaPods, add the following line to your Podfile:
pod 'InteractiveSideMenu'
Please, don't forget to run pod update
command to update your local specs repository during migration from one version to another.
To install it through Carthage, add the following line to your Cartfile:
github "handsomecode/InteractiveSideMenu"
To implement your side menu you should create subclasses of basic View Controllers.
MenuContainerViewController
is a host for menu and content viewsMenuViewController
is a container for menu view
Also, ensure that every menu item ViewController adopts relevant protocol.
SideMenuItemContent
is a ViewController's protocol for data that corresponds menu item
To setup your side menu you need to do three things:
- Provide implementation of base
MenuViewController
and assing it tomenuViewController
property - Provide implementation of menu content and assing array of content controllers to
contentViewControllers
property - Select initial content controller by calling
selectContentViewController(_ selectedContentVC: MenuItemContentViewController)
import InteractiveSideMenu
class HostViewController: MenuContainerViewController {
override func viewDidLoad() {
super.viewDidLoad()
menuViewController = self.storyboard!.instantiateViewController(withIdentifier: "NavigationMenu") as! MenuViewController
contentViewControllers = contentControllers()
selectContentViewController(contentViewControllers.first!)
}
private func contentControllers() -> [MenuItemContentViewController] {
var contentList = [MenuItemContentViewController]()
contentList.append(self.storyboard?.instantiateViewController(withIdentifier: "First") as! MenuItemContentViewController)
contentList.append(self.storyboard?.instantiateViewController(withIdentifier: "Second") as! MenuItemContentViewController)
return contentList
}
}
To show menu, call showSideMenu()
method from SideMenuItemContent
protocol.
import InteractiveSideMenu
class KittyViewController: UIViewController, SideMenuItemContent {
@IBAction func openMenu(_ sender: UIButton) {
showSideMenu()
}
}
To change content view, choose desired content controller and hide menu.
let index = 2 // Second menu item
guard let menuContainerViewController = self.menuContainerViewController else { return }
let contentController = menuContainerViewController.contentViewControllers[index]
menuContainerViewController.selectContentViewController(contentController)
menuContainerViewController.hideSideMenu()
To use menu with TabBar or NavigationController, ensure that you indicate UITabBarController or UINavigationController as item content directly, not any corresponding ViewControllers.
class NavigationViewController: UINavigationController, SideMenuItemContent {
}
class InnerViewController: UIViewController {
@IBAction func openMenu(_ sender: Any) {
if let navigationViewController = self.navigationController as? SideMenuItemContent {
navigationViewController.showSideMenu()
}
}
}
Please, find UITabBarController implementation details in Sample.
To customize animation for menu opening or closing, update transitionOptions
property that is available in MenuContainerViewColtroller
class. Initial setup could be done, for example, on controller's viewDidLoad()
.
override func viewDidLoad() {
super.viewDidLoad()
let screenSize: CGRect = UIScreen.main.bounds
self.transitionOptions = TransitionOptions(duration: 0.4, visibleContentWidth: screenSize.width / 6)
...
}
Also, you have possibility to update customization settings, e.g. set another options for landscape orientation. To do it, override viewWillTransition(to:with:)
mehod and add desired parameters to transitionOptions
property.
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
var options = TransitionOptions()
options.duration = size.width < size.height ? 0.4 : 0.6
options.visibleContentWidth = size.width / 6
self.transitionOptions = options
}
Transition options could be used to set different parameters for Compact and Regular sizes as well. Implement ViewController's traitCollectionDidChange(_: )
method to add these settings.
Use Sample to see implementation details and CHANGELOG to get more information about updating library from v1.0 to v2.0.
- iOS 8.0+
- Xcode 8.1+
- Swift 3.0+
InteractiveSideMenu is available under the Apache License, Version 2.0. See the LICENSE file for more info.