Compare commits
47 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 59faed8ef9 | |||
| 4f990e86a8 | |||
| 8200e0d49f | |||
| 5bb2f86b0a | |||
| c591059fbe | |||
| cf6ec23a7f | |||
| 21a7347079 | |||
| fc593b0cb7 | |||
| 55bfef578c | |||
| 620b248799 | |||
| 279ba484d3 | |||
| c46745cef8 | |||
| 8cc163dc5f | |||
| fae34995ab | |||
| 90878cc0d5 | |||
| 3f78b9bb49 | |||
| 6f8f224e00 | |||
| bc37f1b9cb | |||
| 8aff2b3627 | |||
| 135a3d2a94 | |||
| a10b94e351 | |||
| e1bf7c4991 | |||
| b19c93ff2c | |||
| 3968686410 | |||
| 0a457b414e | |||
| 5abf5ca740 | |||
| 498669bf58 | |||
| 159c87871b | |||
| 4c0733d82a | |||
| c3671408da | |||
| 3268b15e54 | |||
| 22a7723345 | |||
| 423b56b9ac | |||
| 06fbf875d0 | |||
| 9d9c22c786 | |||
| de1b010ac1 | |||
| d061bd178d | |||
| 93ddab1377 | |||
| 60854beac1 | |||
| 2e8740a91e | |||
| b387ef2dd7 | |||
| 22596320a3 | |||
| 9363b747d1 | |||
| baae6186d7 | |||
| c5f80f954c | |||
| 493fa9a7a1 | |||
| 2de8d7f758 |
@@ -0,0 +1,39 @@
|
||||
# iOS CircleCI 2.0 configuration file
|
||||
#
|
||||
# Check https://circleci.com/docs/2.0/ios-migrating-from-1-2/ for more details
|
||||
#
|
||||
version: 2
|
||||
jobs:
|
||||
build:
|
||||
|
||||
# Specify the Xcode version to use
|
||||
macos:
|
||||
xcode: "10.3.0"
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
# Install CocoaPods
|
||||
- run:
|
||||
name: Install CocoaPods
|
||||
command: pod install
|
||||
|
||||
# Build the app and run tests
|
||||
- run:
|
||||
name: Build and run tests
|
||||
command: fastlane scan
|
||||
environment:
|
||||
SCAN_DEVICE: iPhone Xʀ
|
||||
SCAN_SCHEME: SideMenu Example
|
||||
|
||||
# Collect XML test results data to show in the UI,
|
||||
# and save the same XML files under test-results folder
|
||||
# in the Artifacts tab
|
||||
- store_test_results:
|
||||
path: test_output/report.xml
|
||||
- store_artifacts:
|
||||
path: /tmp/test-results
|
||||
destination: scan-test-results
|
||||
- store_artifacts:
|
||||
path: ~/Library/Logs/scan
|
||||
destination: scan-logs
|
||||
@@ -291,7 +291,7 @@
|
||||
<!--Side Menu Navigation Controller-->
|
||||
<scene sceneID="Zbc-0f-8nT">
|
||||
<objects>
|
||||
<navigationController storyboardIdentifier="LeftMenuNavigationController" navigationBarHidden="YES" id="DuX-EW-0mP" customClass="UISideMenuNavigationController" customModule="SideMenu" sceneMemberID="viewController">
|
||||
<navigationController storyboardIdentifier="LeftMenuNavigationController" navigationBarHidden="YES" id="DuX-EW-0mP" customClass="SideMenuNavigationController" customModule="SideMenu" sceneMemberID="viewController">
|
||||
<navigationItem key="navigationItem" id="ipz-Lx-Wgf"/>
|
||||
<navigationBar key="navigationBar" contentMode="scaleToFill" id="35F-wh-r6h">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
@@ -423,7 +423,7 @@
|
||||
<!--Side Menu Navigation Controller-->
|
||||
<scene sceneID="kei-0w-mFw">
|
||||
<objects>
|
||||
<navigationController storyboardIdentifier="RightMenuNavigationController" navigationBarHidden="YES" id="z7k-fk-pfc" customClass="UISideMenuNavigationController" customModule="SideMenu" sceneMemberID="viewController">
|
||||
<navigationController storyboardIdentifier="RightMenuNavigationController" navigationBarHidden="YES" id="z7k-fk-pfc" customClass="SideMenuNavigationController" customModule="SideMenu" sceneMemberID="viewController">
|
||||
<navigationBar key="navigationBar" contentMode="scaleToFill" id="qOd-yQ-2i8">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</navigationBar>
|
||||
|
||||
@@ -26,14 +26,14 @@ class MainViewController: UIViewController {
|
||||
}
|
||||
|
||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
||||
guard let sideMenuNavigationController = segue.destination as? UISideMenuNavigationController else { return }
|
||||
guard let sideMenuNavigationController = segue.destination as? SideMenuNavigationController else { return }
|
||||
sideMenuNavigationController.settings = makeSettings()
|
||||
}
|
||||
|
||||
private func setupSideMenu() {
|
||||
// Define the menus
|
||||
SideMenuManager.default.leftMenuNavigationController = storyboard?.instantiateViewController(withIdentifier: "LeftMenuNavigationController") as? UISideMenuNavigationController
|
||||
SideMenuManager.default.rightMenuNavigationController = storyboard?.instantiateViewController(withIdentifier: "RightMenuNavigationController") as? UISideMenuNavigationController
|
||||
SideMenuManager.default.leftMenuNavigationController = storyboard?.instantiateViewController(withIdentifier: "LeftMenuNavigationController") as? SideMenuNavigationController
|
||||
SideMenuManager.default.rightMenuNavigationController = storyboard?.instantiateViewController(withIdentifier: "RightMenuNavigationController") as? SideMenuNavigationController
|
||||
|
||||
// Enable gestures. The left and/or right menus must be set up above for these to work.
|
||||
// Note that these continue to work on the Navigation Controller independent of the View Controller it displays!
|
||||
@@ -98,21 +98,21 @@ class MainViewController: UIViewController {
|
||||
}
|
||||
}
|
||||
|
||||
extension MainViewController: UISideMenuNavigationControllerDelegate {
|
||||
extension MainViewController: SideMenuNavigationControllerDelegate {
|
||||
|
||||
func sideMenuWillAppear(menu: UISideMenuNavigationController, animated: Bool) {
|
||||
func sideMenuWillAppear(menu: SideMenuNavigationController, animated: Bool) {
|
||||
print("SideMenu Appearing! (animated: \(animated))")
|
||||
}
|
||||
|
||||
func sideMenuDidAppear(menu: UISideMenuNavigationController, animated: Bool) {
|
||||
func sideMenuDidAppear(menu: SideMenuNavigationController, animated: Bool) {
|
||||
print("SideMenu Appeared! (animated: \(animated))")
|
||||
}
|
||||
|
||||
func sideMenuWillDisappear(menu: UISideMenuNavigationController, animated: Bool) {
|
||||
func sideMenuWillDisappear(menu: SideMenuNavigationController, animated: Bool) {
|
||||
print("SideMenu Disappearing! (animated: \(animated))")
|
||||
}
|
||||
|
||||
func sideMenuDidDisappear(menu: UISideMenuNavigationController, animated: Bool) {
|
||||
func sideMenuDidDisappear(menu: SideMenuNavigationController, animated: Bool) {
|
||||
print("SideMenu Disappeared! (animated: \(animated))")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
// Copyright © 2016 CocoaPods. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SideMenu
|
||||
|
||||
class SideMenuTableViewController: UITableViewController {
|
||||
@@ -17,7 +16,7 @@ class SideMenuTableViewController: UITableViewController {
|
||||
// refresh cell blur effect in case it changed
|
||||
tableView.reloadData()
|
||||
|
||||
guard let menu = navigationController as? UISideMenuNavigationController, menu.blurEffectStyle == nil else {
|
||||
guard let menu = navigationController as? SideMenuNavigationController, menu.blurEffectStyle == nil else {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -31,7 +30,7 @@ class SideMenuTableViewController: UITableViewController {
|
||||
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||
let cell = super.tableView(tableView, cellForRowAt: indexPath) as! UITableViewVibrantCell
|
||||
|
||||
if let menu = navigationController as? UISideMenuNavigationController {
|
||||
if let menu = navigationController as? SideMenuNavigationController {
|
||||
cell.blurEffectStyle = menu.blurEffectStyle
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
//
|
||||
// ExampleTests.swift
|
||||
// ExampleTests
|
||||
//
|
||||
// Created by Jon Kent on 8/10/19.
|
||||
// Copyright © 2019 jonkykong. All rights reserved.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
class ExampleTests: XCTestCase {
|
||||
|
||||
private let styleTitles = ["Slide In", "Slide Out", "In + Out", "Dissolve"]
|
||||
private let swipeHere = "Swipe Here"
|
||||
|
||||
private let app = XCUIApplication()
|
||||
private var mainViewController: XCUIElement {
|
||||
return app.navigationBars[swipeHere]
|
||||
}
|
||||
private var mainViewControllerNavigation: XCUIElement {
|
||||
return mainViewController.otherElements[swipeHere]
|
||||
}
|
||||
|
||||
override func setUp() {
|
||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||
|
||||
// In UI tests it is usually best to stop immediately when a failure occurs.
|
||||
continueAfterFailure = false
|
||||
|
||||
// UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
|
||||
XCUIApplication().launch()
|
||||
|
||||
// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
|
||||
}
|
||||
|
||||
override func tearDown() {
|
||||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||||
}
|
||||
|
||||
func testTapLeft() {
|
||||
let elementsQuery = app.scrollViews.otherElements
|
||||
for title in styleTitles {
|
||||
elementsQuery.buttons[title].tap()
|
||||
mainViewController.buttons["Left Menu"].tap()
|
||||
app.tables/*@START_MENU_TOKEN@*/.staticTexts["Push View Controller 1"]/*[[".cells.staticTexts[\"Push View Controller 1\"]",".staticTexts[\"Push View Controller 1\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap()
|
||||
app.navigationBars["You Can Still Swipe!"].buttons[swipeHere].tap()
|
||||
validate()
|
||||
}
|
||||
}
|
||||
|
||||
func testTapRight() {
|
||||
let elementsQuery = app.scrollViews.otherElements
|
||||
for title in styleTitles {
|
||||
elementsQuery.buttons[title].tap()
|
||||
mainViewController.buttons["Right Menu"].tap()
|
||||
app.tables/*@START_MENU_TOKEN@*/.staticTexts["Present View Controller 1"]/*[[".cells.staticTexts[\"Present View Controller 1\"]",".staticTexts[\"Present View Controller 1\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap()
|
||||
app.buttons["Dismiss"].tap()
|
||||
validate()
|
||||
}
|
||||
}
|
||||
|
||||
func testSwiping() {
|
||||
mainViewControllerNavigation.swipeRight()
|
||||
let element = app.children(matching: .window).element(boundBy: 0).children(matching: .other).element
|
||||
element.swipeLeft()
|
||||
validate()
|
||||
|
||||
element.swipeLeft()
|
||||
mainViewControllerNavigation.swipeLeft()
|
||||
element.swipeRight()
|
||||
validate()
|
||||
}
|
||||
|
||||
private func validate() {
|
||||
XCTAssertTrue(mainViewController.exists)
|
||||
}
|
||||
|
||||
/* TODO - More tests:
|
||||
- Rotation
|
||||
- All menu settings
|
||||
*/
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
@@ -16,8 +16,6 @@
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
import UIKit
|
||||
import XCTest
|
||||
import SideMenu
|
||||
|
||||
class Tests: XCTestCase {
|
||||
|
||||
override func setUp() {
|
||||
super.setUp()
|
||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||
}
|
||||
|
||||
override func tearDown() {
|
||||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||||
super.tearDown()
|
||||
}
|
||||
|
||||
func testExample() {
|
||||
// This is an example of a functional test case.
|
||||
XCTAssert(true, "Pass")
|
||||
}
|
||||
|
||||
func testPerformanceExample() {
|
||||
// This is an example of a performance test case.
|
||||
self.measure() {
|
||||
// Put the code you want to measure the time of here.
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,58 +5,60 @@
|
||||
// Created by Jon Kent on 7/3/19.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
// Deprecations; to be removed at a future date.
|
||||
extension SideMenuManager {
|
||||
|
||||
@available(*, deprecated, renamed: "leftMenuNavigationController")
|
||||
open var menuLeftNavigationController: UISideMenuNavigationController? {
|
||||
open var menuLeftNavigationController: SideMenuNavigationController? {
|
||||
get { return nil }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, renamed: "rightMenuNavigationController")
|
||||
open var menuRightNavigationController: UISideMenuNavigationController? {
|
||||
open var menuRightNavigationController: SideMenuNavigationController? {
|
||||
get { return nil }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuPresentMode: SideMenuPresentationStyle {
|
||||
get { return .viewSlideOut }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuPushStyle: SideMenuPushStyle {
|
||||
get { return .default }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuAllowPushOfSameClassTwice: Bool {
|
||||
get { return true }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuWidth: CGFloat {
|
||||
get { return 0 }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuAnimationPresentDuration: Double {
|
||||
get { return 0.35 }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuAnimationDismissDuration: Double {
|
||||
get { return 0.35 }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuAnimationCompleteGestureDuration: Double {
|
||||
get { return 0.35 }
|
||||
set {}
|
||||
@@ -98,7 +100,7 @@ extension SideMenuManager {
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuPresentingViewControllerUserInteractionEnabled: Bool {
|
||||
get { return false }
|
||||
set {}
|
||||
@@ -110,73 +112,73 @@ extension SideMenuManager {
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuFadeStatusBar: Bool {
|
||||
get { return true }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuAnimationOptions: UIView.AnimationOptions {
|
||||
get { return .curveEaseInOut }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuAnimationCompletionCurve: UIView.AnimationCurve {
|
||||
get { return .easeIn }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuAnimationUsingSpringWithDamping: CGFloat {
|
||||
get { return 1 }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuAnimationInitialSpringVelocity: CGFloat {
|
||||
get { return 1 }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuDismissOnPush: Bool {
|
||||
get { return true }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuAlwaysAnimate: Bool {
|
||||
get { return false }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuDismissWhenBackgrounded: Bool {
|
||||
get { return true }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuBlurEffectStyle: UIBlurEffect.Style? {
|
||||
get { return nil }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public weak var menuLeftSwipeToDismissGesture: UIPanGestureRecognizer? {
|
||||
get { return nil }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public weak var menuRightSwipeToDismissGesture: UIPanGestureRecognizer? {
|
||||
get { return nil }
|
||||
set {}
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "This property has been moved to the UISideMenuNavigationController class.")
|
||||
@available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.")
|
||||
public var menuEnableSwipeGestures: Bool {
|
||||
get { return true }
|
||||
set {}
|
||||
@@ -206,3 +208,9 @@ extension SideMenuPresentationStyle {
|
||||
@available(*, deprecated, renamed: "viewSlideOutMenuIn")
|
||||
public static var viewSlideInOut: SideMenuPresentationStyle { return viewSlideOutMenuIn }
|
||||
}
|
||||
|
||||
@available(*, deprecated, renamed: "SideMenuNavigationController")
|
||||
public typealias UISideMenuNavigationController = SideMenuNavigationController
|
||||
|
||||
@available(*, deprecated, renamed: "SideMenuNavigationControllerDelegate")
|
||||
public typealias UISideMenuNavigationControllerDelegate = SideMenuNavigationControllerDelegate
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
// Created by Jon Kent on 7/1/19.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
extension NSObject: InitializableClass {}
|
||||
|
||||
@@ -29,6 +29,13 @@ internal extension UIView {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
static func animationsEnabled(_ block: () -> Void) {
|
||||
let areAnimationsEnabled = UIView.areAnimationsEnabled
|
||||
UIView.setAnimationsEnabled(true)
|
||||
block()
|
||||
UIView.setAnimationsEnabled(areAnimationsEnabled)
|
||||
}
|
||||
}
|
||||
|
||||
internal extension UIViewController {
|
||||
@@ -46,7 +53,6 @@ internal extension UIViewController {
|
||||
}
|
||||
}
|
||||
|
||||
// Indicates if the menu is anywhere in the view hierarchy, even if covered by another view controller.
|
||||
@objc var isHidden: Bool {
|
||||
return presentingViewController == nil
|
||||
}
|
||||
@@ -64,6 +70,10 @@ internal extension UIGestureRecognizer {
|
||||
guard let view = view else { return nil }
|
||||
self.init(addTo: view, target: target, action: action)
|
||||
}
|
||||
|
||||
func remove() {
|
||||
view?.removeGestureRecognizer(self)
|
||||
}
|
||||
}
|
||||
|
||||
internal extension UIPanGestureRecognizer {
|
||||
|
||||
@@ -10,8 +10,8 @@ import Foundation
|
||||
internal protocol InitializableClass: class {
|
||||
init()
|
||||
}
|
||||
extension InitializableClass {
|
||||
|
||||
extension InitializableClass {
|
||||
init(_ block: (Self) -> Void) {
|
||||
self.init()
|
||||
block(self)
|
||||
@@ -23,10 +23,11 @@ extension InitializableClass {
|
||||
}
|
||||
}
|
||||
|
||||
internal protocol InitializableStruct {
|
||||
public protocol InitializableStruct {
|
||||
init()
|
||||
}
|
||||
internal extension InitializableStruct {
|
||||
|
||||
public extension InitializableStruct {
|
||||
init(_ block: (inout Self) -> Void) {
|
||||
self.init()
|
||||
block(&self)
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
//
|
||||
// Models.swift
|
||||
// SideMenu
|
||||
//
|
||||
// Created by Jon Kent on 7/3/19.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
internal protocol MenuModel: TransitionModel {
|
||||
/// Prevents the same view controller (or a view controller of the same class) from being pushed more than once. Defaults to true.
|
||||
var allowPushOfSameClassTwice: Bool { get }
|
||||
/// Forces menus to always animate when appearing or disappearing, regardless of a pushed view controller's animation.
|
||||
var alwaysAnimate: Bool { get }
|
||||
/**
|
||||
The blur effect style of the menu if the menu's root view controller is a UITableViewController or UICollectionViewController.
|
||||
|
||||
- Note: If you want cells in a UITableViewController menu to show vibrancy, make them a subclass of UITableViewVibrantCell.
|
||||
*/
|
||||
var blurEffectStyle: UIBlurEffect.Style? { get }
|
||||
/// Animation curve of the remaining animation when the menu is partially dismissed with gestures. Default is .easeIn.
|
||||
var completionCurve: UIView.AnimationCurve { get }
|
||||
/// Automatically dismisses the menu when another view is presented from it.
|
||||
var dismissOnPresent: Bool { get }
|
||||
/// Automatically dismisses the menu when another view controller is pushed from it.
|
||||
var dismissOnPush: Bool { get }
|
||||
/// Automatically dismisses the menu when the screen is rotated.
|
||||
var dismissOnRotation: Bool { get }
|
||||
/// Automatically dismisses the menu when app goes to the background.
|
||||
var dismissWhenBackgrounded: Bool { get }
|
||||
/// Enable or disable a swipe gesture that dismisses the menu. Will not be triggered when `presentingViewControllerUserInteractionEnabled` is set to true. Default is true.
|
||||
var enableSwipeToDismissGesture: Bool { get }
|
||||
/// Enable or disable a tap gesture that dismisses the menu. Will not be triggered when `presentingViewControllerUserInteractionEnabled` is set to true. Default is true.
|
||||
var enableTapToDismissGesture: Bool { get }
|
||||
/**
|
||||
The push style of the menu.
|
||||
|
||||
There are six modes in MenuPushStyle:
|
||||
- defaultBehavior: The view controller is pushed onto the stack.
|
||||
- popWhenPossible: If a view controller already in the stack is of the same class as the pushed view controller, the stack is instead popped back to the existing view controller. This behavior can help users from getting lost in a deep navigation stack.
|
||||
- preserve: If a view controller already in the stack is of the same class as the pushed view controller, the existing view controller is pushed to the end of the stack. This behavior is similar to a UITabBarController.
|
||||
- preserveAndHideBackButton: Same as .preserve and back buttons are automatically hidden.
|
||||
- replace: Any existing view controllers are released from the stack and replaced with the pushed view controller. Back buttons are automatically hidden. This behavior is ideal if view controllers require a lot of memory or their state doesn't need to be preserved..
|
||||
- subMenu: Unlike all other behaviors that push using the menu's presentingViewController, this behavior pushes view controllers within the menu. Use this behavior if you want to display a sub menu.
|
||||
*/
|
||||
var pushStyle: SideMenuPushStyle { get }
|
||||
}
|
||||
|
||||
internal protocol TransitionModel: PresentationModel {
|
||||
/// The animation options when a menu is displayed. Ignored when displayed with a gesture.
|
||||
var animationOptions: UIView.AnimationOptions { get }
|
||||
/// Duration of the remaining animation when the menu is partially dismissed with gestures. Default is 0.35 seconds.
|
||||
var completeGestureDuration: Double { get }
|
||||
/// Duration of the animation when the menu is dismissed without gestures. Default is 0.35 seconds.
|
||||
var dismissDuration: Double { get }
|
||||
/// The animation initial spring velocity when a menu is displayed. Ignored when displayed with a gesture.
|
||||
var initialSpringVelocity: CGFloat { get }
|
||||
/// Duration of the animation when the menu is presented without gestures. Default is 0.35 seconds.
|
||||
var presentDuration: Double { get }
|
||||
/// The animation spring damping when a menu is displayed. Ignored when displayed with a gesture.
|
||||
var usingSpringWithDamping: CGFloat { get }
|
||||
}
|
||||
|
||||
internal protocol PresentationModel {
|
||||
/// Draws `presentStyle.backgroundColor` behind the status bar. Default is 1.
|
||||
var statusBarEndAlpha: CGFloat { get }
|
||||
/// Enable or disable interaction with the presenting view controller while the menu is displayed. Enabling may make it difficult to dismiss the menu or cause exceptions if the user tries to present and already presented menu. `presentingViewControllerUseSnapshot` must also set to false. Default is false.
|
||||
var presentingViewControllerUserInteractionEnabled: Bool { get }
|
||||
/// Use a snapshot for the presenting vierw controller while the menu is displayed. Useful when layout changes occur during transitions. Not recommended for apps that support rotation. Default is false.
|
||||
var presentingViewControllerUseSnapshot: Bool { get }
|
||||
/// The presentation style of the menu.
|
||||
var presentationStyle: SideMenuPresentationStyle { get }
|
||||
/// Width of the menu when presented on screen, showing the existing view controller in the remaining space. Default is zero.
|
||||
var menuWidth: CGFloat { get }
|
||||
}
|
||||
@@ -9,8 +9,8 @@ import Foundation
|
||||
|
||||
internal enum Print: String { case
|
||||
cannotPush = "Attempt to push a View Controller from %@ where its navigationController == nil. It must be embedded in a UINavigationController for this to work.",
|
||||
emptyMenu = "The menu doesn't have a view controller to show! UISideMenuNavigationController needs a view controller to display just like a UINavigationController.",
|
||||
menuAlreadyAssigned = "%@ was already assigned to the %@ of %@. When using multiple SideMenuManagers you may want to use new instances of UISideMenuNavigationController instead of existing instances to avoid crashes if the menu is presented more than once.",
|
||||
emptyMenu = "The menu doesn't have a view controller to show! SideMenuNavigationController needs a view controller to display just like a UINavigationController.",
|
||||
menuAlreadyAssigned = "%@ was already assigned to the %@ of %@. When using multiple SideMenuManagers you may want to use new instances of SideMenuNavigationController instead of existing instances to avoid crashes if the menu is presented more than once.",
|
||||
menuInUse = "%@ cannot be modified while it's presented.",
|
||||
panGestureAdded = "%@ was called before %@ or %@ was set. Gestures will not work without a menu.",
|
||||
property = "A menu's %@ property can only be changed when it is hidden.",
|
||||
|
||||
@@ -0,0 +1,204 @@
|
||||
//
|
||||
// SideMenuAnimationController.swift
|
||||
// SideMenu
|
||||
//
|
||||
// Created by Jon Kent on 10/24/18.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
internal protocol AnimationModel {
|
||||
/// The animation options when a menu is displayed. Ignored when displayed with a gesture.
|
||||
var animationOptions: UIView.AnimationOptions { get }
|
||||
/// Duration of the remaining animation when the menu is partially dismissed with gestures. Default is 0.35 seconds.
|
||||
var completeGestureDuration: Double { get }
|
||||
/// Duration of the animation when the menu is dismissed without gestures. Default is 0.35 seconds.
|
||||
var dismissDuration: Double { get }
|
||||
/// The animation initial spring velocity when a menu is displayed. Ignored when displayed with a gesture.
|
||||
var initialSpringVelocity: CGFloat { get }
|
||||
/// Duration of the animation when the menu is presented without gestures. Default is 0.35 seconds.
|
||||
var presentDuration: Double { get }
|
||||
/// The animation spring damping when a menu is displayed. Ignored when displayed with a gesture.
|
||||
var usingSpringWithDamping: CGFloat { get }
|
||||
}
|
||||
|
||||
internal protocol SideMenuAnimationControllerDelegate: class {
|
||||
func sideMenuAnimationController(_ animationController: SideMenuAnimationController, didDismiss viewController: UIViewController)
|
||||
func sideMenuAnimationController(_ animationController: SideMenuAnimationController, didPresent viewController: UIViewController)
|
||||
}
|
||||
|
||||
internal final class SideMenuAnimationController: NSObject, UIViewControllerAnimatedTransitioning {
|
||||
|
||||
typealias Model = AnimationModel & PresentationModel
|
||||
|
||||
private var config: Model
|
||||
private weak var containerView: UIView?
|
||||
private let leftSide: Bool
|
||||
private var presentationController: SideMenuPresentationController!
|
||||
private unowned var presentedViewController: UIViewController?
|
||||
private unowned var presentingViewController: UIViewController?
|
||||
weak var delegate: SideMenuAnimationControllerDelegate?
|
||||
|
||||
init(config: Model, leftSide: Bool, delegate: SideMenuAnimationControllerDelegate? = nil) {
|
||||
self.config = config
|
||||
self.leftSide = leftSide
|
||||
self.delegate = delegate
|
||||
}
|
||||
|
||||
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
|
||||
guard
|
||||
let presentedViewController = transitionContext.presentedViewController,
|
||||
let presentingViewController = transitionContext.presentingViewController
|
||||
else { return }
|
||||
|
||||
if transitionContext.isPresenting {
|
||||
self.containerView = transitionContext.containerView
|
||||
self.presentedViewController = presentedViewController
|
||||
self.presentingViewController = presentingViewController
|
||||
self.presentationController = SideMenuPresentationController(
|
||||
config: config,
|
||||
leftSide: leftSide,
|
||||
presentedViewController: presentedViewController,
|
||||
presentingViewController: presentingViewController,
|
||||
containerView: transitionContext.containerView
|
||||
)
|
||||
}
|
||||
|
||||
transition(using: transitionContext)
|
||||
}
|
||||
|
||||
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
|
||||
guard let transitionContext = transitionContext else { return 0 }
|
||||
return duration(presenting: transitionContext.isPresenting, interactive: transitionContext.isInteractive)
|
||||
}
|
||||
|
||||
func animationEnded(_ transitionCompleted: Bool) {
|
||||
guard let presentedViewController = presentedViewController else { return }
|
||||
if presentedViewController.isHidden {
|
||||
delegate?.sideMenuAnimationController(self, didDismiss: presentedViewController)
|
||||
} else {
|
||||
delegate?.sideMenuAnimationController(self, didPresent: presentedViewController)
|
||||
}
|
||||
}
|
||||
|
||||
func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, alongsideTransition: (() -> Void)? = nil, complete: Bool = true, completion: ((Bool) -> Void)? = nil) {
|
||||
transitionWillBegin(presenting: presenting)
|
||||
transition(presenting: presenting,
|
||||
animated: animated,
|
||||
interactive: interactive,
|
||||
animations: { [weak self] in
|
||||
guard let self = self else { return }
|
||||
self.transition(presenting: presenting)
|
||||
alongsideTransition?()
|
||||
}, completion: { [weak self] _ in
|
||||
guard let self = self else { return }
|
||||
if complete {
|
||||
self.transitionDidEnd(presenting: presenting, completed: true)
|
||||
}
|
||||
completion?(true)
|
||||
})
|
||||
}
|
||||
|
||||
func layout() {
|
||||
presentationController.containerViewWillLayoutSubviews()
|
||||
}
|
||||
}
|
||||
|
||||
private extension SideMenuAnimationController {
|
||||
|
||||
func duration(presenting: Bool, interactive: Bool) -> Double {
|
||||
if interactive { return config.completeGestureDuration }
|
||||
return presenting ? config.presentDuration : config.dismissDuration
|
||||
}
|
||||
|
||||
func transitionWillBegin(presenting: Bool) {
|
||||
// prevent any other menu gestures from firing
|
||||
containerView?.isUserInteractionEnabled = false
|
||||
|
||||
if presenting {
|
||||
presentationController.presentationTransitionWillBegin()
|
||||
} else {
|
||||
presentationController.dismissalTransitionWillBegin()
|
||||
}
|
||||
}
|
||||
|
||||
func transition(presenting: Bool) {
|
||||
if presenting {
|
||||
presentationController.presentationTransition()
|
||||
} else {
|
||||
presentationController.dismissalTransition()
|
||||
}
|
||||
}
|
||||
|
||||
func transitionDidEnd(presenting: Bool, completed: Bool) {
|
||||
if presenting {
|
||||
presentationController.presentationTransitionDidEnd(completed)
|
||||
} else {
|
||||
presentationController.dismissalTransitionDidEnd(completed)
|
||||
}
|
||||
|
||||
containerView?.isUserInteractionEnabled = true
|
||||
}
|
||||
|
||||
func transition(using transitionContext: UIViewControllerContextTransitioning) {
|
||||
transitionWillBegin(presenting: transitionContext.isPresenting)
|
||||
transition(presenting: transitionContext.isPresenting,
|
||||
animated: transitionContext.isAnimated,
|
||||
interactive: transitionContext.isInteractive,
|
||||
animations: { [weak self] in
|
||||
guard let self = self else { return }
|
||||
self.transition(presenting: transitionContext.isPresenting)
|
||||
}, completion: { [weak self] _ in
|
||||
guard let self = self else { return }
|
||||
let completed = !transitionContext.transitionWasCancelled
|
||||
self.transitionDidEnd(presenting: transitionContext.isPresenting, completed: completed)
|
||||
transitionContext.completeTransition(completed)
|
||||
})
|
||||
}
|
||||
|
||||
func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, animations: @escaping (() -> Void) = {}, completion: @escaping ((Bool) -> Void) = { _ in }) {
|
||||
if !animated {
|
||||
animations()
|
||||
completion(true)
|
||||
return
|
||||
}
|
||||
|
||||
let duration = self.duration(presenting: presenting, interactive: interactive)
|
||||
if interactive {
|
||||
// IMPORTANT: The non-interactive animation block will not complete if adapted for interactive. The below animation block must be used!
|
||||
UIView.animate(
|
||||
withDuration: duration,
|
||||
delay: duration, // HACK: If zero, the animation briefly flashes in iOS 11.
|
||||
options: .curveLinear,
|
||||
animations: animations,
|
||||
completion: completion
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
UIView.animate(
|
||||
withDuration: duration,
|
||||
delay: 0,
|
||||
usingSpringWithDamping: config.usingSpringWithDamping,
|
||||
initialSpringVelocity: config.initialSpringVelocity,
|
||||
options: config.animationOptions,
|
||||
animations: animations,
|
||||
completion: completion
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private extension UIViewControllerContextTransitioning {
|
||||
|
||||
var isPresenting: Bool {
|
||||
return viewController(forKey: .from)?.presentedViewController === viewController(forKey: .to)
|
||||
}
|
||||
|
||||
var presentingViewController: UIViewController? {
|
||||
return viewController(forKey: isPresenting ? .from : .to)
|
||||
}
|
||||
|
||||
var presentedViewController: UIViewController? {
|
||||
return viewController(forKey: isPresenting ? .to : .from)
|
||||
}
|
||||
}
|
||||
@@ -7,10 +7,6 @@
|
||||
|
||||
import UIKit
|
||||
|
||||
internal protocol SideMenuInteractable {
|
||||
func handle(state: SideMenuInteractionController.State)
|
||||
}
|
||||
|
||||
internal final class SideMenuInteractionController: UIPercentDrivenInteractiveTransition {
|
||||
|
||||
enum State { case
|
||||
@@ -44,20 +40,6 @@ internal final class SideMenuInteractionController: UIPercentDrivenInteractiveTr
|
||||
guard !isCancelled && !isFinished else { return }
|
||||
super.update(percentComplete)
|
||||
}
|
||||
}
|
||||
|
||||
private extension SideMenuInteractionController {
|
||||
|
||||
@objc func handleNotification(notification: NSNotification) {
|
||||
switch notification.name {
|
||||
case UIApplication.didEnterBackgroundNotification:
|
||||
cancel()
|
||||
default: break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension SideMenuInteractionController: SideMenuInteractable {
|
||||
|
||||
func handle(state: State) {
|
||||
switch state {
|
||||
@@ -70,3 +52,14 @@ extension SideMenuInteractionController: SideMenuInteractable {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private extension SideMenuInteractionController {
|
||||
|
||||
@objc func handleNotification(notification: NSNotification) {
|
||||
switch notification.name {
|
||||
case UIApplication.didEnterBackgroundNotification:
|
||||
cancel()
|
||||
default: break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ public class SideMenuManager: NSObject {
|
||||
}
|
||||
|
||||
/// The left menu.
|
||||
open var leftMenuNavigationController: UISideMenuNavigationController? {
|
||||
open var leftMenuNavigationController: SideMenuNavigationController? {
|
||||
get {
|
||||
if _leftMenu.value?.isHidden == true {
|
||||
_leftMenu.value?.leftSide = true
|
||||
@@ -61,7 +61,7 @@ public class SideMenuManager: NSObject {
|
||||
}
|
||||
|
||||
/// The right menu.
|
||||
open var rightMenuNavigationController: UISideMenuNavigationController? {
|
||||
open var rightMenuNavigationController: SideMenuNavigationController? {
|
||||
get {
|
||||
if _rightMenu.value?.isHidden == true {
|
||||
_rightMenu.value?.leftSide = false
|
||||
@@ -202,7 +202,7 @@ private extension SideMenuManager {
|
||||
func addScreenEdgeGesture(to view: UIView, edge: UIRectEdge) -> UIScreenEdgePanGestureRecognizer {
|
||||
if let screenEdgeGestureRecognizer = view.gestureRecognizers?.first(where: { $0 is SideMenuScreenEdgeGestureRecognizer }) as? SideMenuScreenEdgeGestureRecognizer,
|
||||
screenEdgeGestureRecognizer.edges == edge {
|
||||
view.removeGestureRecognizer(screenEdgeGestureRecognizer)
|
||||
screenEdgeGestureRecognizer.remove()
|
||||
}
|
||||
return SideMenuScreenEdgeGestureRecognizer(addTo: view, target: self, action: #selector(handlePresentMenuScreenEdge(_:))).with {
|
||||
$0.edges = edge
|
||||
@@ -221,7 +221,7 @@ private extension SideMenuManager {
|
||||
}
|
||||
}
|
||||
|
||||
extension SideMenuManager: UISideMenuNavigationControllerTransitionDelegate {
|
||||
extension SideMenuManager: SideMenuNavigationControllerTransitionDelegate {
|
||||
|
||||
internal func sideMenuTransitionDidDismiss(menu: Menu) {
|
||||
defer { switching = false }
|
||||
|
||||
+126
-171
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// UISideMenuNavigationController.swift
|
||||
// SideMenuNavigationController.swift
|
||||
//
|
||||
// Created by Jon Kent on 1/14/16.
|
||||
// Copyright © 2016 Jon Kent. All rights reserved.
|
||||
@@ -14,20 +14,66 @@ import UIKit
|
||||
preserveAndHideBackButton,
|
||||
replace,
|
||||
subMenu
|
||||
|
||||
internal var hidesBackButton: Bool {
|
||||
switch self {
|
||||
case .preserveAndHideBackButton, .replace: return true
|
||||
case .default, .popWhenPossible, .preserve, .subMenu: return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@objc public protocol UISideMenuNavigationControllerDelegate {
|
||||
@objc optional func sideMenuWillAppear(menu: UISideMenuNavigationController, animated: Bool)
|
||||
@objc optional func sideMenuDidAppear(menu: UISideMenuNavigationController, animated: Bool)
|
||||
@objc optional func sideMenuWillDisappear(menu: UISideMenuNavigationController, animated: Bool)
|
||||
@objc optional func sideMenuDidDisappear(menu: UISideMenuNavigationController, animated: Bool)
|
||||
internal protocol MenuModel {
|
||||
/// Prevents the same view controller (or a view controller of the same class) from being pushed more than once. Defaults to true.
|
||||
var allowPushOfSameClassTwice: Bool { get }
|
||||
/// Forces menus to always animate when appearing or disappearing, regardless of a pushed view controller's animation.
|
||||
var alwaysAnimate: Bool { get }
|
||||
/**
|
||||
The blur effect style of the menu if the menu's root view controller is a UITableViewController or UICollectionViewController.
|
||||
|
||||
- Note: If you want cells in a UITableViewController menu to show vibrancy, make them a subclass of UITableViewVibrantCell.
|
||||
*/
|
||||
var blurEffectStyle: UIBlurEffect.Style? { get }
|
||||
/// Animation curve of the remaining animation when the menu is partially dismissed with gestures. Default is .easeIn.
|
||||
var completionCurve: UIView.AnimationCurve { get }
|
||||
/// Automatically dismisses the menu when another view is presented from it.
|
||||
var dismissOnPresent: Bool { get }
|
||||
/// Automatically dismisses the menu when another view controller is pushed from it.
|
||||
var dismissOnPush: Bool { get }
|
||||
/// Automatically dismisses the menu when the screen is rotated.
|
||||
var dismissOnRotation: Bool { get }
|
||||
/// Automatically dismisses the menu when app goes to the background.
|
||||
var dismissWhenBackgrounded: Bool { get }
|
||||
/// Enable or disable a swipe gesture that dismisses the menu. Will not be triggered when `presentingViewControllerUserInteractionEnabled` is set to true. Default is true.
|
||||
var enableSwipeToDismissGesture: Bool { get }
|
||||
/// Enable or disable a tap gesture that dismisses the menu. Will not be triggered when `presentingViewControllerUserInteractionEnabled` is set to true. Default is true.
|
||||
var enableTapToDismissGesture: Bool { get }
|
||||
/**
|
||||
The push style of the menu.
|
||||
|
||||
There are six modes in MenuPushStyle:
|
||||
- defaultBehavior: The view controller is pushed onto the stack.
|
||||
- popWhenPossible: If a view controller already in the stack is of the same class as the pushed view controller, the stack is instead popped back to the existing view controller. This behavior can help users from getting lost in a deep navigation stack.
|
||||
- preserve: If a view controller already in the stack is of the same class as the pushed view controller, the existing view controller is pushed to the end of the stack. This behavior is similar to a UITabBarController.
|
||||
- preserveAndHideBackButton: Same as .preserve and back buttons are automatically hidden.
|
||||
- replace: Any existing view controllers are released from the stack and replaced with the pushed view controller. Back buttons are automatically hidden. This behavior is ideal if view controllers require a lot of memory or their state doesn't need to be preserved..
|
||||
- subMenu: Unlike all other behaviors that push using the menu's presentingViewController, this behavior pushes view controllers within the menu. Use this behavior if you want to display a sub menu.
|
||||
*/
|
||||
var pushStyle: SideMenuPushStyle { get }
|
||||
}
|
||||
|
||||
internal protocol UISideMenuNavigationControllerTransitionDelegate: class {
|
||||
@objc public protocol SideMenuNavigationControllerDelegate {
|
||||
@objc optional func sideMenuWillAppear(menu: SideMenuNavigationController, animated: Bool)
|
||||
@objc optional func sideMenuDidAppear(menu: SideMenuNavigationController, animated: Bool)
|
||||
@objc optional func sideMenuWillDisappear(menu: SideMenuNavigationController, animated: Bool)
|
||||
@objc optional func sideMenuDidDisappear(menu: SideMenuNavigationController, animated: Bool)
|
||||
}
|
||||
|
||||
internal protocol SideMenuNavigationControllerTransitionDelegate: class {
|
||||
func sideMenuTransitionDidDismiss(menu: Menu)
|
||||
}
|
||||
|
||||
public struct SideMenuSettings: MenuModel {
|
||||
public struct SideMenuSettings: SideMenuNavigationController.Model, InitializableStruct {
|
||||
public var allowPushOfSameClassTwice: Bool = true
|
||||
public var alwaysAnimate: Bool = true
|
||||
public var animationOptions: UIView.AnimationOptions = .curveEaseInOut
|
||||
@@ -56,17 +102,14 @@ public struct SideMenuSettings: MenuModel {
|
||||
public var usingSpringWithDamping: CGFloat = 1
|
||||
|
||||
public init() {}
|
||||
|
||||
public init(_ block: (inout SideMenuSettings) -> Void) {
|
||||
self.init()
|
||||
block(&self)
|
||||
}
|
||||
}
|
||||
|
||||
internal typealias Menu = UISideMenuNavigationController
|
||||
internal typealias Menu = SideMenuNavigationController
|
||||
|
||||
@objcMembers
|
||||
open class UISideMenuNavigationController: UINavigationController {
|
||||
open class SideMenuNavigationController: UINavigationController {
|
||||
|
||||
internal typealias Model = MenuModel & PresentationModel & AnimationModel
|
||||
|
||||
private lazy var _leftSide = Protected(false) { [weak self] oldValue, newValue in
|
||||
guard self?.isHidden != false else {
|
||||
@@ -78,14 +121,12 @@ open class UISideMenuNavigationController: UINavigationController {
|
||||
|
||||
private weak var _sideMenuManager: SideMenuManager?
|
||||
private weak var foundViewController: UIViewController?
|
||||
private weak var interactionController: SideMenuInteractionController?
|
||||
private var interactive: Bool = false
|
||||
private var originalBackgroundColor: UIColor?
|
||||
private var rotating: Bool = false
|
||||
private var transitionController: SideMenuTransitionController?
|
||||
|
||||
/// Delegate for receiving appear and disappear related events. If `nil` the visible view controller that displays a `UISideMenuNavigationController` automatically receives these events.
|
||||
internal weak var sideMenuDelegate: UISideMenuNavigationControllerDelegate?
|
||||
/// Delegate for receiving appear and disappear related events. If `nil` the visible view controller that displays a `SideMenuNavigationController` automatically receives these events.
|
||||
public weak var sideMenuDelegate: SideMenuNavigationControllerDelegate?
|
||||
|
||||
/// The swipe to dismiss gesture.
|
||||
open private(set) weak var swipeToDismissGesture: UIPanGestureRecognizer? = nil
|
||||
@@ -110,10 +151,10 @@ open class UISideMenuNavigationController: UINavigationController {
|
||||
didSet {
|
||||
setupBlur()
|
||||
if !enableSwipeToDismissGesture {
|
||||
removeSwipeGesture()
|
||||
swipeToDismissGesture?.remove()
|
||||
}
|
||||
if !enableTapToDismissGesture {
|
||||
removeTapGesture()
|
||||
tapToDismissGesture?.remove()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -253,23 +294,48 @@ open class UISideMenuNavigationController: UINavigationController {
|
||||
}
|
||||
|
||||
override open func pushViewController(_ viewController: UIViewController, animated: Bool) {
|
||||
let push = shouldPushViewController(viewController: viewController, animated: animated) { [weak self] _ in
|
||||
self?.foundViewController = nil
|
||||
guard viewControllers.count > 0 else {
|
||||
// NOTE: pushViewController is called by init(rootViewController: UIViewController)
|
||||
// so we must perform the normal super method in this case
|
||||
return super.pushViewController(viewController, animated: animated)
|
||||
}
|
||||
|
||||
if push {
|
||||
|
||||
var alongsideTransition: (() -> Void)? = nil
|
||||
if dismissOnPush {
|
||||
alongsideTransition = { [weak self] in
|
||||
guard let self = self else { return }
|
||||
self.dismissAnimation(animated: animated || self.alwaysAnimate)
|
||||
}
|
||||
}
|
||||
|
||||
let pushed = SideMenuPushCoordinator(config:
|
||||
.init(
|
||||
allowPushOfSameClassTwice: allowPushOfSameClassTwice,
|
||||
alongsideTransition: alongsideTransition,
|
||||
animated: animated,
|
||||
fromViewController: self,
|
||||
pushStyle: pushStyle,
|
||||
toViewController: viewController
|
||||
)
|
||||
).start()
|
||||
|
||||
if !pushed {
|
||||
super.pushViewController(viewController, animated: animated)
|
||||
}
|
||||
}
|
||||
|
||||
override open var transitioningDelegate: UIViewControllerTransitioningDelegate? {
|
||||
get { return self }
|
||||
get {
|
||||
transitionController = transitionController ?? SideMenuTransitionController(leftSide: leftSide, config: settings)
|
||||
transitionController?.delegate = self
|
||||
return transitionController
|
||||
}
|
||||
set { Print.warning(.transitioningDelegate, required: true) }
|
||||
}
|
||||
}
|
||||
|
||||
// Interface
|
||||
extension UISideMenuNavigationController: MenuModel {
|
||||
extension SideMenuNavigationController: SideMenuNavigationController.Model {
|
||||
|
||||
@IBInspectable open var allowPushOfSameClassTwice: Bool {
|
||||
get { return settings.allowPushOfSameClassTwice }
|
||||
@@ -346,6 +412,11 @@ extension UISideMenuNavigationController: MenuModel {
|
||||
get { return _leftSide.value }
|
||||
set { _leftSide.value = newValue }
|
||||
}
|
||||
|
||||
/// Indicates if the menu is anywhere in the view hierarchy, even if covered by another view controller.
|
||||
open override var isHidden: Bool {
|
||||
return super.isHidden
|
||||
}
|
||||
|
||||
@IBInspectable open var menuWidth: CGFloat {
|
||||
get { return settings.menuWidth }
|
||||
@@ -388,53 +459,20 @@ extension UISideMenuNavigationController: MenuModel {
|
||||
}
|
||||
}
|
||||
|
||||
// IMPORTANT: These methods must be declared open or they will not be called.
|
||||
extension UISideMenuNavigationController: UIViewControllerTransitioningDelegate {
|
||||
extension SideMenuNavigationController: SideMenuTransitionControllerDelegate {
|
||||
|
||||
open func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
|
||||
transitionController = SideMenuTransitionController(
|
||||
config: self,
|
||||
leftSide: leftSide,
|
||||
delegate: self)
|
||||
return transitionController
|
||||
}
|
||||
|
||||
open func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
|
||||
return transitionController
|
||||
}
|
||||
|
||||
open func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
|
||||
return interactionController(using: animator)
|
||||
}
|
||||
|
||||
open func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
|
||||
return interactionController(using: animator)
|
||||
}
|
||||
|
||||
private func interactionController(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
|
||||
guard interactive else { return nil }
|
||||
let interactionController = SideMenuInteractionController(cancelWhenBackgrounded: dismissWhenBackgrounded, completionCurve: completionCurve)
|
||||
self.interactionController = interactionController
|
||||
return interactionController
|
||||
}
|
||||
}
|
||||
|
||||
extension UISideMenuNavigationController: SideMenuTransitionControllerDelegate {
|
||||
|
||||
internal func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didDismiss viewController: UIViewController) {
|
||||
interactive = false
|
||||
func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didDismiss viewController: UIViewController) {
|
||||
sideMenuManager.sideMenuTransitionDidDismiss(menu: self)
|
||||
}
|
||||
|
||||
internal func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didPresent viewController: UIViewController) {
|
||||
interactive = false
|
||||
removeSwipeGesture()
|
||||
func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didPresent viewController: UIViewController) {
|
||||
swipeToDismissGesture?.remove()
|
||||
swipeToDismissGesture = addSwipeToDismissGesture(to: view.superview)
|
||||
tapToDismissGesture = addTapToDismissGesture(to: view.superview)
|
||||
}
|
||||
}
|
||||
|
||||
internal extension UISideMenuNavigationController {
|
||||
internal extension SideMenuNavigationController {
|
||||
|
||||
func handleMenuPan(_ gesture: UIPanGestureRecognizer, _ presenting: Bool) {
|
||||
let width = menuWidth
|
||||
@@ -445,127 +483,44 @@ internal extension UISideMenuNavigationController {
|
||||
if !presenting {
|
||||
dismissMenu(interactively: true)
|
||||
}
|
||||
interactionController?.handle(state: .update(progress: progress))
|
||||
transitionController?.handle(state: .update(progress: progress))
|
||||
case .changed:
|
||||
interactionController?.handle(state: .update(progress: progress))
|
||||
transitionController?.handle(state: .update(progress: progress))
|
||||
case .ended:
|
||||
let velocity = gesture.xVelocity * factor(presenting)
|
||||
let finished = velocity >= 100 || velocity >= -50 && abs(progress) >= 0.5
|
||||
interactionController?.handle(state: finished ? .finish : .cancel)
|
||||
transitionController?.handle(state: finished ? .finish : .cancel)
|
||||
default:
|
||||
interactionController?.handle(state: .cancel)
|
||||
transitionController?.handle(state: .cancel)
|
||||
}
|
||||
}
|
||||
|
||||
func cancelMenuPan(_ gesture: UIPanGestureRecognizer) {
|
||||
interactionController?.handle(state: .cancel)
|
||||
transitionController?.handle(state: .cancel)
|
||||
}
|
||||
|
||||
func dismissMenu(animated flag: Bool = true, interactively interactive: Bool = false, completion: (() -> Void)? = nil) {
|
||||
guard !isHidden else { return }
|
||||
self.interactive = interactive
|
||||
transitionController?.interactive = interactive
|
||||
dismiss(animated: flag, completion: completion)
|
||||
}
|
||||
|
||||
// Note: although this method is syntactically reversed it allows the interactive property to scoped privately
|
||||
func presentFrom(_ viewControllerToPresentFrom: UIViewController?, interactively interactive: Bool, completion: (() -> Void)? = nil) {
|
||||
guard let viewControllerToPresentFrom = viewControllerToPresentFrom else { return }
|
||||
self.interactive = interactive
|
||||
guard let viewControllerToPresentFrom = viewControllerToPresentFrom, transitioningDelegate != nil else { return }
|
||||
transitionController?.interactive = interactive
|
||||
viewControllerToPresentFrom.present(self, animated: true, completion: completion)
|
||||
}
|
||||
}
|
||||
|
||||
private extension UISideMenuNavigationController {
|
||||
private extension SideMenuNavigationController {
|
||||
|
||||
func shouldPushViewController(viewController: UIViewController, animated: Bool, completion: ((Bool) -> Void)?) -> Bool {
|
||||
guard viewControllers.count > 0 && pushStyle != .subMenu else {
|
||||
// NOTE: pushViewController is called by init(rootViewController: UIViewController)
|
||||
// so we must perform the normal super method in this case
|
||||
return true
|
||||
}
|
||||
|
||||
let splitViewController = presentingViewController as? UISplitViewController
|
||||
let tabBarController = presentingViewController as? UITabBarController
|
||||
let potentialNavigationController = (splitViewController?.viewControllers.first ?? tabBarController?.selectedViewController) ?? presentingViewController
|
||||
guard let navigationController = potentialNavigationController as? UINavigationController else {
|
||||
Print.warning(.cannotPush, arguments: String(describing: potentialNavigationController.self), required: true)
|
||||
return false
|
||||
}
|
||||
|
||||
// To avoid overlapping dismiss & pop/push calls, create a transaction block where the menu
|
||||
// is dismissed after showing the appropriate screen
|
||||
CATransaction.begin()
|
||||
defer { CATransaction.commit() }
|
||||
var push = false
|
||||
|
||||
if dismissOnPush {
|
||||
let animated = animated || alwaysAnimate
|
||||
if animated {
|
||||
let areAnimationsEnabled = UIView.areAnimationsEnabled
|
||||
UIView.setAnimationsEnabled(true)
|
||||
transitionController?.transition(presenting: false, animated: animated, alongsideTransition: { [weak self] in
|
||||
guard let self = self else { return }
|
||||
self.activeDelegate?.sideMenuWillDisappear?(menu: self, animated: animated)
|
||||
}, completion: { [weak self] _ in
|
||||
guard let self = self else { return }
|
||||
self.activeDelegate?.sideMenuDidDisappear?(menu: self, animated: animated)
|
||||
self.dismiss(animated: false, completion: nil)
|
||||
completion?(push)
|
||||
})
|
||||
UIView.setAnimationsEnabled(areAnimationsEnabled)
|
||||
}
|
||||
}
|
||||
|
||||
if let lastViewController = navigationController.viewControllers.last,
|
||||
!allowPushOfSameClassTwice && type(of: lastViewController) == type(of: viewController) {
|
||||
return false
|
||||
}
|
||||
|
||||
switch pushStyle {
|
||||
case .subMenu: return false // handled earlier
|
||||
case .default:
|
||||
navigationController.pushViewController(viewController, animated: animated)
|
||||
return false
|
||||
case .popWhenPossible:
|
||||
for subViewController in navigationController.viewControllers.reversed() {
|
||||
if type(of: subViewController) == type(of: viewController) {
|
||||
navigationController.popToViewController(subViewController, animated: animated)
|
||||
return false
|
||||
}
|
||||
}
|
||||
push = true
|
||||
return true
|
||||
case .preserve, .preserveAndHideBackButton:
|
||||
var viewControllers = navigationController.viewControllers
|
||||
let filtered = viewControllers.filter { preservedViewController in type(of: preservedViewController) == type(of: viewController) }
|
||||
if let preservedViewController = filtered.last {
|
||||
viewControllers = viewControllers.filter { subViewController in subViewController !== preservedViewController }
|
||||
if pushStyle == .preserveAndHideBackButton {
|
||||
preservedViewController.navigationItem.hidesBackButton = true
|
||||
}
|
||||
viewControllers.append(preservedViewController)
|
||||
navigationController.setViewControllers(viewControllers, animated: animated)
|
||||
return false
|
||||
}
|
||||
if pushStyle == .preserveAndHideBackButton {
|
||||
viewController.navigationItem.hidesBackButton = true
|
||||
}
|
||||
|
||||
push = true
|
||||
return true
|
||||
case .replace:
|
||||
viewController.navigationItem.hidesBackButton = true
|
||||
navigationController.setViewControllers([viewController], animated: animated)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
weak var activeDelegate: UISideMenuNavigationControllerDelegate? {
|
||||
weak var activeDelegate: SideMenuNavigationControllerDelegate? {
|
||||
guard !view.isHidden else { return nil }
|
||||
if let sideMenuDelegate = sideMenuDelegate {
|
||||
return sideMenuDelegate
|
||||
}
|
||||
return visibleViewController(from: presentingViewController) as? UISideMenuNavigationControllerDelegate
|
||||
return visibleViewController(from: presentingViewController) as? SideMenuNavigationControllerDelegate
|
||||
}
|
||||
|
||||
func visibleViewController(from: UIViewController?) -> UIViewController? {
|
||||
@@ -586,6 +541,18 @@ private extension UISideMenuNavigationController {
|
||||
return from
|
||||
}
|
||||
|
||||
func dismissAnimation(animated: Bool) {
|
||||
transitionController?.transition(presenting: false, animated: animated, alongsideTransition: { [weak self] in
|
||||
guard let self = self else { return }
|
||||
self.activeDelegate?.sideMenuWillDisappear?(menu: self, animated: animated)
|
||||
}, completion: { [weak self] _ in
|
||||
guard let self = self else { return }
|
||||
self.activeDelegate?.sideMenuDidDisappear?(menu: self, animated: animated)
|
||||
self.dismiss(animated: false, completion: nil)
|
||||
self.foundViewController = nil
|
||||
})
|
||||
}
|
||||
|
||||
func setup() {
|
||||
modalPresentationStyle = .overFullScreen
|
||||
|
||||
@@ -636,18 +603,6 @@ private extension UISideMenuNavigationController {
|
||||
}
|
||||
}
|
||||
|
||||
func removeSwipeGesture() {
|
||||
if let swipeToDismissGesture = swipeToDismissGesture {
|
||||
swipeToDismissGesture.view?.removeGestureRecognizer(swipeToDismissGesture)
|
||||
}
|
||||
}
|
||||
|
||||
func removeTapGesture() {
|
||||
if let tapToDismissGesture = tapToDismissGesture {
|
||||
tapToDismissGesture.view?.removeGestureRecognizer(tapToDismissGesture)
|
||||
}
|
||||
}
|
||||
|
||||
func registerForNotifications() {
|
||||
NotificationCenter.default.removeObserver(self)
|
||||
|
||||
@@ -7,6 +7,19 @@
|
||||
|
||||
import UIKit
|
||||
|
||||
internal protocol PresentationModel {
|
||||
/// Draws `presentStyle.backgroundColor` behind the status bar. Default is 1.
|
||||
var statusBarEndAlpha: CGFloat { get }
|
||||
/// Enable or disable interaction with the presenting view controller while the menu is displayed. Enabling may make it difficult to dismiss the menu or cause exceptions if the user tries to present and already presented menu. `presentingViewControllerUseSnapshot` must also set to false. Default is false.
|
||||
var presentingViewControllerUserInteractionEnabled: Bool { get }
|
||||
/// Use a snapshot for the presenting vierw controller while the menu is displayed. Useful when layout changes occur during transitions. Not recommended for apps that support rotation. Default is false.
|
||||
var presentingViewControllerUseSnapshot: Bool { get }
|
||||
/// The presentation style of the menu.
|
||||
var presentationStyle: SideMenuPresentationStyle { get }
|
||||
/// Width of the menu when presented on screen, showing the existing view controller in the remaining space. Default is zero.
|
||||
var menuWidth: CGFloat { get }
|
||||
}
|
||||
|
||||
internal protocol SideMenuPresentationControllerDelegate: class {
|
||||
func sideMenuPresentationControllerDidTap(_ presentationController: SideMenuPresentationController)
|
||||
func sideMenuPresentationController(_ presentationController: SideMenuPresentationController, didPanWith gesture: UIPanGestureRecognizer)
|
||||
@@ -221,7 +234,7 @@ private extension SideMenuPresentationController {
|
||||
view.layer.shadowColor = config.presentationStyle.onTopShadowColor.cgColor
|
||||
view.layer.shadowRadius = config.presentationStyle.onTopShadowRadius
|
||||
view.layer.shadowOpacity = config.presentationStyle.onTopShadowOpacity
|
||||
view.layer.shadowOffset = CGSize(width: 0, height: 0)
|
||||
view.layer.shadowOffset = config.presentationStyle.onTopShadowOffset
|
||||
}
|
||||
|
||||
func addParallax(to view: UIView) {
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
// Created by Jon Kent on 7/2/19.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
@objcMembers
|
||||
open class SideMenuPresentationStyle {
|
||||
open class SideMenuPresentationStyle: InitializableClass {
|
||||
/// Background color behind the views and status bar color
|
||||
public var backgroundColor: UIColor = .black
|
||||
/// The starting alpha value of the menu before it appears
|
||||
@@ -36,12 +36,7 @@ open class SideMenuPresentationStyle {
|
||||
/// The strength of the parallax effect on the presenting view once the menu is displayed.
|
||||
public var presentingParallaxStrength: CGSize = .zero
|
||||
|
||||
public init() {}
|
||||
|
||||
public convenience init(_ block: (SideMenuPresentationStyle) -> Void) {
|
||||
self.init()
|
||||
block(self)
|
||||
}
|
||||
required public init() {}
|
||||
|
||||
/// This method is called just before the presentation transition begins. Use this to setup any animations. The super method does not need to be called.
|
||||
func presentationTransitionWillBegin(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {}
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
//
|
||||
// PushCoordinator.swift
|
||||
// SideMenu
|
||||
//
|
||||
// Created by Jon Kent on 9/4/19.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
protocol CoordinatorModel {
|
||||
var animated: Bool { get }
|
||||
var fromViewController: UIViewController { get }
|
||||
var toViewController: UIViewController { get }
|
||||
}
|
||||
|
||||
protocol Coordinator {
|
||||
associatedtype Model: CoordinatorModel
|
||||
|
||||
init(config: Model)
|
||||
@discardableResult func start() -> Bool
|
||||
}
|
||||
|
||||
internal final class SideMenuPushCoordinator: Coordinator {
|
||||
|
||||
struct Model: CoordinatorModel {
|
||||
var allowPushOfSameClassTwice: Bool
|
||||
var alongsideTransition: (() -> Void)?
|
||||
var animated: Bool
|
||||
var fromViewController: UIViewController
|
||||
var pushStyle: SideMenuPushStyle
|
||||
var toViewController: UIViewController
|
||||
}
|
||||
|
||||
private let config: Model
|
||||
|
||||
init(config: Model) {
|
||||
self.config = config
|
||||
}
|
||||
|
||||
@discardableResult func start() -> Bool {
|
||||
guard config.pushStyle != .subMenu,
|
||||
let fromNavigationController = config.fromViewController as? UINavigationController else {
|
||||
return false
|
||||
}
|
||||
let toViewController = config.toViewController
|
||||
let presentingViewController = fromNavigationController.presentingViewController
|
||||
let splitViewController = presentingViewController as? UISplitViewController
|
||||
let tabBarController = presentingViewController as? UITabBarController
|
||||
let potentialNavigationController = (splitViewController?.viewControllers.first ?? tabBarController?.selectedViewController) ?? presentingViewController
|
||||
guard let navigationController = potentialNavigationController as? UINavigationController else {
|
||||
Print.warning(.cannotPush, arguments: String(describing: potentialNavigationController.self), required: true)
|
||||
return false
|
||||
}
|
||||
|
||||
// To avoid overlapping dismiss & pop/push calls, create a transaction block where the menu
|
||||
// is dismissed after showing the appropriate screen
|
||||
CATransaction.begin()
|
||||
defer { CATransaction.commit() }
|
||||
UIView.animationsEnabled { [weak self] in
|
||||
self?.config.alongsideTransition?()
|
||||
}
|
||||
|
||||
if let lastViewController = navigationController.viewControllers.last,
|
||||
!config.allowPushOfSameClassTwice && type(of: lastViewController) == type(of: toViewController) {
|
||||
return false
|
||||
}
|
||||
|
||||
toViewController.navigationItem.hidesBackButton = config.pushStyle.hidesBackButton
|
||||
|
||||
switch config.pushStyle {
|
||||
|
||||
case .default:
|
||||
navigationController.pushViewController(toViewController, animated: config.animated)
|
||||
return true
|
||||
|
||||
// subMenu handled earlier
|
||||
case .subMenu:
|
||||
return false
|
||||
|
||||
case .popWhenPossible:
|
||||
for subViewController in navigationController.viewControllers.reversed() {
|
||||
if type(of: subViewController) == type(of: toViewController) {
|
||||
navigationController.popToViewController(subViewController, animated: config.animated)
|
||||
return true
|
||||
}
|
||||
}
|
||||
navigationController.pushViewController(toViewController, animated: config.animated)
|
||||
return true
|
||||
|
||||
case .preserve, .preserveAndHideBackButton:
|
||||
var viewControllers = navigationController.viewControllers
|
||||
let filtered = viewControllers.filter { preservedViewController in type(of: preservedViewController) == type(of: toViewController) }
|
||||
guard let preservedViewController = filtered.last else {
|
||||
navigationController.pushViewController(toViewController, animated: config.animated)
|
||||
return true
|
||||
}
|
||||
viewControllers = viewControllers.filter { subViewController in subViewController !== preservedViewController }
|
||||
viewControllers.append(preservedViewController)
|
||||
navigationController.setViewControllers(viewControllers, animated: config.animated)
|
||||
return true
|
||||
|
||||
case .replace:
|
||||
navigationController.setViewControllers([toViewController], animated: config.animated)
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,9 @@
|
||||
//
|
||||
// SideMenuAnimationController.swift
|
||||
// SideMenuTransitioningDelegate.swift
|
||||
// SideMenu
|
||||
//
|
||||
// Created by Jon Kent on 10/24/18.
|
||||
// Created by Jon Kent on 8/29/19.
|
||||
// Copyright © 2019 jonkykong. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
@@ -12,176 +13,81 @@ internal protocol SideMenuTransitionControllerDelegate: class {
|
||||
func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didPresent viewController: UIViewController)
|
||||
}
|
||||
|
||||
internal final class SideMenuTransitionController: NSObject, UIViewControllerAnimatedTransitioning {
|
||||
internal final class SideMenuTransitionController: NSObject, UIViewControllerTransitioningDelegate {
|
||||
|
||||
typealias Model = MenuModel & AnimationModel & PresentationModel
|
||||
|
||||
private var config: TransitionModel
|
||||
private weak var containerView: UIView?
|
||||
private let leftSide: Bool
|
||||
private var presentationController: SideMenuPresentationController!
|
||||
private unowned var presentedViewController: UIViewController?
|
||||
private unowned var presentingViewController: UIViewController?
|
||||
private let config: Model
|
||||
private var animationController: SideMenuAnimationController?
|
||||
private weak var interactionController: SideMenuInteractionController?
|
||||
|
||||
var interactive: Bool = false
|
||||
weak var delegate: SideMenuTransitionControllerDelegate?
|
||||
|
||||
init(config: TransitionModel, leftSide: Bool, delegate: SideMenuTransitionControllerDelegate? = nil) {
|
||||
self.config = config
|
||||
init(leftSide: Bool, config: Model) {
|
||||
self.leftSide = leftSide
|
||||
self.delegate = delegate
|
||||
self.config = config
|
||||
super.init()
|
||||
}
|
||||
|
||||
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
|
||||
guard
|
||||
let presentedViewController = transitionContext.presentedViewController,
|
||||
let presentingViewController = transitionContext.presentingViewController
|
||||
else { return }
|
||||
|
||||
if transitionContext.isPresenting {
|
||||
self.containerView = transitionContext.containerView
|
||||
self.presentedViewController = presentedViewController
|
||||
self.presentingViewController = presentingViewController
|
||||
self.presentationController = SideMenuPresentationController(
|
||||
config: config,
|
||||
leftSide: leftSide,
|
||||
presentedViewController: presentedViewController,
|
||||
presentingViewController: presentingViewController,
|
||||
containerView: transitionContext.containerView
|
||||
)
|
||||
}
|
||||
|
||||
transition(using: transitionContext)
|
||||
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
|
||||
animationController = SideMenuAnimationController(
|
||||
config: config,
|
||||
leftSide: leftSide,
|
||||
delegate: self)
|
||||
return animationController
|
||||
}
|
||||
|
||||
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
|
||||
guard let transitionContext = transitionContext else { return 0 }
|
||||
return duration(presenting: transitionContext.isPresenting, interactive: transitionContext.isInteractive)
|
||||
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
|
||||
return animationController
|
||||
}
|
||||
|
||||
func animationEnded(_ transitionCompleted: Bool) {
|
||||
guard let presentedViewController = presentedViewController else { return }
|
||||
if presentedViewController.isHidden {
|
||||
delegate?.sideMenuTransitionController(self, didDismiss: presentedViewController)
|
||||
} else {
|
||||
delegate?.sideMenuTransitionController(self, didPresent: presentedViewController)
|
||||
}
|
||||
func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
|
||||
return interactionController(using: animator)
|
||||
}
|
||||
|
||||
func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, alongsideTransition: (() -> Void)? = nil, complete: Bool = true, completion: ((Bool) -> Void)? = nil) {
|
||||
transitionWillBegin(presenting: presenting)
|
||||
transition(presenting: presenting,
|
||||
animated: animated,
|
||||
interactive: interactive,
|
||||
animations: { [weak self] in
|
||||
guard let self = self else { return }
|
||||
self.transition(presenting: presenting)
|
||||
alongsideTransition?()
|
||||
}, completion: { [weak self] _ in
|
||||
guard let self = self else { return }
|
||||
if complete {
|
||||
self.transitionDidEnd(presenting: presenting, completed: true)
|
||||
}
|
||||
completion?(true)
|
||||
})
|
||||
func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
|
||||
return interactionController(using: animator)
|
||||
}
|
||||
|
||||
internal func handle(state: SideMenuInteractionController.State) {
|
||||
interactionController?.handle(state: state)
|
||||
}
|
||||
|
||||
func layout() {
|
||||
presentationController.containerViewWillLayoutSubviews()
|
||||
animationController?.layout()
|
||||
}
|
||||
|
||||
func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, alongsideTransition: (() -> Void)? = nil, complete: Bool = true, completion: ((Bool) -> Void)? = nil) {
|
||||
animationController?.transition(
|
||||
presenting: presenting,
|
||||
animated: animated,
|
||||
interactive: interactive,
|
||||
alongsideTransition: alongsideTransition,
|
||||
complete: complete, completion: completion
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
extension SideMenuTransitionController: SideMenuAnimationControllerDelegate {
|
||||
|
||||
internal func sideMenuAnimationController(_ animationController: SideMenuAnimationController, didDismiss viewController: UIViewController) {
|
||||
delegate?.sideMenuTransitionController(self, didDismiss: viewController)
|
||||
}
|
||||
|
||||
internal func sideMenuAnimationController(_ animationController: SideMenuAnimationController, didPresent viewController: UIViewController) {
|
||||
delegate?.sideMenuTransitionController(self, didPresent: viewController)
|
||||
}
|
||||
}
|
||||
|
||||
private extension SideMenuTransitionController {
|
||||
|
||||
func duration(presenting: Bool, interactive: Bool) -> Double {
|
||||
if interactive { return config.completeGestureDuration }
|
||||
return presenting ? config.presentDuration : config.dismissDuration
|
||||
}
|
||||
|
||||
func transitionWillBegin(presenting: Bool) {
|
||||
// prevent any other menu gestures from firing
|
||||
containerView?.isUserInteractionEnabled = false
|
||||
|
||||
if presenting {
|
||||
presentationController.presentationTransitionWillBegin()
|
||||
} else {
|
||||
presentationController.dismissalTransitionWillBegin()
|
||||
}
|
||||
}
|
||||
|
||||
func transition(presenting: Bool) {
|
||||
if presenting {
|
||||
presentationController.presentationTransition()
|
||||
} else {
|
||||
presentationController.dismissalTransition()
|
||||
}
|
||||
}
|
||||
|
||||
func transitionDidEnd(presenting: Bool, completed: Bool) {
|
||||
if presenting {
|
||||
presentationController.presentationTransitionDidEnd(completed)
|
||||
} else {
|
||||
presentationController.dismissalTransitionDidEnd(completed)
|
||||
}
|
||||
|
||||
containerView?.isUserInteractionEnabled = true
|
||||
}
|
||||
|
||||
func transition(using transitionContext: UIViewControllerContextTransitioning) {
|
||||
transitionWillBegin(presenting: transitionContext.isPresenting)
|
||||
transition(presenting: transitionContext.isPresenting,
|
||||
animated: transitionContext.isAnimated,
|
||||
interactive: transitionContext.isInteractive,
|
||||
animations: { [weak self] in
|
||||
guard let self = self else { return }
|
||||
self.transition(presenting: transitionContext.isPresenting)
|
||||
}, completion: { [weak self] _ in
|
||||
guard let self = self else { return }
|
||||
let completed = !transitionContext.transitionWasCancelled
|
||||
self.transitionDidEnd(presenting: transitionContext.isPresenting, completed: completed)
|
||||
transitionContext.completeTransition(completed)
|
||||
})
|
||||
}
|
||||
|
||||
func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, animations: @escaping (() -> Void) = {}, completion: @escaping ((Bool) -> Void) = { _ in }) {
|
||||
if !animated {
|
||||
animations()
|
||||
completion(true)
|
||||
return
|
||||
}
|
||||
|
||||
let duration = self.duration(presenting: presenting, interactive: interactive)
|
||||
if interactive {
|
||||
// IMPORTANT: The non-interactive animation block will not complete if adapted for interactive. The below animation block must be used!
|
||||
UIView.animate(
|
||||
withDuration: duration,
|
||||
delay: duration, // HACK: If zero, the animation briefly flashes in iOS 11.
|
||||
options: .curveLinear,
|
||||
animations: animations,
|
||||
completion: completion
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
UIView.animate(
|
||||
withDuration: duration,
|
||||
delay: 0,
|
||||
usingSpringWithDamping: config.usingSpringWithDamping,
|
||||
initialSpringVelocity: config.initialSpringVelocity,
|
||||
options: config.animationOptions,
|
||||
animations: animations,
|
||||
completion: completion
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private extension UIViewControllerContextTransitioning {
|
||||
|
||||
var isPresenting: Bool {
|
||||
return viewController(forKey: .from)?.presentedViewController === viewController(forKey: .to)
|
||||
}
|
||||
|
||||
var presentingViewController: UIViewController? {
|
||||
return viewController(forKey: isPresenting ? .from : .to)
|
||||
}
|
||||
|
||||
var presentedViewController: UIViewController? {
|
||||
return viewController(forKey: isPresenting ? .to : .from)
|
||||
func interactionController(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
|
||||
guard interactive else { return nil }
|
||||
interactive = false
|
||||
let interactionController = SideMenuInteractionController(cancelWhenBackgrounded: config.dismissWhenBackgrounded, completionCurve: config.completionCurve)
|
||||
self.interactionController = interactionController
|
||||
return interactionController
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,9 +10,9 @@ import UIKit
|
||||
|
||||
open class UITableViewVibrantCell: UITableViewCell {
|
||||
|
||||
private var vibrancyView:UIVisualEffectView = UIVisualEffectView()
|
||||
private var vibrancySelectedBackgroundView:UIVisualEffectView = UIVisualEffectView()
|
||||
private var defaultSelectedBackgroundView:UIView?
|
||||
private var vibrancyView: UIVisualEffectView = UIVisualEffectView()
|
||||
private var vibrancySelectedBackgroundView: UIVisualEffectView = UIVisualEffectView()
|
||||
private var defaultSelectedBackgroundView: UIView?
|
||||
open var blurEffectStyle: UIBlurEffect.Style? {
|
||||
didSet {
|
||||
updateBlur()
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
PODS:
|
||||
- SideMenu (6.0.0)
|
||||
- SideMenu (6.2.5)
|
||||
|
||||
DEPENDENCIES:
|
||||
- SideMenu (from `.`)
|
||||
@@ -9,7 +9,7 @@ EXTERNAL SOURCES:
|
||||
:path: "."
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
SideMenu: 1b826b95cc7db1a3c7d164f8a6e6e92506ffb0f5
|
||||
SideMenu: cba46f5cd6080a0e38137d5be285e8bcf0f36eb4
|
||||
|
||||
PODFILE CHECKSUM: 863f183ea1ab6f64dc8553590349c586faf8e4a1
|
||||
|
||||
|
||||
+4
-4
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "SideMenu",
|
||||
"version": "6.0.0",
|
||||
"version": "6.2.5",
|
||||
"summary": "Simple side menu control for iOS in Swift inspired by Facebook. Right and Left sides. No coding required.",
|
||||
"description": "SideMenu is a simple and versatile side menu control. It's highly customizable, but can also be implemented in storyboard without a single line of code. The are three standard animation styles to choose from along with several other options for further customization if desired. Just type SideMenuManager.menu... and code completion will show you everything you can customize.",
|
||||
"homepage": "https://github.com/jonkykong/SideMenu",
|
||||
@@ -19,12 +19,12 @@
|
||||
},
|
||||
"source": {
|
||||
"git": "https://github.com/jonkykong/SideMenu.git",
|
||||
"tag": "6.0.0"
|
||||
"tag": "6.2.5"
|
||||
},
|
||||
"platforms": {
|
||||
"ios": "10.0"
|
||||
},
|
||||
"swift_versions": "5",
|
||||
"swift_versions": "5.0",
|
||||
"source_files": "Pod/Classes/**/*",
|
||||
"swift_version": "5"
|
||||
"swift_version": "5.0"
|
||||
}
|
||||
|
||||
Generated
+2
-2
@@ -1,5 +1,5 @@
|
||||
PODS:
|
||||
- SideMenu (6.0.0)
|
||||
- SideMenu (6.2.5)
|
||||
|
||||
DEPENDENCIES:
|
||||
- SideMenu (from `.`)
|
||||
@@ -9,7 +9,7 @@ EXTERNAL SOURCES:
|
||||
:path: "."
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
SideMenu: 1b826b95cc7db1a3c7d164f8a6e6e92506ffb0f5
|
||||
SideMenu: cba46f5cd6080a0e38137d5be285e8bcf0f36eb4
|
||||
|
||||
PODFILE CHECKSUM: 863f183ea1ab6f64dc8553590349c586faf8e4a1
|
||||
|
||||
|
||||
Generated
+203
-197
@@ -7,25 +7,25 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
032FEB01E4C88E7C87032FCF9780FC7C /* UISideMenuNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F8B09C72B577EFDB20A3EFF4F0C668A /* UISideMenuNavigationController.swift */; };
|
||||
0D2D410A6087D4E0A54642165913EF30 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F10B146FA49E99D07F0FA0E38ABE8F /* Models.swift */; };
|
||||
0F9F3CABB81269CF711A73BAD21E7976 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; };
|
||||
287FA1360FD3EF72D700C54856C685C1 /* SideMenuManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FE7B8C8447DD35D435B2AF4A23E221C /* SideMenuManager.swift */; };
|
||||
31E79D7BA42208D00E73C18CBAF1598E /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1B25193EDCA447F119795F68F75BF05 /* Extensions.swift */; };
|
||||
384CBA8850C8BF3A7AAB3A3D78844B1E /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13846826E721392191757B9033D6F63F /* Protected.swift */; };
|
||||
45A647715262A70BB9F2F4E7C1439C58 /* UITableViewVibrantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ACA278071ED85D04DA83677D6C60528 /* UITableViewVibrantCell.swift */; };
|
||||
5B0A5C9933D0FCD08E12CFFB56145333 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; };
|
||||
614FC39555CB129D97FC24B2D953A427 /* SideMenuPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AFB3209BCB97295281AC6437FB346B /* SideMenuPresentationController.swift */; };
|
||||
6E6E17C0E8351D23CB4B20332C70BE61 /* Print.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CB39D726F07EA27650309A1A3213412 /* Print.swift */; };
|
||||
8428210422E0540800C6F2D8 /* Deprecations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428210022E0448700C6F2D8 /* Deprecations.swift */; };
|
||||
849F7B5B2320FCC6005DEB6A /* SideMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 849F7B562320F3A4005DEB6A /* SideMenu.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
849F7B5E2320FD67005DEB6A /* SideMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 849F7B562320F3A4005DEB6A /* SideMenu.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
849F7B7123210C6E005DEB6A /* Deprecations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B6C23210C6E005DEB6A /* Deprecations.swift */; };
|
||||
849F7B7223210C6E005DEB6A /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B6D23210C6E005DEB6A /* Extensions.swift */; };
|
||||
849F7B7323210C6E005DEB6A /* Initializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B6E23210C6E005DEB6A /* Initializable.swift */; };
|
||||
849F7B7423210C6E005DEB6A /* Print.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B6F23210C6E005DEB6A /* Print.swift */; };
|
||||
849F7B7523210C6E005DEB6A /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B7023210C6E005DEB6A /* Protected.swift */; };
|
||||
849F7B7F23210C79005DEB6A /* SideMenuNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B7623210C79005DEB6A /* SideMenuNavigationController.swift */; };
|
||||
849F7B8023210C79005DEB6A /* SideMenuManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B7723210C79005DEB6A /* SideMenuManager.swift */; };
|
||||
849F7B8123210C79005DEB6A /* SideMenuPresentationStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B7823210C79005DEB6A /* SideMenuPresentationStyle.swift */; };
|
||||
849F7B8223210C79005DEB6A /* SideMenuInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B7923210C79005DEB6A /* SideMenuInteractionController.swift */; };
|
||||
849F7B8323210C79005DEB6A /* SideMenuPushCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B7A23210C79005DEB6A /* SideMenuPushCoordinator.swift */; };
|
||||
849F7B8423210C79005DEB6A /* SideMenuAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B7B23210C79005DEB6A /* SideMenuAnimationController.swift */; };
|
||||
849F7B8523210C79005DEB6A /* SideMenuTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B7C23210C79005DEB6A /* SideMenuTransitionController.swift */; };
|
||||
849F7B8623210C79005DEB6A /* UITableViewVibrantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B7D23210C79005DEB6A /* UITableViewVibrantCell.swift */; };
|
||||
849F7B8723210C79005DEB6A /* SideMenuPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B7E23210C79005DEB6A /* SideMenuPresentationController.swift */; };
|
||||
89B2CFA98A07964FBD2D7775FF5FB98D /* Pods-Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */; };
|
||||
A2ACFE2D997BC8F1DA4EE3064A4270DD /* SideMenuInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB64592703EA9A196B5C0F07BA1A918A /* SideMenuInteractionController.swift */; };
|
||||
BD5C0C12B6BB0BF6DA294E095B35E38D /* Initializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00F847D27577EF5335081BFA43A0BFA3 /* Initializable.swift */; };
|
||||
D0B45D0F0E7B359807CAFB744FB80CE4 /* SideMenuPresentationStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D154DB98A04C7BD96E4EFBBD3FE0008A /* SideMenuPresentationStyle.swift */; };
|
||||
D7BD58D0FF7BF7E887B6D70D4651D70B /* Pods-Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
DA6F42990A37DF6179D6386008BB87F8 /* SideMenu-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 36C5772477B00653D86343BABD123EF3 /* SideMenu-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
F1967413D21BCA08963F09969D47E152 /* SideMenu-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CF977D7FB42D367F2810037EBA59B7D /* SideMenu-dummy.m */; };
|
||||
FCBFE25630B6309DF3213AE0F6F34D1A /* SideMenuTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30C3188EE68841BE36716860BE079AF8 /* SideMenuTransitionController.swift */; };
|
||||
D7BD58D0FF7BF7E887B6D70D4651D70B /* Pods-Example.h in Headers */ = {isa = PBXBuildFile; fileRef = 7825A90E082A1582EB16256B0E722B3F /* Pods-Example.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
E6F2CD13BC297BF5E7707DEDE9C7F271 /* SideMenu-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DF9702572C0E4370367755578F2ECE7 /* SideMenu-dummy.m */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@@ -39,41 +39,41 @@
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
00F847D27577EF5335081BFA43A0BFA3 /* Initializable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Initializable.swift; path = Pod/Classes/Initializable.swift; sourceTree = "<group>"; };
|
||||
0FD529BD299167F85338CB5BB3463BED /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
|
||||
105D784922AF9F627D902729C7D0E3CA /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
|
||||
13846826E721392191757B9033D6F63F /* Protected.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Protected.swift; path = Pod/Classes/Protected.swift; sourceTree = "<group>"; };
|
||||
1D01FD908F7943A6131CA6F66DD0CA68 /* SideMenu-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SideMenu-Info.plist"; sourceTree = "<group>"; };
|
||||
1F667CC0E19EAF34E5A4119E2121F585 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
1FE7B8C8447DD35D435B2AF4A23E221C /* SideMenuManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuManager.swift; path = Pod/Classes/SideMenuManager.swift; sourceTree = "<group>"; };
|
||||
243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.release.xcconfig"; sourceTree = "<group>"; };
|
||||
2CB39D726F07EA27650309A1A3213412 /* Print.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Print.swift; path = Pod/Classes/Print.swift; sourceTree = "<group>"; };
|
||||
30C3188EE68841BE36716860BE079AF8 /* SideMenuTransitionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuTransitionController.swift; path = Pod/Classes/SideMenuTransitionController.swift; sourceTree = "<group>"; };
|
||||
319D06AA0D1D0BA345459C039040A1ED /* SideMenu.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SideMenu.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
31C1D37707DFAA5E6A164BCC07834264 /* Pods-Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-Info.plist"; sourceTree = "<group>"; };
|
||||
3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
|
||||
35C305D3797C284E6F5BAA1D3E6F9BF8 /* Pods-Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Example.modulemap"; sourceTree = "<group>"; };
|
||||
36C5772477B00653D86343BABD123EF3 /* SideMenu-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SideMenu-umbrella.h"; sourceTree = "<group>"; };
|
||||
3ACA278071ED85D04DA83677D6C60528 /* UITableViewVibrantCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UITableViewVibrantCell.swift; path = Pod/Classes/UITableViewVibrantCell.swift; sourceTree = "<group>"; };
|
||||
441854E35F81731E63E53DC7E4EEAD9D /* Pods-Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Example-acknowledgements.markdown"; sourceTree = "<group>"; };
|
||||
61AFB3209BCB97295281AC6437FB346B /* SideMenuPresentationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationController.swift; path = Pod/Classes/SideMenuPresentationController.swift; sourceTree = "<group>"; };
|
||||
7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Example-umbrella.h"; sourceTree = "<group>"; };
|
||||
8428210022E0448700C6F2D8 /* Deprecations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Deprecations.swift; path = Pod/Classes/Deprecations.swift; sourceTree = "<group>"; };
|
||||
8F8B09C72B577EFDB20A3EFF4F0C668A /* UISideMenuNavigationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UISideMenuNavigationController.swift; path = Pod/Classes/UISideMenuNavigationController.swift; sourceTree = "<group>"; };
|
||||
9CF977D7FB42D367F2810037EBA59B7D /* SideMenu-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SideMenu-dummy.m"; sourceTree = "<group>"; };
|
||||
4DF9702572C0E4370367755578F2ECE7 /* SideMenu-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SideMenu-dummy.m"; sourceTree = "<group>"; };
|
||||
5B30AFEB50A77ED133026BBB542D4DC2 /* SideMenu-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SideMenu-Info.plist"; sourceTree = "<group>"; };
|
||||
5F375DA230E88A457A5F6021E054F56D /* SideMenu.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SideMenu.xcconfig; sourceTree = "<group>"; };
|
||||
7825A90E082A1582EB16256B0E722B3F /* Pods-Example.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Example.h"; sourceTree = "<group>"; };
|
||||
849F7B562320F3A4005DEB6A /* SideMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SideMenu.h; sourceTree = "<group>"; };
|
||||
849F7B6C23210C6E005DEB6A /* Deprecations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Deprecations.swift; path = Pod/Classes/Deprecations.swift; sourceTree = "<group>"; };
|
||||
849F7B6D23210C6E005DEB6A /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Pod/Classes/Extensions.swift; sourceTree = "<group>"; };
|
||||
849F7B6E23210C6E005DEB6A /* Initializable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Initializable.swift; path = Pod/Classes/Initializable.swift; sourceTree = "<group>"; };
|
||||
849F7B6F23210C6E005DEB6A /* Print.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Print.swift; path = Pod/Classes/Print.swift; sourceTree = "<group>"; };
|
||||
849F7B7023210C6E005DEB6A /* Protected.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Protected.swift; path = Pod/Classes/Protected.swift; sourceTree = "<group>"; };
|
||||
849F7B7623210C79005DEB6A /* SideMenuNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuNavigationController.swift; path = Pod/Classes/SideMenuNavigationController.swift; sourceTree = "<group>"; };
|
||||
849F7B7723210C79005DEB6A /* SideMenuManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuManager.swift; path = Pod/Classes/SideMenuManager.swift; sourceTree = "<group>"; };
|
||||
849F7B7823210C79005DEB6A /* SideMenuPresentationStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationStyle.swift; path = Pod/Classes/SideMenuPresentationStyle.swift; sourceTree = "<group>"; };
|
||||
849F7B7923210C79005DEB6A /* SideMenuInteractionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuInteractionController.swift; path = Pod/Classes/SideMenuInteractionController.swift; sourceTree = "<group>"; };
|
||||
849F7B7A23210C79005DEB6A /* SideMenuPushCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPushCoordinator.swift; path = Pod/Classes/SideMenuPushCoordinator.swift; sourceTree = "<group>"; };
|
||||
849F7B7B23210C79005DEB6A /* SideMenuAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuAnimationController.swift; path = Pod/Classes/SideMenuAnimationController.swift; sourceTree = "<group>"; };
|
||||
849F7B7C23210C79005DEB6A /* SideMenuTransitionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuTransitionController.swift; path = Pod/Classes/SideMenuTransitionController.swift; sourceTree = "<group>"; };
|
||||
849F7B7D23210C79005DEB6A /* UITableViewVibrantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UITableViewVibrantCell.swift; path = Pod/Classes/UITableViewVibrantCell.swift; sourceTree = "<group>"; };
|
||||
849F7B7E23210C79005DEB6A /* SideMenuPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationController.swift; path = Pod/Classes/SideMenuPresentationController.swift; sourceTree = "<group>"; };
|
||||
863A19DF8C4FEFD1D2DFF3C6C85F3013 /* SideMenu-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SideMenu-prefix.pch"; sourceTree = "<group>"; };
|
||||
89DDCB61CB91FEE47235E0C0915F9F88 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
|
||||
9A5090CE306074592C68F6FB7ADF43FA /* SideMenu.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SideMenu.modulemap; sourceTree = "<group>"; };
|
||||
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
|
||||
AB64592703EA9A196B5C0F07BA1A918A /* SideMenuInteractionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuInteractionController.swift; path = Pod/Classes/SideMenuInteractionController.swift; sourceTree = "<group>"; };
|
||||
AFECBC24E09D0D25F822C27BD944AFD4 /* Pods-Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Example-frameworks.sh"; sourceTree = "<group>"; };
|
||||
B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
B5F10B146FA49E99D07F0FA0E38ABE8F /* Models.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Models.swift; path = Pod/Classes/Models.swift; sourceTree = "<group>"; };
|
||||
BB1EC6DFBB713FC2F280D596714173EC /* SideMenu.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SideMenu.xcconfig; sourceTree = "<group>"; };
|
||||
BD4CEC04022777F53C1CA2113A43FACE /* SideMenu-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SideMenu-prefix.pch"; sourceTree = "<group>"; };
|
||||
BE262D79CAE897127A1984945DCE9FEE /* SideMenu.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = SideMenu.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
|
||||
D154DB98A04C7BD96E4EFBBD3FE0008A /* SideMenuPresentationStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationStyle.swift; path = Pod/Classes/SideMenuPresentationStyle.swift; sourceTree = "<group>"; };
|
||||
BE3D03F947820C757C6A1858FE0784C9 /* SideMenu.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = SideMenu.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
|
||||
D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Example-dummy.m"; sourceTree = "<group>"; };
|
||||
E656C89A7C466C66F803FC806E30B29E /* SideMenu.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SideMenu.modulemap; sourceTree = "<group>"; };
|
||||
EA21B344259B58996DB73382B1B1521F /* Pods-Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-acknowledgements.plist"; sourceTree = "<group>"; };
|
||||
F1B25193EDCA447F119795F68F75BF05 /* Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Pod/Classes/Extensions.swift; sourceTree = "<group>"; };
|
||||
F2868E435B4FF74B943FC555CA3271AA /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -81,15 +81,13 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
0F9F3CABB81269CF711A73BAD21E7976 /* Foundation.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
B55A7DF9A704D60A5DE58A98398D7779 /* Frameworks */ = {
|
||||
D530FD6E7F0D492D9036605CB47EAB59 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
5B0A5C9933D0FCD08E12CFFB56145333 /* Foundation.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -105,14 +103,50 @@
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
71A499AE33E397EBD7FA1A9D5B8440BA /* Pod */ = {
|
||||
0D8598CC67DCD15FA8FD2571BFA1FDD0 /* Development Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
105D784922AF9F627D902729C7D0E3CA /* LICENSE */,
|
||||
0FD529BD299167F85338CB5BB3463BED /* README.md */,
|
||||
BE262D79CAE897127A1984945DCE9FEE /* SideMenu.podspec */,
|
||||
15941242C0946F16AAC2EA37A208D559 /* SideMenu */,
|
||||
);
|
||||
name = Pod;
|
||||
name = "Development Pods";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
15941242C0946F16AAC2EA37A208D559 /* SideMenu */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B9E764EFCD0B407437AC1550B5A6FB28 /* Pod */,
|
||||
F2C813E2A0676FE71DB8D655549E2635 /* Support Files */,
|
||||
);
|
||||
name = SideMenu;
|
||||
path = ..;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
849F7B062320DF40005DEB6A /* Classes */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
849F7B7B23210C79005DEB6A /* SideMenuAnimationController.swift */,
|
||||
849F7B7923210C79005DEB6A /* SideMenuInteractionController.swift */,
|
||||
849F7B7723210C79005DEB6A /* SideMenuManager.swift */,
|
||||
849F7B7623210C79005DEB6A /* SideMenuNavigationController.swift */,
|
||||
849F7B7E23210C79005DEB6A /* SideMenuPresentationController.swift */,
|
||||
849F7B7823210C79005DEB6A /* SideMenuPresentationStyle.swift */,
|
||||
849F7B7A23210C79005DEB6A /* SideMenuPushCoordinator.swift */,
|
||||
849F7B7C23210C79005DEB6A /* SideMenuTransitionController.swift */,
|
||||
849F7B7D23210C79005DEB6A /* UITableViewVibrantCell.swift */,
|
||||
);
|
||||
name = Classes;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
849F7B072320DF54005DEB6A /* Supporting */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
849F7B6C23210C6E005DEB6A /* Deprecations.swift */,
|
||||
849F7B6D23210C6E005DEB6A /* Extensions.swift */,
|
||||
849F7B6E23210C6E005DEB6A /* Initializable.swift */,
|
||||
849F7B6F23210C6E005DEB6A /* Print.swift */,
|
||||
849F7B7023210C6E005DEB6A /* Protected.swift */,
|
||||
);
|
||||
name = Supporting;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
9BDBD95ED116334D1B2835202D8D3060 /* Pods-Example */ = {
|
||||
@@ -124,7 +158,7 @@
|
||||
D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */,
|
||||
AFECBC24E09D0D25F822C27BD944AFD4 /* Pods-Example-frameworks.sh */,
|
||||
31C1D37707DFAA5E6A164BCC07834264 /* Pods-Example-Info.plist */,
|
||||
7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */,
|
||||
7825A90E082A1582EB16256B0E722B3F /* Pods-Example.h */,
|
||||
B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */,
|
||||
243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */,
|
||||
);
|
||||
@@ -132,49 +166,16 @@
|
||||
path = "Target Support Files/Pods-Example";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B2A94553E0F1BCEBF406CC59D290924B /* SideMenu */ = {
|
||||
B9E764EFCD0B407437AC1550B5A6FB28 /* Pod */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
71A499AE33E397EBD7FA1A9D5B8440BA /* Pod */,
|
||||
B5D061624D54AFB703E72CCF860BDB15 /* Support Files */,
|
||||
8428210022E0448700C6F2D8 /* Deprecations.swift */,
|
||||
F1B25193EDCA447F119795F68F75BF05 /* Extensions.swift */,
|
||||
00F847D27577EF5335081BFA43A0BFA3 /* Initializable.swift */,
|
||||
B5F10B146FA49E99D07F0FA0E38ABE8F /* Models.swift */,
|
||||
2CB39D726F07EA27650309A1A3213412 /* Print.swift */,
|
||||
13846826E721392191757B9033D6F63F /* Protected.swift */,
|
||||
AB64592703EA9A196B5C0F07BA1A918A /* SideMenuInteractionController.swift */,
|
||||
1FE7B8C8447DD35D435B2AF4A23E221C /* SideMenuManager.swift */,
|
||||
61AFB3209BCB97295281AC6437FB346B /* SideMenuPresentationController.swift */,
|
||||
D154DB98A04C7BD96E4EFBBD3FE0008A /* SideMenuPresentationStyle.swift */,
|
||||
30C3188EE68841BE36716860BE079AF8 /* SideMenuTransitionController.swift */,
|
||||
8F8B09C72B577EFDB20A3EFF4F0C668A /* UISideMenuNavigationController.swift */,
|
||||
3ACA278071ED85D04DA83677D6C60528 /* UITableViewVibrantCell.swift */,
|
||||
849F7B062320DF40005DEB6A /* Classes */,
|
||||
849F7B072320DF54005DEB6A /* Supporting */,
|
||||
89DDCB61CB91FEE47235E0C0915F9F88 /* LICENSE */,
|
||||
F2868E435B4FF74B943FC555CA3271AA /* README.md */,
|
||||
BE3D03F947820C757C6A1858FE0784C9 /* SideMenu.podspec */,
|
||||
);
|
||||
name = SideMenu;
|
||||
path = ..;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B5D061624D54AFB703E72CCF860BDB15 /* Support Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
E656C89A7C466C66F803FC806E30B29E /* SideMenu.modulemap */,
|
||||
BB1EC6DFBB713FC2F280D596714173EC /* SideMenu.xcconfig */,
|
||||
9CF977D7FB42D367F2810037EBA59B7D /* SideMenu-dummy.m */,
|
||||
1D01FD908F7943A6131CA6F66DD0CA68 /* SideMenu-Info.plist */,
|
||||
BD4CEC04022777F53C1CA2113A43FACE /* SideMenu-prefix.pch */,
|
||||
36C5772477B00653D86343BABD123EF3 /* SideMenu-umbrella.h */,
|
||||
);
|
||||
name = "Support Files";
|
||||
path = "Pods/Target Support Files/SideMenu";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
C0834CEBB1379A84116EF29F93051C60 /* iOS */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */,
|
||||
);
|
||||
name = iOS;
|
||||
name = Pod;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */ = {
|
||||
@@ -189,27 +190,24 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
|
||||
E72796DEAFDB67EE8F2BEAFC93FCD96A /* Development Pods */,
|
||||
D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */,
|
||||
0D8598CC67DCD15FA8FD2571BFA1FDD0 /* Development Pods */,
|
||||
0161DC4DC33723D9E6F365301D5BEA4B /* Products */,
|
||||
CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = {
|
||||
F2C813E2A0676FE71DB8D655549E2635 /* Support Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
C0834CEBB1379A84116EF29F93051C60 /* iOS */,
|
||||
9A5090CE306074592C68F6FB7ADF43FA /* SideMenu.modulemap */,
|
||||
5F375DA230E88A457A5F6021E054F56D /* SideMenu.xcconfig */,
|
||||
4DF9702572C0E4370367755578F2ECE7 /* SideMenu-dummy.m */,
|
||||
5B30AFEB50A77ED133026BBB542D4DC2 /* SideMenu-Info.plist */,
|
||||
863A19DF8C4FEFD1D2DFF3C6C85F3013 /* SideMenu-prefix.pch */,
|
||||
849F7B562320F3A4005DEB6A /* SideMenu.h */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
E72796DEAFDB67EE8F2BEAFC93FCD96A /* Development Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B2A94553E0F1BCEBF406CC59D290924B /* SideMenu */,
|
||||
);
|
||||
name = "Development Pods";
|
||||
name = "Support Files";
|
||||
path = "Pods/Target Support Files/SideMenu";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
@@ -219,15 +217,16 @@
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D7BD58D0FF7BF7E887B6D70D4651D70B /* Pods-Example-umbrella.h in Headers */,
|
||||
D7BD58D0FF7BF7E887B6D70D4651D70B /* Pods-Example.h in Headers */,
|
||||
849F7B5B2320FCC6005DEB6A /* SideMenu.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
E1521144D8813A046F85E2C67424FCEC /* Headers */ = {
|
||||
EF1C6F3F91891316D1CEDAF556483650 /* Headers */ = {
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
DA6F42990A37DF6179D6386008BB87F8 /* SideMenu-umbrella.h in Headers */,
|
||||
849F7B5E2320FD67005DEB6A /* SideMenu.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -255,12 +254,12 @@
|
||||
};
|
||||
C4A0A7D8591B67FB75E2E8D215E3735B /* SideMenu */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 935F4F1CC68EF5CF6D65BEC30B4BF4DD /* Build configuration list for PBXNativeTarget "SideMenu" */;
|
||||
buildConfigurationList = CBE9024CB4C6BC4472FB1D55493FB8E9 /* Build configuration list for PBXNativeTarget "SideMenu" */;
|
||||
buildPhases = (
|
||||
E1521144D8813A046F85E2C67424FCEC /* Headers */,
|
||||
0F01CC2B72C51E08DB4D032E8D7612D3 /* Sources */,
|
||||
B55A7DF9A704D60A5DE58A98398D7779 /* Frameworks */,
|
||||
4F04DC9108B63EA99399A1A2B583B21F /* Resources */,
|
||||
EF1C6F3F91891316D1CEDAF556483650 /* Headers */,
|
||||
C433EA7C535EE6A47E1A454086B654C2 /* Sources */,
|
||||
D530FD6E7F0D492D9036605CB47EAB59 /* Frameworks */,
|
||||
98655D66022D8A23B945B5400D0D96E7 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -281,7 +280,10 @@
|
||||
LastUpgradeCheck = 1100;
|
||||
TargetAttributes = {
|
||||
0AEE99A309977BD12A049FF48AF9BA4B = {
|
||||
LastSwiftMigration = 1020;
|
||||
LastSwiftMigration = 1030;
|
||||
};
|
||||
C4A0A7D8591B67FB75E2E8D215E3735B = {
|
||||
LastSwiftMigration = 1030;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -304,7 +306,7 @@
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
4F04DC9108B63EA99399A1A2B583B21F /* Resources */ = {
|
||||
98655D66022D8A23B945B5400D0D96E7 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@@ -321,24 +323,11 @@
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
0F01CC2B72C51E08DB4D032E8D7612D3 /* Sources */ = {
|
||||
C433EA7C535EE6A47E1A454086B654C2 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8428210422E0540800C6F2D8 /* Deprecations.swift in Sources */,
|
||||
31E79D7BA42208D00E73C18CBAF1598E /* Extensions.swift in Sources */,
|
||||
BD5C0C12B6BB0BF6DA294E095B35E38D /* Initializable.swift in Sources */,
|
||||
0D2D410A6087D4E0A54642165913EF30 /* Models.swift in Sources */,
|
||||
6E6E17C0E8351D23CB4B20332C70BE61 /* Print.swift in Sources */,
|
||||
384CBA8850C8BF3A7AAB3A3D78844B1E /* Protected.swift in Sources */,
|
||||
F1967413D21BCA08963F09969D47E152 /* SideMenu-dummy.m in Sources */,
|
||||
A2ACFE2D997BC8F1DA4EE3064A4270DD /* SideMenuInteractionController.swift in Sources */,
|
||||
287FA1360FD3EF72D700C54856C685C1 /* SideMenuManager.swift in Sources */,
|
||||
614FC39555CB129D97FC24B2D953A427 /* SideMenuPresentationController.swift in Sources */,
|
||||
D0B45D0F0E7B359807CAFB744FB80CE4 /* SideMenuPresentationStyle.swift in Sources */,
|
||||
FCBFE25630B6309DF3213AE0F6F34D1A /* SideMenuTransitionController.swift in Sources */,
|
||||
032FEB01E4C88E7C87032FCF9780FC7C /* UISideMenuNavigationController.swift in Sources */,
|
||||
45A647715262A70BB9F2F4E7C1439C58 /* UITableViewVibrantCell.swift in Sources */,
|
||||
E6F2CD13BC297BF5E7707DEDE9C7F271 /* SideMenu-dummy.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -346,7 +335,21 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
849F7B7523210C6E005DEB6A /* Protected.swift in Sources */,
|
||||
849F7B8523210C79005DEB6A /* SideMenuTransitionController.swift in Sources */,
|
||||
849F7B8623210C79005DEB6A /* UITableViewVibrantCell.swift in Sources */,
|
||||
849F7B7123210C6E005DEB6A /* Deprecations.swift in Sources */,
|
||||
849F7B8123210C79005DEB6A /* SideMenuPresentationStyle.swift in Sources */,
|
||||
849F7B8323210C79005DEB6A /* SideMenuPushCoordinator.swift in Sources */,
|
||||
849F7B7223210C6E005DEB6A /* Extensions.swift in Sources */,
|
||||
849F7B8223210C79005DEB6A /* SideMenuInteractionController.swift in Sources */,
|
||||
849F7B8723210C79005DEB6A /* SideMenuPresentationController.swift in Sources */,
|
||||
849F7B8423210C79005DEB6A /* SideMenuAnimationController.swift in Sources */,
|
||||
849F7B7423210C6E005DEB6A /* Print.swift in Sources */,
|
||||
89B2CFA98A07964FBD2D7775FF5FB98D /* Pods-Example-dummy.m in Sources */,
|
||||
849F7B8023210C79005DEB6A /* SideMenuManager.swift in Sources */,
|
||||
849F7B7F23210C79005DEB6A /* SideMenuNavigationController.swift in Sources */,
|
||||
849F7B7323210C6E005DEB6A /* Initializable.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -362,38 +365,6 @@
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
03F2FCB145390B05104D185513A47C8B /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = BB1EC6DFBB713FC2F280D596714173EC /* SideMenu.xcconfig */;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_WEAK = NO;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
GCC_PREFIX_HEADER = "Target Support Files/SideMenu/SideMenu-prefix.pch";
|
||||
INFOPLIST_FILE = "Target Support Files/SideMenu/SideMenu-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MODULEMAP_FILE = "Target Support Files/SideMenu/SideMenu.modulemap";
|
||||
PRODUCT_MODULE_NAME = SideMenu;
|
||||
PRODUCT_NAME = SideMenu;
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
|
||||
SWIFT_VERSION = 5;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
196DFA3E4A09A28224918543529A1885 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
@@ -458,6 +429,40 @@
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
56A1664171D7685EBD62329421925629 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 5F375DA230E88A457A5F6021E054F56D /* SideMenu.xcconfig */;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = NO;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
GCC_PREFIX_HEADER = "Target Support Files/SideMenu/SideMenu-prefix.pch";
|
||||
INFOPLIST_FILE = "Target Support Files/SideMenu/SideMenu-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MODULEMAP_FILE = "Target Support Files/SideMenu/SideMenu.modulemap";
|
||||
PRODUCT_MODULE_NAME = SideMenu;
|
||||
PRODUCT_NAME = SideMenu;
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
70D2F3623D3AA27E6FB62D0291A05518 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */;
|
||||
@@ -495,6 +500,40 @@
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
801960B1745A4330B44246D5CDA31330 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 5F375DA230E88A457A5F6021E054F56D /* SideMenu.xcconfig */;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = NO;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
GCC_PREFIX_HEADER = "Target Support Files/SideMenu/SideMenu-prefix.pch";
|
||||
INFOPLIST_FILE = "Target Support Files/SideMenu/SideMenu-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MODULEMAP_FILE = "Target Support Files/SideMenu/SideMenu.modulemap";
|
||||
PRODUCT_MODULE_NAME = SideMenu;
|
||||
PRODUCT_NAME = SideMenu;
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
B01D14FDC83DCF9D4BE53066BEA96D05 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
@@ -591,39 +630,6 @@
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
FBB85502D70521CFA4D8AC919973525E /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = BB1EC6DFBB713FC2F280D596714173EC /* SideMenu.xcconfig */;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_WEAK = NO;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
GCC_PREFIX_HEADER = "Target Support Files/SideMenu/SideMenu-prefix.pch";
|
||||
INFOPLIST_FILE = "Target Support Files/SideMenu/SideMenu-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MODULEMAP_FILE = "Target Support Files/SideMenu/SideMenu.modulemap";
|
||||
PRODUCT_MODULE_NAME = SideMenu;
|
||||
PRODUCT_NAME = SideMenu;
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
|
||||
SWIFT_VERSION = 5;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
@@ -645,11 +651,11 @@
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
935F4F1CC68EF5CF6D65BEC30B4BF4DD /* Build configuration list for PBXNativeTarget "SideMenu" */ = {
|
||||
CBE9024CB4C6BC4472FB1D55493FB8E9 /* Build configuration list for PBXNativeTarget "SideMenu" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
03F2FCB145390B05104D185513A47C8B /* Debug */,
|
||||
FBB85502D70521CFA4D8AC919973525E /* Release */,
|
||||
56A1664171D7685EBD62329421925629 /* Debug */,
|
||||
801960B1745A4330B44246D5CDA31330 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
#ifdef __OBJC__
|
||||
#import <UIKit/UIKit.h>
|
||||
#else
|
||||
#ifndef FOUNDATION_EXPORT
|
||||
#if defined(__cplusplus)
|
||||
#define FOUNDATION_EXPORT extern "C"
|
||||
#else
|
||||
#define FOUNDATION_EXPORT extern
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
FOUNDATION_EXPORT double Pods_ExampleVersionNumber;
|
||||
FOUNDATION_EXPORT const unsigned char Pods_ExampleVersionString[];
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
framework module Pods_Example {
|
||||
umbrella header "Pods-Example-umbrella.h"
|
||||
umbrella header "Pods-Example.h"
|
||||
|
||||
export *
|
||||
module * { export * }
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
#ifdef __OBJC__
|
||||
#import <UIKit/UIKit.h>
|
||||
#else
|
||||
#ifndef FOUNDATION_EXPORT
|
||||
#if defined(__cplusplus)
|
||||
#define FOUNDATION_EXPORT extern "C"
|
||||
#else
|
||||
#define FOUNDATION_EXPORT extern
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
FOUNDATION_EXPORT double SideMenuVersionNumber;
|
||||
FOUNDATION_EXPORT const unsigned char SideMenuVersionString[];
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
framework module SideMenu {
|
||||
umbrella header "SideMenu-umbrella.h"
|
||||
umbrella header "SideMenu.h"
|
||||
|
||||
export *
|
||||
module * { export * }
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
# ▤ SideMenu
|
||||
[](https://circleci.com/gh/jonkykong/SideMenu)
|
||||
[](http://cocoapods.org/pods/SideMenu)
|
||||
[](https://github.com/Carthage/Carthage)
|
||||
[](http://cocoapods.org/pods/SideMenu)
|
||||
@@ -23,8 +24,8 @@
|
||||
* [Code Implementation](#code-implementation)
|
||||
* **[Customization](#customization)**
|
||||
* [SideMenuManager](#sidemenumanager)
|
||||
* [UISideMenuNavigationController](#uisidemenunavigationcontroller)
|
||||
* [UISideMenuNavigationControllerDelegate](#uisidemenunavigationcontrollerdelegate)
|
||||
* [SideMenuNavigationController](#sidemenunavigationcontroller)
|
||||
* [SideMenuNavigationControllerDelegate](#sidemenunavigationcontrollerdelegate)
|
||||
* [Advanced](#advanced)
|
||||
* [Known Issues](#known-issues)
|
||||
* [Thank You](#thank-you)
|
||||
@@ -34,7 +35,7 @@
|
||||
|
||||
SideMenu is a simple and versatile side menu control written in Swift.
|
||||
- [x] **It can be implemented in storyboard without a single line of [code](#code-less-storyboard-implementation).**
|
||||
- [x] Four standard animation styles to choose from (there's even a parallax effect if you want to get weird).
|
||||
- [x] Eight standard animation styles to choose from (there's even a parallax effect if you want to get weird).
|
||||
- [x] Highly customizable without needing to write tons of custom code.
|
||||
- [x] Supports continuous swiping between side menus on boths sides in a single gesture.
|
||||
- [x] Global menu configuration. Set-up once and be done for all screens.
|
||||
@@ -103,10 +104,10 @@ github "jonkykong/SideMenu" "master"
|
||||
|
||||
## Usage
|
||||
### Code-less Storyboard Implementation
|
||||
1. Create a Navigation Controller for a side menu. Set the `Custom Class` of the Navigation Controller to be `UISideMenuNavigationController` in the **Identity Inspector**. Set the `Module` to `SideMenu` (ignore this step if you've manually added SideMenu to your project). Create a Root View Controller for the Navigation Controller (shown as a UITableViewController below). Set up any Triggered Segues you want in that view controller.
|
||||
1. Create a Navigation Controller for a side menu. Set the `Custom Class` of the Navigation Controller to be `SideMenuNavigationController` in the **Identity Inspector**. Set the `Module` to `SideMenu` (ignore this step if you've manually added SideMenu to your project). Create a Root View Controller for the Navigation Controller (shown as a UITableViewController below). Set up any Triggered Segues you want in that view controller.
|
||||

|
||||
|
||||
2. Set the `Left Side` property of the `UISideMenuNavigationController` to On if you want it to appear from the left side of the screen, or Off/Default if you want it to appear from the right side.
|
||||
2. Set the `Left Side` property of the `SideMenuNavigationController` to On if you want it to appear from the left side of the screen, or Off/Default if you want it to appear from the right side.
|
||||

|
||||
|
||||
3. Add a UIButton or UIBarButton to a view controller that you want to display the menu from. Set that button's Triggered Segues action to modally present the Navigation Controller from step 1.
|
||||
@@ -122,10 +123,10 @@ import SideMenu
|
||||
From a button, do something like this:
|
||||
``` swift
|
||||
// Define the menu
|
||||
let menu = UISideMenuNavigationController(rootViewController: YourViewController)
|
||||
// UISideMenuNavigationController is a subclass of UINavigationController, so do any additional configuration
|
||||
let menu = SideMenuNavigationController(rootViewController: YourViewController)
|
||||
// SideMenuNavigationController is a subclass of UINavigationController, so do any additional configuration
|
||||
// of it here like setting its viewControllers. If you're using storyboards, you'll want to do something like:
|
||||
// let menu = storyboard!.instantiateViewController(withIdentifier: "RightMenu") as! UISideMenuNavigationController
|
||||
// let menu = storyboard!.instantiateViewController(withIdentifier: "RightMenu") as! SideMenuNavigationController
|
||||
present(menu, animated: true, completion: nil)
|
||||
```
|
||||
|
||||
@@ -137,10 +138,10 @@ dismiss(animated: true, completion: nil)
|
||||
To use gestures you have to use the `SideMenuManager`. In your `AppDelegate` do something like this:
|
||||
``` swift
|
||||
// Define the menus
|
||||
let leftMenuNavigationController = UISideMenuNavigationController(rootViewController: YourViewController)
|
||||
let leftMenuNavigationController = SideMenuNavigationController(rootViewController: YourViewController)
|
||||
SideMenuManager.default.leftMenuNavigationController = leftMenuNavigationController
|
||||
|
||||
let rightMenuNavigationController = UISideMenuNavigationController(rootViewController: YourViewController)
|
||||
let rightMenuNavigationController = SideMenuNavigationController(rootViewController: YourViewController)
|
||||
SideMenuManager.default.rightMenuNavigationController = rightMenuNavigationController
|
||||
|
||||
// Setup gestures: the left and/or right menus must be set up (above) for these to work.
|
||||
@@ -159,9 +160,9 @@ That's it.
|
||||
`SideMenuManager` supports the following:
|
||||
``` swift
|
||||
/// The left menu.
|
||||
open var leftMenuNavigationController: UISideMenuNavigationController?
|
||||
open var leftMenuNavigationController: SideMenuNavigationController?
|
||||
/// The right menu.
|
||||
public var rightMenuNavigationController: UISideMenuNavigationController?
|
||||
public var rightMenuNavigationController: SideMenuNavigationController?
|
||||
/**
|
||||
Adds screen edge gestures for both left and right sides to a view to present a menu.
|
||||
|
||||
@@ -188,8 +189,8 @@ public var rightMenuNavigationController: UISideMenuNavigationController?
|
||||
*/
|
||||
@discardableResult public func addPanGestureToPresent(toView view: UIView) -> UIPanGestureRecognizer
|
||||
```
|
||||
#### UISideMenuNavigationController
|
||||
`UISideMenuNavigationController` supports the following:
|
||||
#### SideMenuNavigationController
|
||||
`SideMenuNavigationController` supports the following:
|
||||
``` swift
|
||||
/// Prevents the same view controller (or a view controller of the same class) from being pushed more than once. Defaults to true.
|
||||
var allowPushOfSameClassTwice: Bool = true
|
||||
@@ -274,29 +275,29 @@ static let viewSlideOutMenuPartialOut: SideMenuPresentStyle
|
||||
/// The existing view slides out and shrinks to reveal the menu underneath.
|
||||
static let viewSlideOutMenuZoom: SideMenuPresentStyle
|
||||
```
|
||||
#### UISideMenuNavigationControllerDelegate
|
||||
To receive notifications when a menu is displayed from a view controller, have it adhere to the `UISideMenuNavigationControllerDelegate` protocol:
|
||||
#### SideMenuNavigationControllerDelegate
|
||||
To receive notifications when a menu is displayed from a view controller, have it adhere to the `SideMenuNavigationControllerDelegate` protocol:
|
||||
``` swift
|
||||
extension MyViewController: UISideMenuNavigationControllerDelegate {
|
||||
extension MyViewController: SideMenuNavigationControllerDelegate {
|
||||
|
||||
func sideMenuWillAppear(menu: UISideMenuNavigationController, animated: Bool) {
|
||||
func sideMenuWillAppear(menu: SideMenuNavigationController, animated: Bool) {
|
||||
print("SideMenu Appearing! (animated: \(animated))")
|
||||
}
|
||||
|
||||
func sideMenuDidAppear(menu: UISideMenuNavigationController, animated: Bool) {
|
||||
func sideMenuDidAppear(menu: SideMenuNavigationController, animated: Bool) {
|
||||
print("SideMenu Appeared! (animated: \(animated))")
|
||||
}
|
||||
|
||||
func sideMenuWillDisappear(menu: UISideMenuNavigationController, animated: Bool) {
|
||||
func sideMenuWillDisappear(menu: SideMenuNavigationController, animated: Bool) {
|
||||
print("SideMenu Disappearing! (animated: \(animated))")
|
||||
}
|
||||
|
||||
func sideMenuDidDisappear(menu: UISideMenuNavigationController, animated: Bool) {
|
||||
func sideMenuDidDisappear(menu: SideMenuNavigationController, animated: Bool) {
|
||||
print("SideMenu Disappeared! (animated: \(animated))")
|
||||
}
|
||||
}
|
||||
```
|
||||
*Note: setting the `sideMenuDelegate` property on `UISideMenuNavigationController` is optional. If your view controller adheres to the protocol then the methods will be called automatically.*
|
||||
*Note: setting the `sideMenuDelegate` property on `SideMenuNavigationController` is optional. If your view controller adheres to the protocol then the methods will be called automatically.*
|
||||
### Advanced
|
||||
<details>
|
||||
<summary>Click for Details</summary>
|
||||
@@ -308,9 +309,9 @@ For simplicity, `SideMenuManager.default` serves as the primary instance as most
|
||||
let customSideMenuManager = SideMenuManager()
|
||||
```
|
||||
2. Setup and display menus with your custom instance the same as you would with the `SideMenuManager.default` instance.
|
||||
3. If using Storyboards, subclass your instance of `UISideMenuNavigationController` and set its `sideMenuManager` property to your custom instance. This must be done before `viewDidLoad` is called:
|
||||
3. If using Storyboards, subclass your instance of `SideMenuNavigationController` and set its `sideMenuManager` property to your custom instance. This must be done before `viewDidLoad` is called:
|
||||
``` swift
|
||||
class MySideMenuNavigationController: UISideMenuNavigationController {
|
||||
class MySideMenuNavigationController: SideMenuNavigationController {
|
||||
|
||||
let customSideMenuManager = SideMenuManager()
|
||||
|
||||
@@ -321,10 +322,10 @@ class MySideMenuNavigationController: UISideMenuNavigationController {
|
||||
}
|
||||
}
|
||||
```
|
||||
Alternatively, you can set `sideMenuManager` from the view controller that segues to your UISideMenuNavigationController:
|
||||
Alternatively, you can set `sideMenuManager` from the view controller that segues to your SideMenuNavigationController:
|
||||
``` swift
|
||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
||||
if let sideMenuNavigationController = segue.destination as? UISideMenuNavigationController {
|
||||
if let sideMenuNavigationController = segue.destination as? SideMenuNavigationController {
|
||||
sideMenuNavigationController.sideMenuManager = customSideMenuManager
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -8,7 +8,7 @@
|
||||
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "SideMenu"
|
||||
s.version = "6.1.2"
|
||||
s.version = "6.2.8"
|
||||
s.summary = "Simple side menu control for iOS in Swift inspired by Facebook. Right and Left sides. No coding required."
|
||||
|
||||
# This description is used to generate tags and improve search results.
|
||||
@@ -29,7 +29,7 @@ Pod::Spec.new do |s|
|
||||
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
|
||||
|
||||
s.ios.deployment_target = '10.0'
|
||||
s.swift_version = '5'
|
||||
s.swift_version = '5.0'
|
||||
|
||||
s.source_files = 'Pod/Classes/**/*'
|
||||
# s.resource_bundles = {
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
65FF1B3E1DE321D8007B0845 /* SideMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 65FF1B3D1DE321D8007B0845 /* SideMenu.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
7B48A0D61DCB2487002990A1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B48A0D51DCB2487002990A1 /* AppDelegate.swift */; };
|
||||
7B48A0DD1DCB2487002990A1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7B48A0DC1DCB2487002990A1 /* Assets.xcassets */; };
|
||||
7B48A0F61DCB2518002990A1 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B48A0F31DCB2518002990A1 /* MainViewController.swift */; };
|
||||
@@ -15,56 +14,68 @@
|
||||
7B48A0F81DCB2518002990A1 /* SideMenuTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B48A0F51DCB2518002990A1 /* SideMenuTableViewController.swift */; };
|
||||
7B552D5D1DCC65830010301C /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7B552D5C1DCC65830010301C /* Launch Screen.storyboard */; };
|
||||
7B5FA9B61DCB269700278DF6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7B5FA9B51DCB269700278DF6 /* Main.storyboard */; };
|
||||
84276D8A2282929A0095B7C5 /* SideMenuManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84276D892282929A0095B7C5 /* SideMenuManager.swift */; };
|
||||
842820EF22DDD1BC00C6F2D8 /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820EE22DDD1BC00C6F2D8 /* Protected.swift */; };
|
||||
842820F622DDD1E800C6F2D8 /* SideMenuPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820F022DDD1E800C6F2D8 /* SideMenuPresentationController.swift */; };
|
||||
842820F722DDD1E800C6F2D8 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820F122DDD1E800C6F2D8 /* Models.swift */; };
|
||||
842820F822DDD1E800C6F2D8 /* SideMenuTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820F222DDD1E800C6F2D8 /* SideMenuTransitionController.swift */; };
|
||||
842820F922DDD1E800C6F2D8 /* Print.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820F322DDD1E800C6F2D8 /* Print.swift */; };
|
||||
842820FA22DDD1E800C6F2D8 /* Initializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820F422DDD1E800C6F2D8 /* Initializable.swift */; };
|
||||
842820FB22DDD1E800C6F2D8 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820F522DDD1E800C6F2D8 /* Extensions.swift */; };
|
||||
842820FD22DDD21100C6F2D8 /* SideMenuPresentationStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820FC22DDD21100C6F2D8 /* SideMenuPresentationStyle.swift */; };
|
||||
842820FF22DDD24200C6F2D8 /* SideMenuInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820FE22DDD24200C6F2D8 /* SideMenuInteractionController.swift */; };
|
||||
8428210322E0449300C6F2D8 /* Deprecations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428210222E0449300C6F2D8 /* Deprecations.swift */; };
|
||||
8461A2D51E145A08001DA4F8 /* UISideMenuNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8461A2D11E145A08001DA4F8 /* UISideMenuNavigationController.swift */; };
|
||||
8461A2D61E145A08001DA4F8 /* UITableViewVibrantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8461A2D21E145A08001DA4F8 /* UITableViewVibrantCell.swift */; };
|
||||
8432CC0422FFBCF5003D2BBD /* ExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8432CC0322FFBCF5003D2BBD /* ExampleTests.swift */; };
|
||||
849F7B9623210C9A005DEB6A /* UITableViewVibrantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8823210C9A005DEB6A /* UITableViewVibrantCell.swift */; };
|
||||
849F7B9723210C9A005DEB6A /* SideMenuTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8923210C9A005DEB6A /* SideMenuTransitionController.swift */; };
|
||||
849F7B9823210C9A005DEB6A /* SideMenuAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8A23210C9A005DEB6A /* SideMenuAnimationController.swift */; };
|
||||
849F7B9923210C9A005DEB6A /* SideMenuInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8B23210C9A005DEB6A /* SideMenuInteractionController.swift */; };
|
||||
849F7B9A23210C9A005DEB6A /* Initializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8C23210C9A005DEB6A /* Initializable.swift */; };
|
||||
849F7B9B23210C9A005DEB6A /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8D23210C9A005DEB6A /* Extensions.swift */; };
|
||||
849F7B9C23210C9A005DEB6A /* SideMenuPresentationStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8E23210C9A005DEB6A /* SideMenuPresentationStyle.swift */; };
|
||||
849F7B9D23210C9A005DEB6A /* SideMenuNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8F23210C9A005DEB6A /* SideMenuNavigationController.swift */; };
|
||||
849F7B9E23210C9A005DEB6A /* SideMenuPushCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9023210C9A005DEB6A /* SideMenuPushCoordinator.swift */; };
|
||||
849F7B9F23210C9A005DEB6A /* Deprecations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9123210C9A005DEB6A /* Deprecations.swift */; };
|
||||
849F7BA023210C9A005DEB6A /* Print.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9223210C9A005DEB6A /* Print.swift */; };
|
||||
849F7BA123210C9A005DEB6A /* SideMenuPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9323210C9A005DEB6A /* SideMenuPresentationController.swift */; };
|
||||
849F7BA223210C9A005DEB6A /* SideMenuManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9423210C9A005DEB6A /* SideMenuManager.swift */; };
|
||||
849F7BA323210C9A005DEB6A /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9523210C9A005DEB6A /* Protected.swift */; };
|
||||
849F7BA423225F7F005DEB6A /* SideMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 849F7B67232104BD005DEB6A /* SideMenu.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84B489B51DD469B000D6CB43 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 84B489B21DD469B000D6CB43 /* LICENSE */; };
|
||||
84B489B71DD469B000D6CB43 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 84B489B41DD469B000D6CB43 /* README.md */; };
|
||||
84B489BA1DD469DA00D6CB43 /* SideMenu.podspec in Resources */ = {isa = PBXBuildFile; fileRef = 84B489B91DD469DA00D6CB43 /* SideMenu.podspec */; };
|
||||
ACD6DAED90DE36FEA68CDF38 /* Pods_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47896ABC5C8830D88945A8D3 /* Pods_Example.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
8432CC0622FFBCF5003D2BBD /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 7B9DC8FB1DC6E8C1000D4007 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 7B48A0D21DCB2487002990A1;
|
||||
remoteInfo = Example;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1F17B9D56ADA958C611FAA83 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
281FB58A39C022692CEEBF0D /* Pods-Example-ExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-ExampleTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
47896ABC5C8830D88945A8D3 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
52C8DD7BE43A8987854CA726 /* Pods_Example_ExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example_ExampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
65FF1B3D1DE321D8007B0845 /* SideMenu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SideMenu.h; path = SideMenu/SideMenu.h; sourceTree = "<group>"; };
|
||||
7B48A0D31DCB2487002990A1 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
7B48A0D51DCB2487002990A1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
7B48A0DC1DCB2487002990A1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
7B48A0E11DCB2487002990A1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
7B48A0EA1DCB2487002990A1 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = "<group>"; };
|
||||
7B48A0EC1DCB2487002990A1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
7B48A0F31DCB2518002990A1 /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = "<group>"; };
|
||||
7B48A0F41DCB2518002990A1 /* PresentedViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentedViewController.swift; sourceTree = "<group>"; };
|
||||
7B48A0F51DCB2518002990A1 /* SideMenuTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SideMenuTableViewController.swift; sourceTree = "<group>"; };
|
||||
7B552D5C1DCC65830010301C /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; };
|
||||
7B5FA9B51DCB269700278DF6 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
|
||||
7B9DC9041DC6E8C1000D4007 /* SideMenu.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SideMenu.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
84276D892282929A0095B7C5 /* SideMenuManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuManager.swift; path = Pod/Classes/SideMenuManager.swift; sourceTree = "<group>"; };
|
||||
842820EE22DDD1BC00C6F2D8 /* Protected.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Protected.swift; path = Pod/Classes/Protected.swift; sourceTree = "<group>"; };
|
||||
842820F022DDD1E800C6F2D8 /* SideMenuPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationController.swift; path = Pod/Classes/SideMenuPresentationController.swift; sourceTree = "<group>"; };
|
||||
842820F122DDD1E800C6F2D8 /* Models.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Models.swift; path = Pod/Classes/Models.swift; sourceTree = "<group>"; };
|
||||
842820F222DDD1E800C6F2D8 /* SideMenuTransitionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuTransitionController.swift; path = Pod/Classes/SideMenuTransitionController.swift; sourceTree = "<group>"; };
|
||||
842820F322DDD1E800C6F2D8 /* Print.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Print.swift; path = Pod/Classes/Print.swift; sourceTree = "<group>"; };
|
||||
842820F422DDD1E800C6F2D8 /* Initializable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Initializable.swift; path = Pod/Classes/Initializable.swift; sourceTree = "<group>"; };
|
||||
842820F522DDD1E800C6F2D8 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Pod/Classes/Extensions.swift; sourceTree = "<group>"; };
|
||||
842820FC22DDD21100C6F2D8 /* SideMenuPresentationStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationStyle.swift; path = Pod/Classes/SideMenuPresentationStyle.swift; sourceTree = "<group>"; };
|
||||
842820FE22DDD24200C6F2D8 /* SideMenuInteractionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuInteractionController.swift; path = Pod/Classes/SideMenuInteractionController.swift; sourceTree = "<group>"; };
|
||||
8428210222E0449300C6F2D8 /* Deprecations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Deprecations.swift; path = Pod/Classes/Deprecations.swift; sourceTree = "<group>"; };
|
||||
8461A2D11E145A08001DA4F8 /* UISideMenuNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UISideMenuNavigationController.swift; path = Pod/Classes/UISideMenuNavigationController.swift; sourceTree = "<group>"; };
|
||||
8461A2D21E145A08001DA4F8 /* UITableViewVibrantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UITableViewVibrantCell.swift; path = Pod/Classes/UITableViewVibrantCell.swift; sourceTree = "<group>"; };
|
||||
8432CC0122FFBCF4003D2BBD /* ExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
8432CC0322FFBCF5003D2BBD /* ExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleTests.swift; sourceTree = "<group>"; };
|
||||
8432CC0522FFBCF5003D2BBD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
849F7B67232104BD005DEB6A /* SideMenu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SideMenu.h; path = "Pods/Target Support Files/SideMenu/SideMenu.h"; sourceTree = "<group>"; };
|
||||
849F7B8823210C9A005DEB6A /* UITableViewVibrantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UITableViewVibrantCell.swift; path = Pod/Classes/UITableViewVibrantCell.swift; sourceTree = "<group>"; };
|
||||
849F7B8923210C9A005DEB6A /* SideMenuTransitionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuTransitionController.swift; path = Pod/Classes/SideMenuTransitionController.swift; sourceTree = "<group>"; };
|
||||
849F7B8A23210C9A005DEB6A /* SideMenuAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuAnimationController.swift; path = Pod/Classes/SideMenuAnimationController.swift; sourceTree = "<group>"; };
|
||||
849F7B8B23210C9A005DEB6A /* SideMenuInteractionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuInteractionController.swift; path = Pod/Classes/SideMenuInteractionController.swift; sourceTree = "<group>"; };
|
||||
849F7B8C23210C9A005DEB6A /* Initializable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Initializable.swift; path = Pod/Classes/Initializable.swift; sourceTree = "<group>"; };
|
||||
849F7B8D23210C9A005DEB6A /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Pod/Classes/Extensions.swift; sourceTree = "<group>"; };
|
||||
849F7B8E23210C9A005DEB6A /* SideMenuPresentationStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationStyle.swift; path = Pod/Classes/SideMenuPresentationStyle.swift; sourceTree = "<group>"; };
|
||||
849F7B8F23210C9A005DEB6A /* SideMenuNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuNavigationController.swift; path = Pod/Classes/SideMenuNavigationController.swift; sourceTree = "<group>"; };
|
||||
849F7B9023210C9A005DEB6A /* SideMenuPushCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPushCoordinator.swift; path = Pod/Classes/SideMenuPushCoordinator.swift; sourceTree = "<group>"; };
|
||||
849F7B9123210C9A005DEB6A /* Deprecations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Deprecations.swift; path = Pod/Classes/Deprecations.swift; sourceTree = "<group>"; };
|
||||
849F7B9223210C9A005DEB6A /* Print.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Print.swift; path = Pod/Classes/Print.swift; sourceTree = "<group>"; };
|
||||
849F7B9323210C9A005DEB6A /* SideMenuPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationController.swift; path = Pod/Classes/SideMenuPresentationController.swift; sourceTree = "<group>"; };
|
||||
849F7B9423210C9A005DEB6A /* SideMenuManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuManager.swift; path = Pod/Classes/SideMenuManager.swift; sourceTree = "<group>"; };
|
||||
849F7B9523210C9A005DEB6A /* Protected.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Protected.swift; path = Pod/Classes/Protected.swift; sourceTree = "<group>"; };
|
||||
84B489B21DD469B000D6CB43 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
|
||||
84B489B41DD469B000D6CB43 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
|
||||
84B489B91DD469DA00D6CB43 /* SideMenu.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SideMenu.podspec; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
|
||||
@@ -72,7 +83,6 @@
|
||||
C7DA85E73FE6228663AD9236 /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = "<group>"; };
|
||||
C9E09E1C686BF24AD4976EA7 /* Pods-ExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExampleTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||
CAE41BBB5F14E59C1FA0A821 /* Pods-Example-ExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-ExampleTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||
D1435FAD2F735E43F383BE96 /* Pods_ExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ExampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -80,7 +90,6 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
ACD6DAED90DE36FEA68CDF38 /* Pods_Example.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -91,6 +100,13 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
8432CBFE22FFBCF4003D2BBD /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
@@ -106,20 +122,21 @@
|
||||
65FF1B3F1DE33097007B0845 /* Source */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8428210222E0449300C6F2D8 /* Deprecations.swift */,
|
||||
842820F522DDD1E800C6F2D8 /* Extensions.swift */,
|
||||
842820F422DDD1E800C6F2D8 /* Initializable.swift */,
|
||||
842820F122DDD1E800C6F2D8 /* Models.swift */,
|
||||
842820F322DDD1E800C6F2D8 /* Print.swift */,
|
||||
842820EE22DDD1BC00C6F2D8 /* Protected.swift */,
|
||||
65FF1B3D1DE321D8007B0845 /* SideMenu.h */,
|
||||
842820FE22DDD24200C6F2D8 /* SideMenuInteractionController.swift */,
|
||||
84276D892282929A0095B7C5 /* SideMenuManager.swift */,
|
||||
842820F022DDD1E800C6F2D8 /* SideMenuPresentationController.swift */,
|
||||
842820FC22DDD21100C6F2D8 /* SideMenuPresentationStyle.swift */,
|
||||
842820F222DDD1E800C6F2D8 /* SideMenuTransitionController.swift */,
|
||||
8461A2D11E145A08001DA4F8 /* UISideMenuNavigationController.swift */,
|
||||
8461A2D21E145A08001DA4F8 /* UITableViewVibrantCell.swift */,
|
||||
849F7B67232104BD005DEB6A /* SideMenu.h */,
|
||||
849F7B9123210C9A005DEB6A /* Deprecations.swift */,
|
||||
849F7B8D23210C9A005DEB6A /* Extensions.swift */,
|
||||
849F7B8C23210C9A005DEB6A /* Initializable.swift */,
|
||||
849F7B9223210C9A005DEB6A /* Print.swift */,
|
||||
849F7B9523210C9A005DEB6A /* Protected.swift */,
|
||||
849F7B8A23210C9A005DEB6A /* SideMenuAnimationController.swift */,
|
||||
849F7B8B23210C9A005DEB6A /* SideMenuInteractionController.swift */,
|
||||
849F7B9423210C9A005DEB6A /* SideMenuManager.swift */,
|
||||
849F7B8F23210C9A005DEB6A /* SideMenuNavigationController.swift */,
|
||||
849F7B9323210C9A005DEB6A /* SideMenuPresentationController.swift */,
|
||||
849F7B8E23210C9A005DEB6A /* SideMenuPresentationStyle.swift */,
|
||||
849F7B9023210C9A005DEB6A /* SideMenuPushCoordinator.swift */,
|
||||
849F7B8923210C9A005DEB6A /* SideMenuTransitionController.swift */,
|
||||
849F7B8823210C9A005DEB6A /* UITableViewVibrantCell.swift */,
|
||||
);
|
||||
name = Source;
|
||||
sourceTree = "<group>";
|
||||
@@ -138,25 +155,15 @@
|
||||
path = Example;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
7B48A0E91DCB2487002990A1 /* ExampleTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7B48A0EA1DCB2487002990A1 /* Tests.swift */,
|
||||
7B48A0EC1DCB2487002990A1 /* Info.plist */,
|
||||
);
|
||||
path = ExampleTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
7B9DC8FA1DC6E8C1000D4007 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
65FF1B3F1DE33097007B0845 /* Source */,
|
||||
84B489B81DD469B900D6CB43 /* Podspec Metadata */,
|
||||
7B48A0D41DCB2487002990A1 /* Example */,
|
||||
7B48A0E91DCB2487002990A1 /* ExampleTests */,
|
||||
8432CC0222FFBCF5003D2BBD /* ExampleTests */,
|
||||
7B9DC9051DC6E8C1000D4007 /* Products */,
|
||||
9FB98148377EAEC00E35AC14 /* Pods */,
|
||||
9C94EEEBD250FF394115AAFC /* Frameworks */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@@ -165,10 +172,20 @@
|
||||
children = (
|
||||
7B9DC9041DC6E8C1000D4007 /* SideMenu.framework */,
|
||||
7B48A0D31DCB2487002990A1 /* Example.app */,
|
||||
8432CC0122FFBCF4003D2BBD /* ExampleTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
8432CC0222FFBCF5003D2BBD /* ExampleTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8432CC0322FFBCF5003D2BBD /* ExampleTests.swift */,
|
||||
8432CC0522FFBCF5003D2BBD /* Info.plist */,
|
||||
);
|
||||
path = ExampleTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84B489B81DD469B900D6CB43 /* Podspec Metadata */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -179,16 +196,6 @@
|
||||
name = "Podspec Metadata";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
9C94EEEBD250FF394115AAFC /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
47896ABC5C8830D88945A8D3 /* Pods_Example.framework */,
|
||||
D1435FAD2F735E43F383BE96 /* Pods_ExampleTests.framework */,
|
||||
52C8DD7BE43A8987854CA726 /* Pods_Example_ExampleTests.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
9FB98148377EAEC00E35AC14 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -209,7 +216,7 @@
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
65FF1B3E1DE321D8007B0845 /* SideMenu.h in Headers */,
|
||||
849F7BA423225F7F005DEB6A /* SideMenu.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -253,13 +260,31 @@
|
||||
productReference = 7B9DC9041DC6E8C1000D4007 /* SideMenu.framework */;
|
||||
productType = "com.apple.product-type.framework";
|
||||
};
|
||||
8432CC0022FFBCF4003D2BBD /* ExampleTests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 8432CC0822FFBCF5003D2BBD /* Build configuration list for PBXNativeTarget "ExampleTests" */;
|
||||
buildPhases = (
|
||||
8432CBFD22FFBCF4003D2BBD /* Sources */,
|
||||
8432CBFE22FFBCF4003D2BBD /* Frameworks */,
|
||||
8432CBFF22FFBCF4003D2BBD /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
8432CC0722FFBCF5003D2BBD /* PBXTargetDependency */,
|
||||
);
|
||||
name = ExampleTests;
|
||||
productName = ExampleTests;
|
||||
productReference = 8432CC0122FFBCF4003D2BBD /* ExampleTests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.ui-testing";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
7B9DC8FB1DC6E8C1000D4007 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 0800;
|
||||
LastSwiftUpdateCheck = 1030;
|
||||
LastUpgradeCheck = 0930;
|
||||
ORGANIZATIONNAME = jonkykong;
|
||||
TargetAttributes = {
|
||||
@@ -271,9 +296,15 @@
|
||||
};
|
||||
7B9DC9031DC6E8C1000D4007 = {
|
||||
CreatedOnToolsVersion = 8.0;
|
||||
LastSwiftMigration = 0900;
|
||||
LastSwiftMigration = 1030;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
8432CC0022FFBCF4003D2BBD = {
|
||||
CreatedOnToolsVersion = 10.3;
|
||||
DevelopmentTeam = QTJ767UH3L;
|
||||
ProvisioningStyle = Automatic;
|
||||
TestTargetID = 7B48A0D21DCB2487002990A1;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 7B9DC8FE1DC6E8C1000D4007 /* Build configuration list for PBXProject "SideMenu" */;
|
||||
@@ -292,6 +323,7 @@
|
||||
targets = (
|
||||
7B9DC9031DC6E8C1000D4007 /* SideMenu */,
|
||||
7B48A0D21DCB2487002990A1 /* Example */,
|
||||
8432CC0022FFBCF4003D2BBD /* ExampleTests */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
@@ -317,6 +349,13 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
8432CBFF22FFBCF4003D2BBD /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
@@ -374,24 +413,41 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
842820EF22DDD1BC00C6F2D8 /* Protected.swift in Sources */,
|
||||
8461A2D51E145A08001DA4F8 /* UISideMenuNavigationController.swift in Sources */,
|
||||
842820FD22DDD21100C6F2D8 /* SideMenuPresentationStyle.swift in Sources */,
|
||||
842820F822DDD1E800C6F2D8 /* SideMenuTransitionController.swift in Sources */,
|
||||
842820FF22DDD24200C6F2D8 /* SideMenuInteractionController.swift in Sources */,
|
||||
842820F922DDD1E800C6F2D8 /* Print.swift in Sources */,
|
||||
84276D8A2282929A0095B7C5 /* SideMenuManager.swift in Sources */,
|
||||
842820FB22DDD1E800C6F2D8 /* Extensions.swift in Sources */,
|
||||
842820F722DDD1E800C6F2D8 /* Models.swift in Sources */,
|
||||
842820F622DDD1E800C6F2D8 /* SideMenuPresentationController.swift in Sources */,
|
||||
842820FA22DDD1E800C6F2D8 /* Initializable.swift in Sources */,
|
||||
8428210322E0449300C6F2D8 /* Deprecations.swift in Sources */,
|
||||
8461A2D61E145A08001DA4F8 /* UITableViewVibrantCell.swift in Sources */,
|
||||
849F7B9923210C9A005DEB6A /* SideMenuInteractionController.swift in Sources */,
|
||||
849F7B9B23210C9A005DEB6A /* Extensions.swift in Sources */,
|
||||
849F7BA323210C9A005DEB6A /* Protected.swift in Sources */,
|
||||
849F7B9F23210C9A005DEB6A /* Deprecations.swift in Sources */,
|
||||
849F7B9A23210C9A005DEB6A /* Initializable.swift in Sources */,
|
||||
849F7BA223210C9A005DEB6A /* SideMenuManager.swift in Sources */,
|
||||
849F7B9E23210C9A005DEB6A /* SideMenuPushCoordinator.swift in Sources */,
|
||||
849F7BA123210C9A005DEB6A /* SideMenuPresentationController.swift in Sources */,
|
||||
849F7B9C23210C9A005DEB6A /* SideMenuPresentationStyle.swift in Sources */,
|
||||
849F7B9823210C9A005DEB6A /* SideMenuAnimationController.swift in Sources */,
|
||||
849F7BA023210C9A005DEB6A /* Print.swift in Sources */,
|
||||
849F7B9723210C9A005DEB6A /* SideMenuTransitionController.swift in Sources */,
|
||||
849F7B9623210C9A005DEB6A /* UITableViewVibrantCell.swift in Sources */,
|
||||
849F7B9D23210C9A005DEB6A /* SideMenuNavigationController.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
8432CBFD22FFBCF4003D2BBD /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8432CC0422FFBCF5003D2BBD /* ExampleTests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
8432CC0722FFBCF5003D2BBD /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 7B48A0D21DCB2487002990A1 /* Example */;
|
||||
targetProxy = 8432CC0622FFBCF5003D2BBD /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
7B48A0ED1DCB2487002990A1 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
@@ -455,6 +511,7 @@
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEFINES_MODULE = YES;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
@@ -518,6 +575,7 @@
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEFINES_MODULE = YES;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
@@ -581,6 +639,53 @@
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
8432CC0922FFBCF5003D2BBD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = QTJ767UH3L;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
INFOPLIST_FILE = ExampleTests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = co.massappeal.ExampleTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
TEST_TARGET_NAME = Example;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
8432CC0A22FFBCF5003D2BBD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = QTJ767UH3L;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
INFOPLIST_FILE = ExampleTests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = co.massappeal.ExampleTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
TEST_TARGET_NAME = Example;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
@@ -611,6 +716,15 @@
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
8432CC0822FFBCF5003D2BBD /* Build configuration list for PBXNativeTarget "ExampleTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
8432CC0922FFBCF5003D2BBD /* Debug */,
|
||||
8432CC0A22FFBCF5003D2BBD /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 7B9DC8FB1DC6E8C1000D4007 /* Project object */;
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0900"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "7B48A0D21DCB2487002990A1"
|
||||
BuildableName = "Example.app"
|
||||
BlueprintName = "Example"
|
||||
ReferencedContainer = "container:SideMenu.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "8432CC0022FFBCF4003D2BBD"
|
||||
BuildableName = "ExampleTests.xctest"
|
||||
BlueprintName = "ExampleTests"
|
||||
ReferencedContainer = "container:SideMenu.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "7B48A0D21DCB2487002990A1"
|
||||
BuildableName = "Example.app"
|
||||
BlueprintName = "Example"
|
||||
ReferencedContainer = "container:SideMenu.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "7B48A0D21DCB2487002990A1"
|
||||
BuildableName = "Example.app"
|
||||
BlueprintName = "Example"
|
||||
ReferencedContainer = "container:SideMenu.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "7B48A0D21DCB2487002990A1"
|
||||
BuildableName = "Example.app"
|
||||
BlueprintName = "Example"
|
||||
ReferencedContainer = "container:SideMenu.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 135 KiB |
Reference in New Issue
Block a user