TestsTested | ✗ |
LangLanguage | SwiftSwift |
License | Apache 2 |
ReleasedLast Release | Feb 2018 |
SwiftSwift Version | 3.0 |
SPMSupports SPM | ✗ |
Maintained by Andrey Arzhannikov, Olga Konoreva, Eric Miller.
iOS Interactive Side Menu written in Swift.
It supports following customization:
All these parameters could vary for different orientations.
You can find more details into CONTRIBUTING file.
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 viewAlso, ensure that every menu item ViewController adopts relevant protocol.
SideMenuItemContent
is a ViewController’s protocol for data that corresponds menu itemTo setup your side menu you need to do three things:
MenuViewController
and assing it to menuViewController
propertycontentViewControllers
propertyselectContentViewController(_ 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.
There is an issue associated with scaling of NavigationBar in iOS 11. Status bar background is hidden during side menu closing if contentScale < 1
. It’s supposed to be iOS 11 Navigation Bar issue that’s been reported to Apple.
InteractiveSideMenu is available under the Apache License, Version 2.0. See the LICENSE file for more info.