├── .gitignore
├── AMSlideMenuExample
├── AMSlideMenuExample
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── ViewController.swift
│ ├── MainContainerViewController.swift
│ ├── MenuChooserViewController.swift
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── Info.plist
│ └── SceneDelegate.swift
├── Pods
│ ├── Target Support Files
│ │ ├── Pods-AMSlideMenuExample
│ │ │ ├── Pods-AMSlideMenuExample-frameworks-Debug-output-files.xcfilelist
│ │ │ ├── Pods-AMSlideMenuExample-frameworks-Release-output-files.xcfilelist
│ │ │ ├── Pods-AMSlideMenuExample.modulemap
│ │ │ ├── Pods-AMSlideMenuExample-dummy.m
│ │ │ ├── Pods-AMSlideMenuExample-frameworks-Debug-input-files.xcfilelist
│ │ │ ├── Pods-AMSlideMenuExample-frameworks-Release-input-files.xcfilelist
│ │ │ ├── Pods-AMSlideMenuExample-umbrella.h
│ │ │ ├── Pods-AMSlideMenuExample.debug.xcconfig
│ │ │ ├── Pods-AMSlideMenuExample.release.xcconfig
│ │ │ ├── Pods-AMSlideMenuExample-Info.plist
│ │ │ ├── Pods-AMSlideMenuExample-acknowledgements.markdown
│ │ │ ├── Pods-AMSlideMenuExample-acknowledgements.plist
│ │ │ └── Pods-AMSlideMenuExample-frameworks.sh
│ │ └── AMSlideMenu
│ │ │ ├── AMSlideMenu.modulemap
│ │ │ ├── AMSlideMenu-dummy.m
│ │ │ ├── AMSlideMenu-prefix.pch
│ │ │ ├── AMSlideMenu-umbrella.h
│ │ │ ├── AMSlideMenu.debug.xcconfig
│ │ │ ├── AMSlideMenu.release.xcconfig
│ │ │ └── AMSlideMenu-Info.plist
│ ├── Manifest.lock
│ ├── Pods.xcodeproj
│ │ ├── xcuserdata
│ │ │ └── artur.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── xcschememanagement.plist
│ │ │ │ ├── Pods-AMSlideMenuExample.xcscheme
│ │ │ │ └── AMSlideMenu.xcscheme
│ │ └── project.pbxproj
│ └── Local Podspecs
│ │ └── AMSlideMenu.podspec.json
├── AMSlideMenuExample.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ ├── xcuserdata
│ │ └── artur.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ └── project.pbxproj
├── AMSlideMenuExample.xcworkspace
│ ├── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
│ └── contents.xcworkspacedata
├── Podfile
└── Podfile.lock
├── .swiftpm
└── xcode
│ ├── package.xcworkspace
│ └── contents.xcworkspacedata
│ └── xcuserdata
│ └── artur.xcuserdatad
│ └── xcschemes
│ └── xcschememanagement.plist
├── Package.swift
├── AMSlideMenu.podspec
├── LICENSE
├── AMSlideMenu
├── Segues
│ ├── AMRightMenuSegue.swift
│ ├── AMLeftMenuSegue.swift
│ └── AMContentSegue.swift
├── Animation
│ ├── AMSlidingAnimatorProtocol.swift
│ ├── Animators
│ │ ├── AMSlidingShadowAnimator.swift
│ │ ├── AMSlidingContentShadowAnimator.swift
│ │ ├── AMSlidingBlurAnimator.swift
│ │ ├── AMSlidingDimmedBackgroundAnimator.swift
│ │ ├── AMSlidingGroupAnimator.swift
│ │ ├── AMSlidingFixedMenuAnimator.swift
│ │ ├── AMSlidingContentAnimator.swift
│ │ └── AMSlidingStandardAnimator.swift
│ ├── AMSlidingAnimationOptions.swift
│ ├── AMSlidingAnimatorFactory.swift
│ └── CAMediaTimingFunction+AMExtension.swift
├── Extensions
│ └── UIViewController+AMExtension.swift
├── CustomVisualEffectView
│ └── BlurryOverlayView.swift
└── AMSlideMenuMainViewController.swift
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | *.xccheckout
3 |
4 | *.xcuserstate
5 |
6 | *.xcsettings
7 |
8 | .DS_Store
9 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-frameworks-Debug-output-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AMSlideMenu.framework
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-frameworks-Release-output-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AMSlideMenu.framework
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/AMSlideMenu/AMSlideMenu.modulemap:
--------------------------------------------------------------------------------
1 | framework module AMSlideMenu {
2 | umbrella header "AMSlideMenu-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/AMSlideMenu/AMSlideMenu-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_AMSlideMenu : NSObject
3 | @end
4 | @implementation PodsDummy_AMSlideMenu
5 | @end
6 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample.modulemap:
--------------------------------------------------------------------------------
1 | framework module Pods_AMSlideMenuExample {
2 | umbrella header "Pods-AMSlideMenuExample-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Pods_AMSlideMenuExample : NSObject
3 | @end
4 | @implementation PodsDummy_Pods_AMSlideMenuExample
5 | @end
6 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-frameworks-Debug-input-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${PODS_ROOT}/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-frameworks.sh
2 | ${BUILT_PRODUCTS_DIR}/AMSlideMenu/AMSlideMenu.framework
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-frameworks-Release-input-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${PODS_ROOT}/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-frameworks.sh
2 | ${BUILT_PRODUCTS_DIR}/AMSlideMenu/AMSlideMenu.framework
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/AMSlideMenu/AMSlideMenu-prefix.pch:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | target 'AMSlideMenuExample' do
5 | # Comment the next line if you don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for AMSlideMenuExample
9 | pod 'AMSlideMenu', :path => '../'
10 |
11 | end
12 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - AMSlideMenu (2.0.2)
3 |
4 | DEPENDENCIES:
5 | - AMSlideMenu (from `../`)
6 |
7 | EXTERNAL SOURCES:
8 | AMSlideMenu:
9 | :path: "../"
10 |
11 | SPEC CHECKSUMS:
12 | AMSlideMenu: 50139e20a2c41fd7787ed96cc5f560ffde469fef
13 |
14 | PODFILE CHECKSUM: c1e7c5ded39e84d083dd8f35a8d14dce1343f062
15 |
16 | COCOAPODS: 1.9.1
17 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - AMSlideMenu (2.0.2)
3 |
4 | DEPENDENCIES:
5 | - AMSlideMenu (from `../`)
6 |
7 | EXTERNAL SOURCES:
8 | AMSlideMenu:
9 | :path: "../"
10 |
11 | SPEC CHECKSUMS:
12 | AMSlideMenu: 50139e20a2c41fd7787ed96cc5f560ffde469fef
13 |
14 | PODFILE CHECKSUM: c1e7c5ded39e84d083dd8f35a8d14dce1343f062
15 |
16 | COCOAPODS: 1.9.1
17 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/AMSlideMenu/AMSlideMenu-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double AMSlideMenuVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char AMSlideMenuVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double Pods_AMSlideMenuExampleVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char Pods_AMSlideMenuExampleVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample.xcodeproj/xcuserdata/artur.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | AMSlideMenuExample.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 2
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:5.2
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "AMSlideMenu",
8 | platforms: [.iOS(.v10)],
9 | products: [
10 | .library(name: "AMSlideMenu", targets: ["AMSlideMenu"]),
11 | ],
12 | dependencies: [],
13 | targets: [
14 | .target(
15 | name: "AMSlideMenu",
16 | dependencies: [],
17 | path: "AMSlideMenu"),
18 | ],
19 | swiftLanguageVersions: [.v5]
20 | )
21 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // AMSlideMenuExample
4 | //
5 | // Created by Artur Mkrtchyan on 5/17/20.
6 | // Copyright © 2020 Artur Mkrtchyan. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class ViewController: UIViewController {
12 |
13 | override func viewDidLoad() {
14 | super.viewDidLoad()
15 | // Do any additional setup after loading the view.
16 | }
17 |
18 | @IBAction func backToRoot(_ sender: Any) {
19 | slideMenuMainVC?.navigationController?.popToRootViewController(animated: true)
20 | }
21 |
22 | }
23 |
24 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/AMSlideMenu/AMSlideMenu.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AMSlideMenu
2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
3 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
4 | PODS_BUILD_DIR = ${BUILD_DIR}
5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
6 | PODS_ROOT = ${SRCROOT}
7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../..
8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
9 | SKIP_INSTALL = YES
10 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
11 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/AMSlideMenu/AMSlideMenu.release.xcconfig:
--------------------------------------------------------------------------------
1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AMSlideMenu
2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
3 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
4 | PODS_BUILD_DIR = ${BUILD_DIR}
5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
6 | PODS_ROOT = ${SRCROOT}
7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../..
8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
9 | SKIP_INSTALL = YES
10 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
11 |
--------------------------------------------------------------------------------
/.swiftpm/xcode/xcuserdata/artur.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | AMSlideMenu.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | AMSlideMenu
16 |
17 | primary
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample/MainContainerViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainContainerViewController.swift
3 | // AMSlideMenuExample
4 | //
5 | // Created by Artur Mkrtchyan on 5/20/20.
6 | // Copyright © 2020 Artur Mkrtchyan. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import AMSlideMenu
11 |
12 | class MainContainerViewController: AMSlideMenuMainViewController {
13 |
14 | override func viewDidLoad() {
15 | super.viewDidLoad()
16 |
17 | // Do any additional setup after loading the view.
18 | }
19 |
20 | override func viewWillAppear(_ animated: Bool) {
21 | super.viewWillAppear(animated)
22 | navigationController?.setNavigationBarHidden(true, animated: animated)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Pods.xcodeproj/xcuserdata/artur.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | AMSlideMenu.xcscheme
8 |
9 | isShown
10 |
11 | orderHint
12 | 0
13 |
14 | Pods-AMSlideMenuExample.xcscheme
15 |
16 | isShown
17 |
18 | orderHint
19 | 1
20 |
21 |
22 | SuppressBuildableAutocreation
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample.debug.xcconfig:
--------------------------------------------------------------------------------
1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMSlideMenu"
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMSlideMenu/AMSlideMenu.framework/Headers"
5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
6 | OTHER_LDFLAGS = $(inherited) -framework "AMSlideMenu"
7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
8 | PODS_BUILD_DIR = ${BUILD_DIR}
9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
11 | PODS_ROOT = ${SRCROOT}/Pods
12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
13 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample.release.xcconfig:
--------------------------------------------------------------------------------
1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMSlideMenu"
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AMSlideMenu/AMSlideMenu.framework/Headers"
5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
6 | OTHER_LDFLAGS = $(inherited) -framework "AMSlideMenu"
7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
8 | PODS_BUILD_DIR = ${BUILD_DIR}
9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
11 | PODS_ROOT = ${SRCROOT}/Pods
12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
13 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/AMSlideMenu/AMSlideMenu-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 2.0.2
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Local Podspecs/AMSlideMenu.podspec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AMSlideMenu",
3 | "version": "2.0.2",
4 | "swift_versions": "5.1",
5 | "summary": "Easy slide menu with high customization for ios",
6 | "platforms": {
7 | "ios": "10.0"
8 | },
9 | "source": {
10 | "git": "https://github.com/arturdev/AMSlideMenu.git",
11 | "tag": "2.0.1"
12 | },
13 | "social_media_url": "https://www.linkedin.com/in/arturdev/",
14 | "description": "This is a simple library to create sliding menus that can be used in storyboards.\n\nWith this library you can create 3 types of sliding menus: \n1. Slide menu with right menu only. \n2. Slide menu with left menu only. \n3. Slide menu with both left and right menus. \n\nThis repo contains project that demonstrate a usage of AMSlideMenu.\nWorks for both iPhone and iPad and macCatalyst.",
15 | "homepage": "https://github.com/arturdev/AMSlideMenu",
16 | "license": "MIT",
17 | "authors": {
18 | "Artur Mkrtchyan": "mkrtarturdev@gmail.com"
19 | },
20 | "source_files": "AMSlideMenu/**/*.{swift}",
21 | "swift_version": "5.1"
22 | }
23 |
--------------------------------------------------------------------------------
/AMSlideMenu.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 | s.name = "AMSlideMenu"
3 | s.version = "2.0.4"
4 | s.swift_version = '5.1'
5 | s.summary = "Easy slide menu with high customization for ios"
6 | s.platform = :ios, '10.0'
7 | s.source = { :git => "https://github.com/arturdev/AMSlideMenu2.git", :tag => "2.0.3" }
8 | s.social_media_url = 'https://www.linkedin.com/in/arturdev/'
9 | s.description = <<-DESC
10 | This is a simple library to create sliding menus that can be used in storyboards.
11 |
12 | With this library you can create 3 types of sliding menus:
13 | 1. Slide menu with right menu only.
14 | 2. Slide menu with left menu only.
15 | 3. Slide menu with both left and right menus.
16 |
17 | This repo contains project that demonstrate a usage of AMSlideMenu.
18 | Works for both iPhone and iPad and macCatalyst.
19 | DESC
20 | s.homepage = "https://github.com/arturdev/AMSlideMenu"
21 | s.license = 'MIT'
22 | s.author = { "Artur Mkrtchyan" => "mkrtarturdev@gmail.com" }
23 | s.source_files = 'AMSlideMenu/**/*.{swift}'
24 | end
25 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2013 arturdev
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of
6 | this software and associated documentation files (the "Software"), to deal in
7 | the Software without restriction, including without limitation the rights to
8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9 | the Software, and to permit persons to whom the Software is furnished to do so,
10 | subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample/MenuChooserViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MenuChooserViewController.swift
3 | // AMSlideMenuExample
4 | //
5 | // Created by Artur Mkrtchyan on 5/20/20.
6 | // Copyright © 2020 Artur Mkrtchyan. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import AMSlideMenu
11 |
12 | class MenuChooserViewController: UITableViewController {
13 |
14 | override func viewDidLoad() {
15 | super.viewDidLoad()
16 |
17 | // Uncomment the following line to preserve selection between presentations
18 | // self.clearsSelectionOnViewWillAppear = false
19 |
20 | // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
21 | // self.navigationItem.rightBarButtonItem = self.editButtonItem
22 | }
23 |
24 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
25 | guard let mainContainerVC = segue.destination as? MainContainerViewController else { return }
26 | if segue.identifier == "slidingMenues" {
27 | mainContainerVC.animationOptions = [.slidingMenu, .menuShadow, .blurBackground, .dimmedBackground]
28 | } else {
29 | mainContainerVC.animationOptions = [.fixedMenu, .content, .contentShadow, .dimmedBackground]
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-acknowledgements.markdown:
--------------------------------------------------------------------------------
1 | # Acknowledgements
2 | This application makes use of the following third party libraries:
3 |
4 | ## AMSlideMenu
5 |
6 | The MIT License (MIT)
7 |
8 | Copyright (c) 2013 arturdev
9 |
10 | Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | this software and associated documentation files (the "Software"), to deal in
12 | the Software without restriction, including without limitation the rights to
13 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | the Software, and to permit persons to whom the Software is furnished to do so,
15 | subject to the following conditions:
16 |
17 | The above copyright notice and this permission notice shall be included in all
18 | copies or substantial portions of the Software.
19 |
20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 |
27 | Generated by CocoaPods - https://cocoapods.org
28 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // AMSlideMenuExample
4 | //
5 | // Created by Artur Mkrtchyan on 5/17/20.
6 | // Copyright © 2020 Artur Mkrtchyan. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
17 | // Override point for customization after application launch.
18 | return true
19 | }
20 |
21 | // MARK: UISceneSession Lifecycle
22 |
23 | @available(iOS 13.0, *)
24 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
25 | // Called when a new scene session is being created.
26 | // Use this method to select a configuration to create the new scene with.
27 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
28 | }
29 |
30 | @available(iOS 13.0, *)
31 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
32 | // Called when the user discards a scene session.
33 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
34 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
35 | }
36 |
37 |
38 | }
39 |
40 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/AMSlideMenu/Segues/AMRightMenuSegue.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMRightMenuSegue.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | class AMRightMenuSegue: UIStoryboardSegue {
30 | override open func perform() {
31 | guard let sourceVC = self.source as? AMSlideMenuMainViewController else { return }
32 |
33 | destination.slideMenuMainVC = sourceVC
34 | destination.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
35 | sourceVC.setRightMenu(destination)
36 | sourceVC.updateRightMenuFrame()
37 | sourceVC.view.addSubview(destination.view)
38 | destination.view.isHidden = true
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/AMSlideMenu/Segues/AMLeftMenuSegue.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMLeftMenuSegue.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | open class AMLeftMenuSegue: UIStoryboardSegue {
30 | override open func perform() {
31 | guard let sourceVC = self.source as? AMSlideMenuMainViewController else { return }
32 |
33 | destination.slideMenuMainVC = sourceVC
34 | destination.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
35 | sourceVC.setLeftMenu(destination)
36 | sourceVC.updateLeftMenuFrame()
37 | sourceVC.view.addSubview(destination.view)
38 | destination.view.isHidden = true
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ATTENTION‼️
2 | Starting from v2.0.0 all the APIs are changed. You can find the old version in the AMSlideMenu_ObjC branch.
3 |
4 |
5 | AMSlideMenu2
6 | ===========
7 |
8 | Made with ❤️ by matghazaryan .
9 |
10 | Supported iOS version: >= 10.0
11 |
12 | This is a simple library to create sliding menus!
13 |
14 | With this library you can create 3 types of sliding menus:
15 | 1. Slide menu with right menu only.
16 | 2. Slide menu with left menu only.
17 | 3. Slide menu with both left and right menus.
18 |
19 |
20 | This repo contains project that demonstrate usage of AMSlideMenu .
21 | Works for both iPhone, iPad and macCatalyst.
22 |
23 |
24 | ### Installation with CocoaPods
25 |
26 | [CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries installation in your projects.
27 |
28 | #### Podfile
29 |
30 | ```ruby
31 | pod "AMSlideMenu", "~> 2.0.1"
32 | ```
33 |
34 | ### Swift Package Manager
35 | You can also use Swift Package Manager to add AMSlideMenu as a dependency to your project. In order to do so, use the following URL:
36 |
37 | ```bash
38 | https://github.com/matghazaryan/AMSlideMenu.git
39 | ```
40 |
41 | USAGE
42 | ======================
43 | [](https://www.youtube.com/watch?v=0NUHbPiTDpo)
44 |
45 |
46 |
47 | CUSTOMIZATION
48 | =============
49 |
50 | You can easily customize slide menu by overriding needed methods of AMSlideMenuMainViewController, almost all methods are `open`.
51 |
52 |
53 | SCREENSHOTS
54 | ===========
55 |
56 | Screenshots comming soon!
57 |
58 | ## Author
59 |
60 | matghazaryan, matevos14@gmail.com
61 |
62 | Ideas
63 | ===========
64 | If you have any cool idea you would like to see in this lib or you found a bug please feel free to open an issue :)
65 |
66 | Thank You.
67 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "scale" : "2x",
6 | "size" : "20x20"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "scale" : "3x",
11 | "size" : "20x20"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "scale" : "2x",
16 | "size" : "29x29"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "scale" : "3x",
21 | "size" : "29x29"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "scale" : "2x",
26 | "size" : "40x40"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "scale" : "2x",
36 | "size" : "60x60"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "scale" : "3x",
41 | "size" : "60x60"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "scale" : "1x",
46 | "size" : "20x20"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "scale" : "2x",
51 | "size" : "20x20"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "scale" : "1x",
56 | "size" : "29x29"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "29x29"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "scale" : "1x",
66 | "size" : "40x40"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "scale" : "2x",
71 | "size" : "40x40"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "scale" : "1x",
76 | "size" : "76x76"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "scale" : "2x",
81 | "size" : "76x76"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "scale" : "2x",
86 | "size" : "83.5x83.5"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "scale" : "1x",
91 | "size" : "1024x1024"
92 | }
93 | ],
94 | "info" : {
95 | "author" : "xcode",
96 | "version" : 1
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 | UISceneConfigurations
28 |
29 | UIWindowSceneSessionRoleApplication
30 |
31 |
32 | UISceneConfigurationName
33 | Default Configuration
34 | UISceneDelegateClassName
35 | $(PRODUCT_MODULE_NAME).SceneDelegate
36 | UISceneStoryboardFile
37 | Main
38 |
39 |
40 |
41 |
42 | UILaunchStoryboardName
43 | LaunchScreen
44 | UIMainStoryboardFile
45 | Main
46 | UIRequiredDeviceCapabilities
47 |
48 | armv7
49 |
50 | UISupportedInterfaceOrientations
51 |
52 | UIInterfaceOrientationPortrait
53 | UIInterfaceOrientationLandscapeLeft
54 | UIInterfaceOrientationLandscapeRight
55 |
56 | UISupportedInterfaceOrientations~ipad
57 |
58 | UIInterfaceOrientationPortrait
59 | UIInterfaceOrientationPortraitUpsideDown
60 | UIInterfaceOrientationLandscapeLeft
61 | UIInterfaceOrientationLandscapeRight
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Pods.xcodeproj/xcuserdata/artur.xcuserdatad/xcschemes/Pods-AMSlideMenuExample.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
53 |
54 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/AMSlideMenu/Animation/AMSlidingAnimatorProtocol.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMSlidingAnimator.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | public protocol AMSlidingAnimatorProtocol: class {
30 | var duration: TimeInterval {get set}
31 |
32 | func animate(leftMenuView: UIView, contentView: UIView, progress: CGFloat, animated: Bool, completion: (()->Void)?)
33 | func animate(rightMenuView: UIView, contentView: UIView, progress: CGFloat, animated: Bool, completion: (()->Void)?)
34 | }
35 |
36 | extension AMSlidingAnimatorProtocol {
37 |
38 | public func animate(leftMenuView: UIView, contentView: UIView, progress: CGFloat = 1, animated: Bool = true, completion: (()->Void)? = nil) {
39 | animate(leftMenuView: leftMenuView, contentView: contentView, progress: progress, animated: animated, completion: completion)
40 | }
41 |
42 | public func animate(rightMenuView: UIView, contentView: UIView, progress: CGFloat = 1, animated: Bool = true, completion: (()->Void)? = nil) {
43 | animate(rightMenuView: rightMenuView, contentView: contentView, progress: progress, animated: animated, completion: completion)
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Pods.xcodeproj/xcuserdata/artur.xcuserdatad/xcschemes/AMSlideMenu.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
45 |
46 |
52 |
53 |
55 |
56 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-acknowledgements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreferenceSpecifiers
6 |
7 |
8 | FooterText
9 | This application makes use of the following third party libraries:
10 | Title
11 | Acknowledgements
12 | Type
13 | PSGroupSpecifier
14 |
15 |
16 | FooterText
17 | The MIT License (MIT)
18 |
19 | Copyright (c) 2013 arturdev
20 |
21 | Permission is hereby granted, free of charge, to any person obtaining a copy of
22 | this software and associated documentation files (the "Software"), to deal in
23 | the Software without restriction, including without limitation the rights to
24 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
25 | the Software, and to permit persons to whom the Software is furnished to do so,
26 | subject to the following conditions:
27 |
28 | The above copyright notice and this permission notice shall be included in all
29 | copies or substantial portions of the Software.
30 |
31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
33 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
34 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
35 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
36 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37 |
38 | License
39 | MIT
40 | Title
41 | AMSlideMenu
42 | Type
43 | PSGroupSpecifier
44 |
45 |
46 | FooterText
47 | Generated by CocoaPods - https://cocoapods.org
48 | Title
49 |
50 | Type
51 | PSGroupSpecifier
52 |
53 |
54 | StringsTable
55 | Acknowledgements
56 | Title
57 | Acknowledgements
58 |
59 |
60 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // AMSlideMenuExample
4 | //
5 | // Created by Artur Mkrtchyan on 5/17/20.
6 | // Copyright © 2020 Artur Mkrtchyan. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @available(iOS 13.0, *)
12 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
18 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
19 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
20 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
21 | guard let _ = (scene as? UIWindowScene) else { return }
22 | }
23 |
24 | func sceneDidDisconnect(_ scene: UIScene) {
25 | // Called as the scene is being released by the system.
26 | // This occurs shortly after the scene enters the background, or when its session is discarded.
27 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
28 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
29 | }
30 |
31 | func sceneDidBecomeActive(_ scene: UIScene) {
32 | // Called when the scene has moved from an inactive state to an active state.
33 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
34 | }
35 |
36 | func sceneWillResignActive(_ scene: UIScene) {
37 | // Called when the scene will move from an active state to an inactive state.
38 | // This may occur due to temporary interruptions (ex. an incoming phone call).
39 | }
40 |
41 | func sceneWillEnterForeground(_ scene: UIScene) {
42 | // Called as the scene transitions from the background to the foreground.
43 | // Use this method to undo the changes made on entering the background.
44 | }
45 |
46 | func sceneDidEnterBackground(_ scene: UIScene) {
47 | // Called as the scene transitions from the foreground to the background.
48 | // Use this method to save data, release shared resources, and store enough scene-specific state information
49 | // to restore the scene back to its current state.
50 | }
51 |
52 |
53 | }
54 |
55 |
--------------------------------------------------------------------------------
/AMSlideMenu/Animation/Animators/AMSlidingShadowAnimator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMSlidingShadowAnimator.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | open class AMSlidingShadowAnimator: AMSlidingAnimatorProtocol {
30 | open var duration: TimeInterval = 0.25
31 |
32 | open func animate(leftMenuView: UIView, contentView: UIView, progress: CGFloat, animated: Bool, completion: (() -> Void)?) {
33 | leftMenuView.layer.shadowColor = UIColor(red: 8/255.0, green: 46/255.0, blue: 88/255.0, alpha: 0.28).cgColor
34 | leftMenuView.layer.shadowOffset = CGSize(width: 1, height: 0)
35 | leftMenuView.layer.shadowRadius = 5
36 |
37 | UIView.animate(withDuration: animated ? duration : 0, animations: {
38 | leftMenuView.layer.shadowOpacity = Float(progress)
39 | }) { (_) in
40 | completion?()
41 | }
42 | }
43 |
44 | open func animate(rightMenuView: UIView, contentView: UIView, progress: CGFloat = 1, animated: Bool = true, completion: (() -> Void)? = nil) {
45 | rightMenuView.layer.shadowColor = UIColor(red: 8/255.0, green: 46/255.0, blue: 88/255.0, alpha: 0.28).cgColor
46 | rightMenuView.layer.shadowOffset = CGSize(width: -1, height: 0)
47 | rightMenuView.layer.shadowRadius = 5
48 |
49 | UIView.animate(withDuration: animated ? duration : 0, animations: {
50 | rightMenuView.layer.shadowOpacity = Float(progress)
51 | }) { (_) in
52 | completion?()
53 | }
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/AMSlideMenu/Animation/AMSlidingAnimationOptions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMSlidingAnimationType.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | public struct AMSlidingAnimationOptions: OptionSet {
30 |
31 | public let rawValue: Int
32 | public var animator: AMSlidingAnimatorProtocol?
33 | public var tag: Int?
34 |
35 | public static let slidingMenu = AMSlidingAnimationOptions(rawValue: 1 << 1)
36 | public static let fixedMenu = AMSlidingAnimationOptions(rawValue: 1 << 2)
37 | public static let content = AMSlidingAnimationOptions(rawValue: 1 << 3)
38 | public static let blurBackground = AMSlidingAnimationOptions(rawValue: 1 << 4)
39 | public static let menuShadow = AMSlidingAnimationOptions(rawValue: 1 << 5)
40 | public static let contentShadow = AMSlidingAnimationOptions(rawValue: 1 << 6)
41 | public static let dimmedBackground = AMSlidingAnimationOptions(rawValue: 1 << 7)
42 |
43 | internal static var customOptions = [AMSlidingAnimationOptions]()
44 |
45 | public static func custom(_ animator: AMSlidingAnimatorProtocol, tag: Int) -> AMSlidingAnimationOptions {
46 | if let index = customOptions.firstIndex(where: {$0.tag == tag}) {
47 | customOptions.remove(at: index)
48 | }
49 | var custom = AMSlidingAnimationOptions(rawValue: 1 << (7 + customOptions.count))
50 | custom.animator = animator
51 | custom.tag = tag
52 | customOptions.append(custom)
53 | return custom
54 | }
55 |
56 | public init(rawValue: Int) {
57 | self.rawValue = rawValue
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/AMSlideMenu/Animation/Animators/AMSlidingContentShadowAnimator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMSlidingContentShadowAnimator.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | open class AMSlidingContentShadowAnimator: AMSlidingAnimatorProtocol {
30 | open var duration: TimeInterval = 0.25
31 |
32 | open func animate(leftMenuView: UIView, contentView: UIView, progress: CGFloat, animated: Bool, completion: (() -> Void)?) {
33 | contentView.layer.shadowColor = UIColor(red: 8/255.0, green: 46/255.0, blue: 88/255.0, alpha: 0.28).cgColor
34 | contentView.layer.shadowOffset = CGSize(width: 1, height: 0)
35 | contentView.layer.shadowRadius = 5
36 | contentView.layer.masksToBounds = false
37 |
38 | UIView.animate(withDuration: animated ? duration : 0, animations: {
39 | contentView.layer.shadowOpacity = Float(progress)
40 | }) { (_) in
41 | completion?()
42 | }
43 | }
44 |
45 | open func animate(rightMenuView: UIView, contentView: UIView, progress: CGFloat = 1, animated: Bool = true, completion: (() -> Void)? = nil) {
46 | contentView.layer.shadowColor = UIColor(red: 8/255.0, green: 46/255.0, blue: 88/255.0, alpha: 0.28).cgColor
47 | contentView.layer.shadowOffset = CGSize(width: 1, height: 0)
48 | contentView.layer.shadowRadius = 5
49 | contentView.layer.masksToBounds = false
50 |
51 | UIView.animate(withDuration: animated ? duration : 0, animations: {
52 | contentView.layer.shadowOpacity = Float(progress)
53 | }) { (_) in
54 | completion?()
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/AMSlideMenu/Animation/AMSlidingAnimatorFactory.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMSlidingAnimatorFactory.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import Foundation
28 |
29 | public class AMSlidingAnimatorFactory {
30 |
31 | public static func animator(options: AMSlidingAnimationOptions, duration: TimeInterval) -> AMSlidingAnimatorProtocol {
32 | var animators = [AMSlidingAnimatorProtocol]()
33 |
34 | if options.contains(.slidingMenu) {
35 | animators.append(AMSlidingStandardAnimator())
36 | }
37 |
38 | if options.contains(.blurBackground) {
39 | animators.append(AMSlidingBlurAnimator())
40 | }
41 |
42 | if options.contains(.menuShadow) {
43 | animators.append(AMSlidingShadowAnimator())
44 | }
45 |
46 | if options.contains(.dimmedBackground) {
47 | animators.append(AMSlidingDimmedBackgroundAnimator())
48 | }
49 |
50 | if options.contains(.content) {
51 | animators.append(AMSlidingContentAnimator())
52 | }
53 |
54 | if options.contains(.fixedMenu) {
55 | animators.append(AMSlidingFixedMenuAnimator())
56 | }
57 |
58 | if options.contains(.contentShadow) {
59 | animators.append(AMSlidingContentShadowAnimator())
60 | }
61 |
62 | animators.forEach({$0.duration = duration})
63 |
64 | for option in AMSlidingAnimationOptions.customOptions {
65 | animators.append(option.animator!)
66 | }
67 |
68 | let animator = AMSlidingGroupAnimator()
69 | animator.addAnimators(animators)
70 | return animator
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/AMSlideMenu/Animation/Animators/AMSlidingBlurAnimator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMSlidingBlureAnimator.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | open class AMSlidingBlurAnimator: AMSlidingAnimatorProtocol {
30 | open var duration: TimeInterval = 0.25
31 | open var maxBlurRadius: CGFloat = 0.2
32 |
33 | let effectsView: BlurryOverlayView = {
34 | let view = BlurryOverlayView(effect: UIBlurEffect(style: .light))
35 | view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
36 | view.isUserInteractionEnabled = false
37 | return view
38 | }()
39 |
40 | open func animate(leftMenuView: UIView, contentView: UIView, progress: CGFloat, animated: Bool, completion: (() -> Void)?) {
41 | if effectsView.superview == nil {
42 | effectsView.frame = contentView.bounds
43 | contentView.addSubview(effectsView)
44 | }
45 |
46 | self.effectsView.blur(amount: progress * maxBlurRadius, duration: animated ? duration : 0)
47 | DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
48 | completion?()
49 | }
50 | }
51 |
52 | open func animate(rightMenuView: UIView, contentView: UIView, progress: CGFloat = 1, animated: Bool = true, completion: (() -> Void)? = nil) {
53 | if effectsView.superview == nil {
54 | effectsView.frame = contentView.bounds
55 | contentView.addSubview(effectsView)
56 | }
57 | self.effectsView.blur(amount: progress * maxBlurRadius, duration: animated ? duration : 0)
58 | DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
59 | completion?()
60 | }
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/AMSlideMenu/Animation/Animators/AMSlidingDimmedBackgroundAnimator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMSlidingDimmedBackgroundAnimator.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | open class AMSlidingDimmedBackgroundAnimator: AMSlidingAnimatorProtocol {
30 | open var duration: TimeInterval = 0.25
31 |
32 | public let overlayView: UIView = {
33 | let view = UIView()
34 | view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
35 | view.isUserInteractionEnabled = false
36 | view.backgroundColor = UIColor.black.withAlphaComponent(0.45)
37 | view.alpha = 0
38 | return view
39 | }()
40 |
41 | open func animate(leftMenuView: UIView, contentView: UIView, progress: CGFloat, animated: Bool, completion: (() -> Void)?) {
42 | if overlayView.superview == nil {
43 | overlayView.frame = contentView.bounds
44 | contentView.addSubview(overlayView)
45 | }
46 |
47 | UIView.animate(withDuration: animated ? duration : 0, animations: {
48 | self.overlayView.alpha = progress
49 | }) { (_) in
50 | completion?()
51 | }
52 | }
53 |
54 | open func animate(rightMenuView: UIView, contentView: UIView, progress: CGFloat = 1, animated: Bool = true, completion: (() -> Void)? = nil) {
55 | if overlayView.superview == nil {
56 | overlayView.frame = contentView.bounds
57 | contentView.addSubview(overlayView)
58 | }
59 |
60 | UIView.animate(withDuration: animated ? duration : 0, animations: {
61 | self.overlayView.alpha = progress
62 | }) { (_) in
63 | completion?()
64 | }
65 | }
66 |
67 | public init() {}
68 | }
69 |
--------------------------------------------------------------------------------
/AMSlideMenu/Segues/AMContentSegue.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMInitialContentSegue.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | open class AMContentSegue: UIStoryboardSegue {
30 | override open func perform() {
31 | var mainVC:AMSlideMenuMainViewController?
32 | if let sourceVC = self.source as? AMSlideMenuMainViewController {
33 | mainVC = sourceVC
34 | } else if let sourceVC = self.source.slideMenuMainVC {
35 | mainVC = sourceVC
36 | mainVC?.prepare(for: self, sender: self)
37 | }
38 | guard let slideMenuMainVC = mainVC else { return }
39 |
40 | slideMenuMainVC.children.forEach({$0.removeFromParent()})
41 | slideMenuMainVC.contentView.subviews.filter({$0 != slideMenuMainVC.overlayView}).forEach({$0.removeFromSuperview()})
42 | slideMenuMainVC.children.forEach({$0.didMove(toParent: nil)})
43 |
44 | destination.slideMenuMainVC = slideMenuMainVC
45 | slideMenuMainVC.setContentVC(destination)
46 |
47 | slideMenuMainVC.addChild(destination)
48 | slideMenuMainVC.contentView.addSubview(destination.view)
49 | destination.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
50 | destination.view.frame = slideMenuMainVC.contentView.bounds
51 | destination.didMove(toParent: slideMenuMainVC)
52 |
53 | slideMenuMainVC.contentView.bringSubviewToFront(slideMenuMainVC.overlayView)
54 | if slideMenuMainVC.menuState == .leftOpened {
55 | slideMenuMainVC.hideLeftMenu(animated: UIView.areAnimationsEnabled)
56 | } else if slideMenuMainVC.menuState == .rightOpened {
57 | slideMenuMainVC.hideRightMenu(animated: UIView.areAnimationsEnabled)
58 | }
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/AMSlideMenu/Animation/Animators/AMSlidingGroupAnimator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMSlidingGroupAnimator.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | open class AMSlidingGroupAnimator: AMSlidingAnimatorProtocol {
30 | open var duration: TimeInterval = 0.25
31 |
32 | open var animators: [AMSlidingAnimatorProtocol] = []
33 |
34 | open func addAnimator(_ animator: AMSlidingAnimatorProtocol) {
35 | self.animators.append(animator)
36 | }
37 |
38 | open func addAnimators(_ animators: [AMSlidingAnimatorProtocol]) {
39 | animators.forEach({self.animators.append($0)})
40 | }
41 |
42 | open func animate(leftMenuView: UIView, contentView: UIView, progress: CGFloat, animated: Bool, completion: (() -> Void)?) {
43 | let group = DispatchGroup()
44 |
45 | for animator in animators {
46 | group.enter()
47 | animator.animate(leftMenuView: leftMenuView, contentView: contentView, progress: progress, animated: animated) {
48 | group.leave()
49 | }
50 | }
51 |
52 | group.notify(queue: .main) {
53 | completion?()
54 | }
55 | }
56 |
57 | open func animate(rightMenuView: UIView, contentView: UIView, progress: CGFloat = 1, animated: Bool = true, completion: (() -> Void)? = nil) {
58 | let group = DispatchGroup()
59 |
60 | for animator in animators {
61 | group.enter()
62 | animator.animate(rightMenuView: rightMenuView, contentView: contentView, progress: progress, animated: animated) {
63 | group.leave()
64 | }
65 | }
66 |
67 | group.notify(queue: .main) {
68 | completion?()
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/AMSlideMenu/Animation/Animators/AMSlidingFixedMenuAnimator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMSlidingFixedMenuAnimator.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | open class AMSlidingFixedMenuAnimator: AMSlidingAnimatorProtocol {
30 |
31 | open var duration: TimeInterval = 0.25
32 |
33 | open func animate(leftMenuView: UIView, contentView: UIView, progress: CGFloat, animated: Bool, completion: (() -> Void)?) {
34 | var frame = leftMenuView.frame
35 | let prg = max(0, min(progress, 1))
36 | frame.origin.x = 0
37 |
38 | leftMenuView.superview?.sendSubviewToBack(leftMenuView)
39 | if prg > 0 {
40 | leftMenuView.isHidden = false
41 | }
42 |
43 | leftMenuView.frame = frame
44 | completion?()
45 | if prg == 0 {
46 | DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
47 | frame.origin.x = -frame.width
48 | leftMenuView.frame = frame
49 | leftMenuView.isHidden = true
50 | }
51 | }
52 | }
53 |
54 | open func animate(rightMenuView: UIView, contentView: UIView, progress: CGFloat = 1, animated: Bool = true, completion: (() -> Void)? = nil) {
55 | let contentFrame = contentView.frame
56 | var frame = rightMenuView.frame
57 | let prg = max(0, min(progress, 1))
58 | frame.origin.x = contentFrame.width - frame.size.width
59 |
60 | rightMenuView.superview?.sendSubviewToBack(rightMenuView)
61 | if prg > 0 {
62 | rightMenuView.isHidden = false
63 | }
64 | rightMenuView.frame = frame
65 | completion?()
66 | if prg == 0 {
67 | DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
68 | frame.origin.x = contentFrame.width
69 | rightMenuView.frame = frame
70 | rightMenuView.isHidden = true
71 | }
72 | }
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/AMSlideMenu/Animation/Animators/AMSlidingContentAnimator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMSlidingContentAnimator.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | open class AMSlidingContentAnimator: AMSlidingAnimatorProtocol {
30 |
31 | open var duration: TimeInterval = 0.25
32 |
33 | open func animate(leftMenuView: UIView, contentView: UIView, progress: CGFloat, animated: Bool, completion: (() -> Void)?) {
34 | let leftMenuWidth = leftMenuView.frame.width
35 | var frame = contentView.frame
36 | let prg = max(0, min(progress, 1))
37 | frame.origin.x = leftMenuWidth * prg
38 |
39 | CATransaction.begin()
40 | CATransaction.setCompletionBlock {
41 | completion?()
42 | }
43 | CATransaction.setAnimationDuration(CFTimeInterval(duration))
44 | CATransaction.setAnimationTimingFunction(CAMediaTimingFunction.AM.easeOutCubic)
45 | UIView.animate(withDuration: duration) {
46 | contentView.frame = frame
47 | }
48 |
49 | CATransaction.commit()
50 | }
51 |
52 | open func animate(rightMenuView: UIView, contentView: UIView, progress: CGFloat = 1, animated: Bool = true, completion: (() -> Void)? = nil) {
53 | let rightMenuWidth = rightMenuView.frame.width
54 | var frame = contentView.frame
55 | let prg = max(0, min(progress, 1))
56 | frame.origin.x = -rightMenuWidth * prg
57 |
58 | CATransaction.begin()
59 | CATransaction.setCompletionBlock {
60 | completion?()
61 | }
62 | CATransaction.setAnimationDuration(CFTimeInterval(duration))
63 | CATransaction.setAnimationTimingFunction(CAMediaTimingFunction.AM.easeOutCubic)
64 | UIView.animate(withDuration: duration) {
65 | contentView.frame = frame
66 | }
67 |
68 | CATransaction.commit()
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/AMSlideMenu/Extensions/UIViewController+AMExtension.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+AMExtension.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | fileprivate struct AssociationKeys {
30 | static var slideMenuMainVCKey = "slideMenuMainVCKey"
31 | }
32 |
33 | public extension UIViewController {
34 |
35 | weak var slideMenuMainVC: AMSlideMenuMainViewController? {
36 | get {
37 | let vc = objc_getAssociatedObject(self, &AssociationKeys.slideMenuMainVCKey) as? AMSlideMenuMainViewController
38 | if vc == nil && parent != nil {
39 | return parent?.slideMenuMainVC
40 | }
41 | return vc
42 | }
43 | set {
44 | objc_setAssociatedObject(self, &AssociationKeys.slideMenuMainVCKey, newValue, .OBJC_ASSOCIATION_ASSIGN)
45 | }
46 | }
47 |
48 | @objc func showLeftMenu(animated: Bool = true, completion handler: (()->Void)? = nil) {
49 | guard !(self is AMSlideMenuMainViewController) else { return }
50 | slideMenuMainVC?.showLeftMenu(animated: animated, completion: handler)
51 | }
52 |
53 | @objc func hideLeftMenu(animated: Bool = true, completion handler: (()->Void)? = nil) {
54 | guard !(self is AMSlideMenuMainViewController) else { return }
55 | slideMenuMainVC?.hideLeftMenu(animated: animated, completion: handler)
56 | }
57 |
58 | @objc func showRightMenu(animated: Bool = true, completion handler: (()->Void)? = nil) {
59 | guard !(self is AMSlideMenuMainViewController) else { return }
60 | slideMenuMainVC?.showRightMenu(animated: animated, completion: handler)
61 | }
62 |
63 | @objc func hideRightMenu(animated: Bool = true, completion handler: (()->Void)? = nil) {
64 | guard !(self is AMSlideMenuMainViewController) else { return }
65 | slideMenuMainVC?.hideRightMenu(animated: animated, completion: handler)
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/AMSlideMenu/Animation/Animators/AMSlidingStandardAnimator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AMSlidingStandardAnimator.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | open class AMSlidingStandardAnimator: AMSlidingAnimatorProtocol {
30 |
31 | open var duration: TimeInterval = 0.25
32 |
33 | open func animate(leftMenuView: UIView, contentView: UIView, progress: CGFloat, animated: Bool, completion: (() -> Void)?) {
34 |
35 | var frame = leftMenuView.frame
36 | let prg = max(0, min(progress, 1))
37 | frame.origin.x = frame.size.width * (prg - 1)
38 |
39 | if prg > 0 {
40 | leftMenuView.isHidden = false
41 | }
42 |
43 | CATransaction.begin()
44 | CATransaction.setCompletionBlock {
45 | completion?()
46 | if prg == 0 {
47 | leftMenuView.isHidden = true
48 | }
49 | }
50 | CATransaction.setAnimationDuration(CFTimeInterval(duration))
51 | CATransaction.setAnimationTimingFunction(CAMediaTimingFunction.AM.easeOutCubic)
52 | UIView.animate(withDuration: duration) {
53 | leftMenuView.frame = frame
54 | }
55 |
56 | CATransaction.commit()
57 | }
58 |
59 | open func animate(rightMenuView: UIView, contentView: UIView, progress: CGFloat = 1, animated: Bool = true, completion: (() -> Void)? = nil) {
60 | let contentFrame = contentView.frame
61 | var frame = rightMenuView.frame
62 | let prg = max(0, min(progress, 1))
63 | frame.origin.x = contentFrame.width - frame.size.width * prg
64 |
65 | if prg > 0 {
66 | rightMenuView.isHidden = false
67 | }
68 |
69 | CATransaction.begin()
70 | CATransaction.setCompletionBlock {
71 | completion?()
72 | if prg == 0 {
73 | rightMenuView.isHidden = true
74 | }
75 | }
76 | CATransaction.setAnimationDuration(CFTimeInterval(duration))
77 | CATransaction.setAnimationTimingFunction(CAMediaTimingFunction.AM.easeOutCubic)
78 | UIView.animate(withDuration: duration) {
79 | rightMenuView.frame = frame
80 | }
81 |
82 | CATransaction.commit()
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/AMSlideMenu/Animation/CAMediaTimingFunction+AMExtension.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CAMediaTimingFunction+Extension.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | public extension CAMediaTimingFunction {
30 | enum AM {
31 | // default
32 | static let `default` = CAMediaTimingFunction(name: .default)
33 | static let linear = CAMediaTimingFunction(name: .linear)
34 | static let easeIn = CAMediaTimingFunction(name: .easeIn)
35 | static let easeOut = CAMediaTimingFunction(name: .easeOut)
36 | static let easeInEaseOut = CAMediaTimingFunction(name: .easeInEaseOut)
37 |
38 | // custom
39 | static let easeInSine = CAMediaTimingFunction(controlPoints: 0.47, 0, 0.745, 0.715)
40 | static let easeOutSine = CAMediaTimingFunction(controlPoints: 0.39, 0.575, 0.565, 1)
41 | static let easeInOutSine = CAMediaTimingFunction(controlPoints: 0.445, 0.05, 0.55, 0.95)
42 | static let easeInQuad = CAMediaTimingFunction(controlPoints: 0.55, 0.085, 0.68, 0.53)
43 | static let easeOutQuad = CAMediaTimingFunction(controlPoints: 0.25, 0.46, 0.45, 0.94)
44 | static let easeInOutQuad = CAMediaTimingFunction(controlPoints: 0.455, 0.03, 0.515, 0.955)
45 | static let easeInCubic = CAMediaTimingFunction(controlPoints: 0.55, 0.055, 0.675, 0.19)
46 | static let easeOutCubic = CAMediaTimingFunction(controlPoints: 0.215, 0.61, 0.355, 1)
47 | static let easeInOutCubic = CAMediaTimingFunction(controlPoints: 0.645, 0.045, 0.355, 1)
48 | static let easeInQuart = CAMediaTimingFunction(controlPoints: 0.895, 0.03, 0.685, 0.22)
49 | static let easeOutQuart = CAMediaTimingFunction(controlPoints: 0.165, 0.84, 0.44, 1)
50 | static let easeInOutQuart = CAMediaTimingFunction(controlPoints: 0.77, 0, 0.175, 1)
51 | static let easeInQuint = CAMediaTimingFunction(controlPoints: 0.755, 0.05, 0.855, 0.06)
52 | static let easeOutQuint = CAMediaTimingFunction(controlPoints: 0.23, 1, 0.32, 1)
53 | static let easeInOutQuint = CAMediaTimingFunction(controlPoints: 0.86, 0, 0.07, 1)
54 | static let easeInExpo = CAMediaTimingFunction(controlPoints: 0.95, 0.05, 0.795, 0.035)
55 | static let easeOutExpo = CAMediaTimingFunction(controlPoints: 0.19, 1, 0.22, 1)
56 | static let easeInOutExpo = CAMediaTimingFunction(controlPoints: 1, 0, 0, 1)
57 | static let easeInCirc = CAMediaTimingFunction(controlPoints: 0.6, 0.04, 0.98, 0.335)
58 | static let easeOutCirc = CAMediaTimingFunction(controlPoints: 0.075, 0.82, 0.165, 1)
59 | static let easeInOutCirc = CAMediaTimingFunction(controlPoints: 0.785, 0.135, 0.15, 0.86)
60 | static let easeInBack = CAMediaTimingFunction(controlPoints: 0.6, -0.28, 0.735, 0.045)
61 | static let easeOutBack = CAMediaTimingFunction(controlPoints: 0.175, 0.885, 0.32, 1.275)
62 | static let easeInOutBack = CAMediaTimingFunction(controlPoints: 0.68, -0.55, 0.265, 1.55)
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/AMSlideMenu/CustomVisualEffectView/BlurryOverlayView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BlurryOverlayView.swift
3 | // AMSlideMenu
4 | //
5 | // The MIT License (MIT)
6 | //
7 | // Created by : arturdev
8 | // Copyright (c) 2020 arturdev. All rights reserved.
9 | //
10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 | // this software and associated documentation files (the "Software"), to deal in
12 | // the Software without restriction, including without limitation the rights to
13 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 | // the Software, and to permit persons to whom the Software is furnished to do so,
15 | // subject to the following conditions:
16 | //
17 | // The above copyright notice and this permission notice shall be included in all
18 | // copies or substantial portions of the Software.
19 | //
20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
26 |
27 | import UIKit
28 |
29 | class BlurryOverlayView: UIVisualEffectView {
30 | private var animator: UIViewPropertyAnimator!
31 | private var delta: CGFloat = 0 // The amount to change fractionComplete for each tick
32 | private var target: CGFloat = 0 // The fractionComplete we're animating to
33 | private var displayLink: CADisplayLink!
34 | private var isBluringUp = false
35 |
36 | override init(effect: UIVisualEffect?) {
37 | super.init(effect: effect)
38 | prepare()
39 | }
40 |
41 | required init?(coder aDecoder: NSCoder) {
42 | super.init(coder: aDecoder)
43 | prepare()
44 | }
45 |
46 | // Common init
47 |
48 | private func prepare() {
49 | effect = nil // Starts out with no blur
50 | isHidden = true // Enables user interaction through the view
51 |
52 | // The animation to add an effect
53 | animator = UIViewPropertyAnimator(duration: 1, curve: .easeInOut) {
54 | self.effect = UIBlurEffect(style: .light)
55 | }
56 | if #available(iOS 11.0, *) {
57 | animator.pausesOnCompletion = true // Fixes background bug
58 | }
59 |
60 | // Using a display link to animate animator.fractionComplete
61 | displayLink = CADisplayLink(target: self, selector: #selector(tick))
62 | displayLink.isPaused = true
63 | displayLink.add(to: .main, forMode: RunLoop.Mode.common)
64 | }
65 |
66 | func blur(amount: CGFloat = 0.2, duration: TimeInterval = 0.3) {
67 | isHidden = false // Disable user interaction
68 |
69 | if target == amount { //already blured
70 | return
71 | }
72 |
73 | isBluringUp = amount > target
74 |
75 | if duration == 0 {
76 | delta = (amount - target)
77 | } else {
78 | delta = (amount - target) / (60 * CGFloat(duration)) // Assuming 60hz refresh rate
79 | }
80 | target = amount
81 |
82 | // Start animating fractionComplete
83 | displayLink.isPaused = false
84 | }
85 |
86 | @objc private func tick() {
87 | animator.fractionComplete += delta
88 |
89 | if animator.fractionComplete <= 0 {
90 | // Done blurring out
91 | isHidden = true
92 | displayLink.isPaused = true
93 | } else if animator.fractionComplete >= 1 {
94 | // Done blurring in
95 | displayLink.isPaused = true
96 | } else {
97 | if isBluringUp {
98 | if animator.fractionComplete >= target {
99 | // Done blurring in
100 | displayLink.isPaused = true
101 | }
102 | } else {
103 | if animator.fractionComplete <= target {
104 | // Done blurring out
105 | displayLink.isPaused = true
106 | }
107 | }
108 | }
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-frameworks.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 | set -u
4 | set -o pipefail
5 |
6 | function on_error {
7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
8 | }
9 | trap 'on_error $LINENO' ERR
10 |
11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then
12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy
13 | # frameworks to, so exit 0 (signalling the script phase was successful).
14 | exit 0
15 | fi
16 |
17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
19 |
20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
22 |
23 | # Used as a return value for each invocation of `strip_invalid_archs` function.
24 | STRIP_BINARY_RETVAL=0
25 |
26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution
27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
29 |
30 | # Copies and strips a vendored framework
31 | install_framework()
32 | {
33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
34 | local source="${BUILT_PRODUCTS_DIR}/$1"
35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
37 | elif [ -r "$1" ]; then
38 | local source="$1"
39 | fi
40 |
41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
42 |
43 | if [ -L "${source}" ]; then
44 | echo "Symlinked..."
45 | source="$(readlink "${source}")"
46 | fi
47 |
48 | # Use filter instead of exclude so missing patterns don't throw errors.
49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
51 |
52 | local basename
53 | basename="$(basename -s .framework "$1")"
54 | binary="${destination}/${basename}.framework/${basename}"
55 |
56 | if ! [ -r "$binary" ]; then
57 | binary="${destination}/${basename}"
58 | elif [ -L "${binary}" ]; then
59 | echo "Destination binary is symlinked..."
60 | dirname="$(dirname "${binary}")"
61 | binary="${dirname}/$(readlink "${binary}")"
62 | fi
63 |
64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device
65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
66 | strip_invalid_archs "$binary"
67 | fi
68 |
69 | # Resign the code if required by the build settings to avoid unstable apps
70 | code_sign_if_enabled "${destination}/$(basename "$1")"
71 |
72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
74 | local swift_runtime_libs
75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u)
76 | for lib in $swift_runtime_libs; do
77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
79 | code_sign_if_enabled "${destination}/${lib}"
80 | done
81 | fi
82 | }
83 |
84 | # Copies and strips a vendored dSYM
85 | install_dsym() {
86 | local source="$1"
87 | warn_missing_arch=${2:-true}
88 | if [ -r "$source" ]; then
89 | # Copy the dSYM into the targets temp dir.
90 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\""
91 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}"
92 |
93 | local basename
94 | basename="$(basename -s .dSYM "$source")"
95 | binary_name="$(ls "$source/Contents/Resources/DWARF")"
96 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}"
97 |
98 | # Strip invalid architectures so "fat" simulator / device frameworks work on device
99 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then
100 | strip_invalid_archs "$binary" "$warn_missing_arch"
101 | fi
102 |
103 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then
104 | # Move the stripped file into its final destination.
105 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\""
106 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
107 | else
108 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.
109 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM"
110 | fi
111 | fi
112 | }
113 |
114 | # Copies the bcsymbolmap files of a vendored framework
115 | install_bcsymbolmap() {
116 | local bcsymbolmap_path="$1"
117 | local destination="${BUILT_PRODUCTS_DIR}"
118 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}""
119 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"
120 | }
121 |
122 | # Signs a framework with the provided identity
123 | code_sign_if_enabled() {
124 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
125 | # Use the current code_sign_identity
126 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
127 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'"
128 |
129 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
130 | code_sign_cmd="$code_sign_cmd &"
131 | fi
132 | echo "$code_sign_cmd"
133 | eval "$code_sign_cmd"
134 | fi
135 | }
136 |
137 | # Strip invalid architectures
138 | strip_invalid_archs() {
139 | binary="$1"
140 | warn_missing_arch=${2:-true}
141 | # Get architectures for current target binary
142 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
143 | # Intersect them with the architectures we are building for
144 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)"
145 | # If there are no archs supported by this binary then warn the user
146 | if [[ -z "$intersected_archs" ]]; then
147 | if [[ "$warn_missing_arch" == "true" ]]; then
148 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
149 | fi
150 | STRIP_BINARY_RETVAL=0
151 | return
152 | fi
153 | stripped=""
154 | for arch in $binary_archs; do
155 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then
156 | # Strip non-valid architectures in-place
157 | lipo -remove "$arch" -output "$binary" "$binary"
158 | stripped="$stripped $arch"
159 | fi
160 | done
161 | if [[ "$stripped" ]]; then
162 | echo "Stripped $binary of architectures:$stripped"
163 | fi
164 | STRIP_BINARY_RETVAL=1
165 | }
166 |
167 | install_artifact() {
168 | artifact="$1"
169 | base="$(basename "$artifact")"
170 | case $base in
171 | *.framework)
172 | install_framework "$artifact"
173 | ;;
174 | *.dSYM)
175 | # Suppress arch warnings since XCFrameworks will include many dSYM files
176 | install_dsym "$artifact" "false"
177 | ;;
178 | *.bcsymbolmap)
179 | install_bcsymbolmap "$artifact"
180 | ;;
181 | *)
182 | echo "error: Unrecognized artifact "$artifact""
183 | ;;
184 | esac
185 | }
186 |
187 | copy_artifacts() {
188 | file_list="$1"
189 | while read artifact; do
190 | install_artifact "$artifact"
191 | done <$file_list
192 | }
193 |
194 | ARTIFACT_LIST_FILE="${BUILT_PRODUCTS_DIR}/cocoapods-artifacts-${CONFIGURATION}.txt"
195 | if [ -r "${ARTIFACT_LIST_FILE}" ]; then
196 | copy_artifacts "${ARTIFACT_LIST_FILE}"
197 | fi
198 |
199 | if [[ "$CONFIGURATION" == "Debug" ]]; then
200 | install_framework "${BUILT_PRODUCTS_DIR}/AMSlideMenu/AMSlideMenu.framework"
201 | fi
202 | if [[ "$CONFIGURATION" == "Release" ]]; then
203 | install_framework "${BUILT_PRODUCTS_DIR}/AMSlideMenu/AMSlideMenu.framework"
204 | fi
205 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
206 | wait
207 | fi
208 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/AMSlideMenuExample.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 51;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 7520B3292471BAF50096B26A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7520B3282471BAF50096B26A /* AppDelegate.swift */; };
11 | 7520B32B2471BAF50096B26A /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7520B32A2471BAF50096B26A /* SceneDelegate.swift */; };
12 | 7520B32D2471BAF50096B26A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7520B32C2471BAF50096B26A /* ViewController.swift */; };
13 | 7520B3302471BAF50096B26A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7520B32E2471BAF50096B26A /* Main.storyboard */; };
14 | 7520B3322471BAF70096B26A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7520B3312471BAF70096B26A /* Assets.xcassets */; };
15 | 7520B3352471BAF70096B26A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7520B3332471BAF70096B26A /* LaunchScreen.storyboard */; };
16 | 757DBE0F2474746A00F5D2B2 /* MainContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757DBE0E2474746A00F5D2B2 /* MainContainerViewController.swift */; };
17 | 757DBE112474750800F5D2B2 /* MenuChooserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757DBE102474750800F5D2B2 /* MenuChooserViewController.swift */; };
18 | E7F7F5840B75C4231B51D2D5 /* Pods_AMSlideMenuExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CAD0DC6D742A7715425986D2 /* Pods_AMSlideMenuExample.framework */; };
19 | /* End PBXBuildFile section */
20 |
21 | /* Begin PBXFileReference section */
22 | 36574E0ACB44A0D0B52ED66C /* Pods-AMSlideMenuExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AMSlideMenuExample.debug.xcconfig"; path = "Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample.debug.xcconfig"; sourceTree = ""; };
23 | 7520B3252471BAF50096B26A /* AMSlideMenuExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AMSlideMenuExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
24 | 7520B3282471BAF50096B26A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
25 | 7520B32A2471BAF50096B26A /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
26 | 7520B32C2471BAF50096B26A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
27 | 7520B32F2471BAF50096B26A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
28 | 7520B3312471BAF70096B26A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
29 | 7520B3342471BAF70096B26A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
30 | 7520B3362471BAF70096B26A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
31 | 757DBE0E2474746A00F5D2B2 /* MainContainerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainContainerViewController.swift; sourceTree = ""; };
32 | 757DBE102474750800F5D2B2 /* MenuChooserViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuChooserViewController.swift; sourceTree = ""; };
33 | 86E97BFC3B34AA8F0C4AC93B /* Pods-AMSlideMenuExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AMSlideMenuExample.release.xcconfig"; path = "Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample.release.xcconfig"; sourceTree = ""; };
34 | CAD0DC6D742A7715425986D2 /* Pods_AMSlideMenuExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AMSlideMenuExample.framework; sourceTree = BUILT_PRODUCTS_DIR; };
35 | /* End PBXFileReference section */
36 |
37 | /* Begin PBXFrameworksBuildPhase section */
38 | 7520B3222471BAF50096B26A /* Frameworks */ = {
39 | isa = PBXFrameworksBuildPhase;
40 | buildActionMask = 2147483647;
41 | files = (
42 | E7F7F5840B75C4231B51D2D5 /* Pods_AMSlideMenuExample.framework in Frameworks */,
43 | );
44 | runOnlyForDeploymentPostprocessing = 0;
45 | };
46 | /* End PBXFrameworksBuildPhase section */
47 |
48 | /* Begin PBXGroup section */
49 | 1B497F45527A90CA8027D9A8 /* Pods */ = {
50 | isa = PBXGroup;
51 | children = (
52 | 36574E0ACB44A0D0B52ED66C /* Pods-AMSlideMenuExample.debug.xcconfig */,
53 | 86E97BFC3B34AA8F0C4AC93B /* Pods-AMSlideMenuExample.release.xcconfig */,
54 | );
55 | path = Pods;
56 | sourceTree = "";
57 | };
58 | 3934FBE4DB132394503362A1 /* Frameworks */ = {
59 | isa = PBXGroup;
60 | children = (
61 | CAD0DC6D742A7715425986D2 /* Pods_AMSlideMenuExample.framework */,
62 | );
63 | name = Frameworks;
64 | sourceTree = "";
65 | };
66 | 7520B31C2471BAF50096B26A = {
67 | isa = PBXGroup;
68 | children = (
69 | 7520B3272471BAF50096B26A /* AMSlideMenuExample */,
70 | 7520B3262471BAF50096B26A /* Products */,
71 | 1B497F45527A90CA8027D9A8 /* Pods */,
72 | 3934FBE4DB132394503362A1 /* Frameworks */,
73 | );
74 | sourceTree = "";
75 | };
76 | 7520B3262471BAF50096B26A /* Products */ = {
77 | isa = PBXGroup;
78 | children = (
79 | 7520B3252471BAF50096B26A /* AMSlideMenuExample.app */,
80 | );
81 | name = Products;
82 | sourceTree = "";
83 | };
84 | 7520B3272471BAF50096B26A /* AMSlideMenuExample */ = {
85 | isa = PBXGroup;
86 | children = (
87 | 7520B3282471BAF50096B26A /* AppDelegate.swift */,
88 | 7520B32A2471BAF50096B26A /* SceneDelegate.swift */,
89 | 7520B32C2471BAF50096B26A /* ViewController.swift */,
90 | 7520B32E2471BAF50096B26A /* Main.storyboard */,
91 | 7520B3312471BAF70096B26A /* Assets.xcassets */,
92 | 7520B3332471BAF70096B26A /* LaunchScreen.storyboard */,
93 | 7520B3362471BAF70096B26A /* Info.plist */,
94 | 757DBE0E2474746A00F5D2B2 /* MainContainerViewController.swift */,
95 | 757DBE102474750800F5D2B2 /* MenuChooserViewController.swift */,
96 | );
97 | path = AMSlideMenuExample;
98 | sourceTree = "";
99 | };
100 | /* End PBXGroup section */
101 |
102 | /* Begin PBXNativeTarget section */
103 | 7520B3242471BAF50096B26A /* AMSlideMenuExample */ = {
104 | isa = PBXNativeTarget;
105 | buildConfigurationList = 7520B3392471BAF70096B26A /* Build configuration list for PBXNativeTarget "AMSlideMenuExample" */;
106 | buildPhases = (
107 | 4933503DDDB00D6171694CE7 /* [CP] Check Pods Manifest.lock */,
108 | 7520B3212471BAF50096B26A /* Sources */,
109 | 7520B3222471BAF50096B26A /* Frameworks */,
110 | 7520B3232471BAF50096B26A /* Resources */,
111 | EF2BD2DA74839FBA6D893787 /* [CP] Embed Pods Frameworks */,
112 | );
113 | buildRules = (
114 | );
115 | dependencies = (
116 | );
117 | name = AMSlideMenuExample;
118 | productName = AMSlideMenuExample;
119 | productReference = 7520B3252471BAF50096B26A /* AMSlideMenuExample.app */;
120 | productType = "com.apple.product-type.application";
121 | };
122 | /* End PBXNativeTarget section */
123 |
124 | /* Begin PBXProject section */
125 | 7520B31D2471BAF50096B26A /* Project object */ = {
126 | isa = PBXProject;
127 | attributes = {
128 | LastSwiftUpdateCheck = 1140;
129 | LastUpgradeCheck = 1140;
130 | ORGANIZATIONNAME = "Artur Mkrtchyan";
131 | TargetAttributes = {
132 | 7520B3242471BAF50096B26A = {
133 | CreatedOnToolsVersion = 11.4.1;
134 | };
135 | };
136 | };
137 | buildConfigurationList = 7520B3202471BAF50096B26A /* Build configuration list for PBXProject "AMSlideMenuExample" */;
138 | compatibilityVersion = "Xcode 9.3";
139 | developmentRegion = en;
140 | hasScannedForEncodings = 0;
141 | knownRegions = (
142 | en,
143 | Base,
144 | );
145 | mainGroup = 7520B31C2471BAF50096B26A;
146 | productRefGroup = 7520B3262471BAF50096B26A /* Products */;
147 | projectDirPath = "";
148 | projectRoot = "";
149 | targets = (
150 | 7520B3242471BAF50096B26A /* AMSlideMenuExample */,
151 | );
152 | };
153 | /* End PBXProject section */
154 |
155 | /* Begin PBXResourcesBuildPhase section */
156 | 7520B3232471BAF50096B26A /* Resources */ = {
157 | isa = PBXResourcesBuildPhase;
158 | buildActionMask = 2147483647;
159 | files = (
160 | 7520B3352471BAF70096B26A /* LaunchScreen.storyboard in Resources */,
161 | 7520B3322471BAF70096B26A /* Assets.xcassets in Resources */,
162 | 7520B3302471BAF50096B26A /* Main.storyboard in Resources */,
163 | );
164 | runOnlyForDeploymentPostprocessing = 0;
165 | };
166 | /* End PBXResourcesBuildPhase section */
167 |
168 | /* Begin PBXShellScriptBuildPhase section */
169 | 4933503DDDB00D6171694CE7 /* [CP] Check Pods Manifest.lock */ = {
170 | isa = PBXShellScriptBuildPhase;
171 | buildActionMask = 2147483647;
172 | files = (
173 | );
174 | inputFileListPaths = (
175 | );
176 | inputPaths = (
177 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
178 | "${PODS_ROOT}/Manifest.lock",
179 | );
180 | name = "[CP] Check Pods Manifest.lock";
181 | outputFileListPaths = (
182 | );
183 | outputPaths = (
184 | "$(DERIVED_FILE_DIR)/Pods-AMSlideMenuExample-checkManifestLockResult.txt",
185 | );
186 | runOnlyForDeploymentPostprocessing = 0;
187 | shellPath = /bin/sh;
188 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
189 | showEnvVarsInLog = 0;
190 | };
191 | EF2BD2DA74839FBA6D893787 /* [CP] Embed Pods Frameworks */ = {
192 | isa = PBXShellScriptBuildPhase;
193 | buildActionMask = 2147483647;
194 | files = (
195 | );
196 | inputFileListPaths = (
197 | "${PODS_ROOT}/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-frameworks-${CONFIGURATION}-input-files.xcfilelist",
198 | );
199 | name = "[CP] Embed Pods Frameworks";
200 | outputFileListPaths = (
201 | "${PODS_ROOT}/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-frameworks-${CONFIGURATION}-output-files.xcfilelist",
202 | );
203 | runOnlyForDeploymentPostprocessing = 0;
204 | shellPath = /bin/sh;
205 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-frameworks.sh\"\n";
206 | showEnvVarsInLog = 0;
207 | };
208 | /* End PBXShellScriptBuildPhase section */
209 |
210 | /* Begin PBXSourcesBuildPhase section */
211 | 7520B3212471BAF50096B26A /* Sources */ = {
212 | isa = PBXSourcesBuildPhase;
213 | buildActionMask = 2147483647;
214 | files = (
215 | 7520B32D2471BAF50096B26A /* ViewController.swift in Sources */,
216 | 757DBE0F2474746A00F5D2B2 /* MainContainerViewController.swift in Sources */,
217 | 757DBE112474750800F5D2B2 /* MenuChooserViewController.swift in Sources */,
218 | 7520B3292471BAF50096B26A /* AppDelegate.swift in Sources */,
219 | 7520B32B2471BAF50096B26A /* SceneDelegate.swift in Sources */,
220 | );
221 | runOnlyForDeploymentPostprocessing = 0;
222 | };
223 | /* End PBXSourcesBuildPhase section */
224 |
225 | /* Begin PBXVariantGroup section */
226 | 7520B32E2471BAF50096B26A /* Main.storyboard */ = {
227 | isa = PBXVariantGroup;
228 | children = (
229 | 7520B32F2471BAF50096B26A /* Base */,
230 | );
231 | name = Main.storyboard;
232 | sourceTree = "";
233 | };
234 | 7520B3332471BAF70096B26A /* LaunchScreen.storyboard */ = {
235 | isa = PBXVariantGroup;
236 | children = (
237 | 7520B3342471BAF70096B26A /* Base */,
238 | );
239 | name = LaunchScreen.storyboard;
240 | sourceTree = "";
241 | };
242 | /* End PBXVariantGroup section */
243 |
244 | /* Begin XCBuildConfiguration section */
245 | 7520B3372471BAF70096B26A /* Debug */ = {
246 | isa = XCBuildConfiguration;
247 | buildSettings = {
248 | ALWAYS_SEARCH_USER_PATHS = NO;
249 | CLANG_ANALYZER_NONNULL = YES;
250 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
251 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
252 | CLANG_CXX_LIBRARY = "libc++";
253 | CLANG_ENABLE_MODULES = YES;
254 | CLANG_ENABLE_OBJC_ARC = YES;
255 | CLANG_ENABLE_OBJC_WEAK = YES;
256 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
257 | CLANG_WARN_BOOL_CONVERSION = YES;
258 | CLANG_WARN_COMMA = YES;
259 | CLANG_WARN_CONSTANT_CONVERSION = YES;
260 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
261 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
262 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
263 | CLANG_WARN_EMPTY_BODY = YES;
264 | CLANG_WARN_ENUM_CONVERSION = YES;
265 | CLANG_WARN_INFINITE_RECURSION = YES;
266 | CLANG_WARN_INT_CONVERSION = YES;
267 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
268 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
269 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
270 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
271 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
272 | CLANG_WARN_STRICT_PROTOTYPES = YES;
273 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
274 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
275 | CLANG_WARN_UNREACHABLE_CODE = YES;
276 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
277 | COPY_PHASE_STRIP = NO;
278 | DEBUG_INFORMATION_FORMAT = dwarf;
279 | ENABLE_STRICT_OBJC_MSGSEND = YES;
280 | ENABLE_TESTABILITY = YES;
281 | GCC_C_LANGUAGE_STANDARD = gnu11;
282 | GCC_DYNAMIC_NO_PIC = NO;
283 | GCC_NO_COMMON_BLOCKS = YES;
284 | GCC_OPTIMIZATION_LEVEL = 0;
285 | GCC_PREPROCESSOR_DEFINITIONS = (
286 | "DEBUG=1",
287 | "$(inherited)",
288 | );
289 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
290 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
291 | GCC_WARN_UNDECLARED_SELECTOR = YES;
292 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
293 | GCC_WARN_UNUSED_FUNCTION = YES;
294 | GCC_WARN_UNUSED_VARIABLE = YES;
295 | IPHONEOS_DEPLOYMENT_TARGET = 13.4;
296 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
297 | MTL_FAST_MATH = YES;
298 | ONLY_ACTIVE_ARCH = YES;
299 | SDKROOT = iphoneos;
300 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
301 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
302 | };
303 | name = Debug;
304 | };
305 | 7520B3382471BAF70096B26A /* Release */ = {
306 | isa = XCBuildConfiguration;
307 | buildSettings = {
308 | ALWAYS_SEARCH_USER_PATHS = NO;
309 | CLANG_ANALYZER_NONNULL = YES;
310 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
311 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
312 | CLANG_CXX_LIBRARY = "libc++";
313 | CLANG_ENABLE_MODULES = YES;
314 | CLANG_ENABLE_OBJC_ARC = YES;
315 | CLANG_ENABLE_OBJC_WEAK = YES;
316 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
317 | CLANG_WARN_BOOL_CONVERSION = YES;
318 | CLANG_WARN_COMMA = YES;
319 | CLANG_WARN_CONSTANT_CONVERSION = YES;
320 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
321 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
322 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
323 | CLANG_WARN_EMPTY_BODY = YES;
324 | CLANG_WARN_ENUM_CONVERSION = YES;
325 | CLANG_WARN_INFINITE_RECURSION = YES;
326 | CLANG_WARN_INT_CONVERSION = YES;
327 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
328 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
329 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
330 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
331 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
332 | CLANG_WARN_STRICT_PROTOTYPES = YES;
333 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
334 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
335 | CLANG_WARN_UNREACHABLE_CODE = YES;
336 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
337 | COPY_PHASE_STRIP = NO;
338 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
339 | ENABLE_NS_ASSERTIONS = NO;
340 | ENABLE_STRICT_OBJC_MSGSEND = YES;
341 | GCC_C_LANGUAGE_STANDARD = gnu11;
342 | GCC_NO_COMMON_BLOCKS = YES;
343 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
344 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
345 | GCC_WARN_UNDECLARED_SELECTOR = YES;
346 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
347 | GCC_WARN_UNUSED_FUNCTION = YES;
348 | GCC_WARN_UNUSED_VARIABLE = YES;
349 | IPHONEOS_DEPLOYMENT_TARGET = 13.4;
350 | MTL_ENABLE_DEBUG_INFO = NO;
351 | MTL_FAST_MATH = YES;
352 | SDKROOT = iphoneos;
353 | SWIFT_COMPILATION_MODE = wholemodule;
354 | SWIFT_OPTIMIZATION_LEVEL = "-O";
355 | VALIDATE_PRODUCT = YES;
356 | };
357 | name = Release;
358 | };
359 | 7520B33A2471BAF70096B26A /* Debug */ = {
360 | isa = XCBuildConfiguration;
361 | baseConfigurationReference = 36574E0ACB44A0D0B52ED66C /* Pods-AMSlideMenuExample.debug.xcconfig */;
362 | buildSettings = {
363 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
364 | CODE_SIGN_STYLE = Automatic;
365 | DEVELOPMENT_TEAM = U8CSJE9SQ2;
366 | INFOPLIST_FILE = AMSlideMenuExample/Info.plist;
367 | IPHONEOS_DEPLOYMENT_TARGET = 13.4;
368 | LD_RUNPATH_SEARCH_PATHS = (
369 | "$(inherited)",
370 | "@executable_path/Frameworks",
371 | );
372 | PRODUCT_BUNDLE_IDENTIFIER = com.arturdev.AMSlideMenuExample;
373 | PRODUCT_NAME = "$(TARGET_NAME)";
374 | SWIFT_VERSION = 5.0;
375 | TARGETED_DEVICE_FAMILY = "1,2";
376 | };
377 | name = Debug;
378 | };
379 | 7520B33B2471BAF70096B26A /* Release */ = {
380 | isa = XCBuildConfiguration;
381 | baseConfigurationReference = 86E97BFC3B34AA8F0C4AC93B /* Pods-AMSlideMenuExample.release.xcconfig */;
382 | buildSettings = {
383 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
384 | CODE_SIGN_STYLE = Automatic;
385 | DEVELOPMENT_TEAM = U8CSJE9SQ2;
386 | INFOPLIST_FILE = AMSlideMenuExample/Info.plist;
387 | IPHONEOS_DEPLOYMENT_TARGET = 13.4;
388 | LD_RUNPATH_SEARCH_PATHS = (
389 | "$(inherited)",
390 | "@executable_path/Frameworks",
391 | );
392 | PRODUCT_BUNDLE_IDENTIFIER = com.arturdev.AMSlideMenuExample;
393 | PRODUCT_NAME = "$(TARGET_NAME)";
394 | SWIFT_VERSION = 5.0;
395 | TARGETED_DEVICE_FAMILY = "1,2";
396 | };
397 | name = Release;
398 | };
399 | /* End XCBuildConfiguration section */
400 |
401 | /* Begin XCConfigurationList section */
402 | 7520B3202471BAF50096B26A /* Build configuration list for PBXProject "AMSlideMenuExample" */ = {
403 | isa = XCConfigurationList;
404 | buildConfigurations = (
405 | 7520B3372471BAF70096B26A /* Debug */,
406 | 7520B3382471BAF70096B26A /* Release */,
407 | );
408 | defaultConfigurationIsVisible = 0;
409 | defaultConfigurationName = Release;
410 | };
411 | 7520B3392471BAF70096B26A /* Build configuration list for PBXNativeTarget "AMSlideMenuExample" */ = {
412 | isa = XCConfigurationList;
413 | buildConfigurations = (
414 | 7520B33A2471BAF70096B26A /* Debug */,
415 | 7520B33B2471BAF70096B26A /* Release */,
416 | );
417 | defaultConfigurationIsVisible = 0;
418 | defaultConfigurationName = Release;
419 | };
420 | /* End XCConfigurationList section */
421 | };
422 | rootObject = 7520B31D2471BAF50096B26A /* Project object */;
423 | }
424 |
--------------------------------------------------------------------------------
/AMSlideMenu/AMSlideMenuMainViewController.swift:
--------------------------------------------------------------------------------
1 |
2 | //
3 | // AMSlideMenuMainViewController.swift
4 | // AMSlideMenu
5 | //
6 | // The MIT License (MIT)
7 | //
8 | // Created by : arturdev
9 | // Copyright (c) 2020 arturdev. All rights reserved.
10 | //
11 | // Permission is hereby granted, free of charge, to any person obtaining a copy of
12 | // this software and associated documentation files (the "Software"), to deal in
13 | // the Software without restriction, including without limitation the rights to
14 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
15 | // the Software, and to permit persons to whom the Software is furnished to do so,
16 | // subject to the following conditions:
17 | //
18 | // The above copyright notice and this permission notice shall be included in all
19 | // copies or substantial portions of the Software.
20 | //
21 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
23 | // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
24 | // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
25 | // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
26 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
27 |
28 | import UIKit
29 |
30 | internal extension UIWindow {
31 | static var keyWindow: UIWindow? {
32 | return UIApplication.shared.windows.filter({$0.isKeyWindow}).first
33 | }
34 |
35 | var width: CGFloat {
36 | #if targetEnvironment(macCatalyst)
37 | return frame.width
38 | #else
39 | let isPortrait = UIDevice.current.orientation.isPortrait || !UIDevice.current.orientation.isValidInterfaceOrientation
40 | return isPortrait ? min(frame.width, frame.height) : max(frame.width, frame.height)
41 | #endif
42 | }
43 |
44 | var height: CGFloat {
45 | #if targetEnvironment(macCatalyst)
46 | return frame.height
47 | #else
48 | let isPortrait = UIDevice.current.orientation.isPortrait || !UIDevice.current.orientation.isValidInterfaceOrientation
49 | return isPortrait ? max(frame.width, frame.height) : min(frame.width, frame.height)
50 | #endif
51 | }
52 | }
53 |
54 | public protocol AMSlideMenuDelegate: class {
55 | func leftMenuWillShow()
56 | func leftMenuDidShow()
57 | func leftMenuWillHide()
58 | func leftMenuDidHide()
59 |
60 | func rightMenuWillShow()
61 | func rightMenuDidShow()
62 | func rightMenuWillHide()
63 | func rightMenuDidHide()
64 | }
65 |
66 | //Making the protocol methods optional
67 | public extension AMSlideMenuDelegate {
68 | func leftMenuWillShow() {}
69 | func leftMenuDidShow() {}
70 | func leftMenuWillHide() {}
71 | func leftMenuDidHide() {}
72 |
73 | func rightMenuWillShow() {}
74 | func rightMenuDidShow() {}
75 | func rightMenuWillHide() {}
76 | func rightMenuDidHide() {}
77 | }
78 |
79 | @IBDesignable
80 | open class AMSlideMenuMainViewController: UIViewController {
81 |
82 | public private(set) var leftMenuVC: UIViewController?
83 | public private(set) var rightMenuVC: UIViewController?
84 | public weak private(set) var contentVC: UIViewController?
85 |
86 | @IBInspectable public var leftMenuSegueName: String?
87 | @IBInspectable public var rightMenuSegueName: String?
88 | @IBInspectable public var contentSegueName: String?
89 |
90 | private var menuWidthDefaultMultiplier: CGFloat {
91 | #if targetEnvironment(macCatalyst)
92 | return 0.201
93 | #else
94 | return 0.801
95 | #endif
96 | }
97 | @IBInspectable open var leftMenuWidth: CGFloat = 0
98 | @IBInspectable open var rightMenuWidth: CGFloat = 0
99 |
100 | open var animationDuration = TimeInterval(0.25)
101 | open var animationOptions: AMSlidingAnimationOptions = [.slidingMenu, .dimmedBackground, .menuShadow, .blurBackground]
102 |
103 | open var leftMenuPanGestureRecognizer: UIPanGestureRecognizer!
104 | open var rightMenuPanGestureRecognizer: UIPanGestureRecognizer!
105 | open var contentPanGestureRecognizer: UIPanGestureRecognizer!
106 | open var contentTapGestureRecognizer: UITapGestureRecognizer!
107 |
108 | open var panGestureWorkingAreaPercent: Float = 50
109 |
110 | open var menuState: MenuState = .closed {
111 | didSet {
112 | overlayView.isUserInteractionEnabled = menuState != .closed
113 | if menuState == .closed {
114 | contentView.addGestureRecognizer(contentPanGestureRecognizer)
115 | } else {
116 | overlayView.addGestureRecognizer(contentPanGestureRecognizer)
117 | }
118 | }
119 | }
120 | open weak var delegate: AMSlideMenuDelegate?
121 |
122 | private var _animator:AMSlidingAnimatorProtocol?
123 | var animator: AMSlidingAnimatorProtocol {
124 | if _animator == nil {
125 | _animator = AMSlidingAnimatorFactory.animator(options: animationOptions, duration: animationDuration)
126 | }
127 | return _animator!
128 | }
129 |
130 | var contentView: UIView = {
131 | let view = UIView()
132 | view.backgroundColor = .clear
133 | view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
134 | return view
135 | }()
136 |
137 | var overlayView: UIView = {
138 | let view = UIView()
139 | view.backgroundColor = .clear
140 | view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
141 | view.isUserInteractionEnabled = false
142 | view.layer.zPosition = CGFloat(Float.greatestFiniteMagnitude)
143 | view.tag = 1000
144 | return view
145 | }()
146 |
147 | override open func viewDidLoad() {
148 | super.viewDidLoad()
149 | setupContent()
150 | NotificationCenter.default.addObserver(self,
151 | selector: #selector(AMSlideMenuMainViewController.handleShowLeftMenuNote),
152 | name: .showLeftMenu,
153 | object: nil)
154 | NotificationCenter.default.addObserver(self,
155 | selector: #selector(AMSlideMenuMainViewController.handleShowRightMenuNote),
156 | name: .showRightMenu,
157 | object: nil)
158 |
159 | DispatchQueue.main.async {
160 | self.leftMenuWidth == 0 ? (self.leftMenuWidth = (UIWindow.keyWindow?.width ?? 0) * self.menuWidthDefaultMultiplier) : nil
161 | self.rightMenuWidth == 0 ? (self.rightMenuWidth = (UIWindow.keyWindow?.width ?? 0) * self.menuWidthDefaultMultiplier) : nil
162 | }
163 | }
164 |
165 | deinit {
166 | NotificationCenter.default.removeObserver(self,
167 | name: .showLeftMenu,
168 | object: nil)
169 | NotificationCenter.default.removeObserver(self,
170 | name: .showRightMenu,
171 | object: nil)
172 | }
173 |
174 | open override func prepareForInterfaceBuilder() {
175 | super.prepareForInterfaceBuilder()
176 | view.backgroundColor = UIColor(red: 0.9, green: 0.9, blue: 0.9, alpha: 1)
177 | let label = UILabel()
178 | label.translatesAutoresizingMaskIntoConstraints = false
179 | label.backgroundColor = .clear
180 | label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
181 | label.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20).isActive = true
182 | label.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20).isActive = true
183 | label.minimumScaleFactor = 0.5
184 | label.textColor = .white
185 | label.text = "AMSlideMenuContainer"
186 | view.addSubview(label)
187 | }
188 |
189 | open override func viewWillAppear(_ animated: Bool) {
190 | super.viewWillAppear(animated)
191 | setupGestures()
192 | }
193 | open override func viewDidAppear(_ animated: Bool) {
194 | super.viewDidAppear(animated)
195 | setupLeftMenu()
196 | setupRightMenu()
197 | addGestures()
198 | }
199 |
200 | open override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
201 | let shouldUpdateLeftMenuWidth = leftMenuWidth == view.bounds.width * menuWidthDefaultMultiplier
202 | let shouldUpdateRightMenuWidth = rightMenuWidth == view.bounds.width * menuWidthDefaultMultiplier
203 | super.viewWillTransition(to: size, with: coordinator)
204 |
205 | let updateBlock = { (_: Any) in
206 | shouldUpdateLeftMenuWidth ? (self.leftMenuWidth = (UIWindow.keyWindow?.width ?? 0) * self.menuWidthDefaultMultiplier) : nil
207 | shouldUpdateRightMenuWidth ? (self.rightMenuWidth = (UIWindow.keyWindow?.width ?? 0) * self.menuWidthDefaultMultiplier) : nil
208 | self.updateLeftMenuFrame()
209 | self.updateRightMenuFrame()
210 | }
211 | coordinator.animate(alongsideTransition: updateBlock, completion: updateBlock)
212 | }
213 |
214 | @objc open override func showLeftMenu(animated: Bool, completion handler: (()->Void)? = nil) {
215 | guard let leftMenuVC = leftMenuVC else { return }
216 | if menuState == .leftOpened {
217 | handler?()
218 | return
219 | }
220 | hideRightMenu(animated: false, completion: nil)
221 | delegate?.leftMenuWillShow()
222 | animator.animate(leftMenuView: leftMenuVC.view, contentView: contentView, progress: 1, animated: animated, completion: {
223 | self.menuState = .leftOpened
224 | self.delegate?.leftMenuDidShow()
225 | handler?()
226 | })
227 | }
228 |
229 | @objc open override func showRightMenu(animated: Bool, completion handler: (()->Void)? = nil) {
230 | guard let rightMenuVC = rightMenuVC else { return }
231 | if menuState == .rightOpened {
232 | handler?()
233 | return
234 | }
235 | hideLeftMenu(animated: false, completion: nil)
236 | delegate?.rightMenuWillShow()
237 | animator.animate(rightMenuView: rightMenuVC.view, contentView: contentView, progress: 1, animated: animated, completion: {
238 | self.menuState = .rightOpened
239 | self.delegate?.rightMenuDidShow()
240 | handler?()
241 | })
242 | }
243 |
244 | @objc open override func hideLeftMenu(animated: Bool, completion handler: (()->Void)? = nil) {
245 | guard let leftMenuVC = leftMenuVC else { return }
246 | if menuState == .closed {
247 | handler?()
248 | return
249 | }
250 | self.delegate?.leftMenuWillHide()
251 | animator.animate(leftMenuView: leftMenuVC.view, contentView: contentView, progress: 0, animated: animated, completion: {
252 | self.menuState = .closed
253 | self.delegate?.leftMenuDidHide()
254 | handler?()
255 | })
256 | }
257 |
258 | @objc open override func hideRightMenu(animated: Bool, completion handler: (()->Void)? = nil) {
259 | guard let rightMenuVC = rightMenuVC else { return }
260 | if menuState == .closed {
261 | handler?()
262 | return
263 | }
264 | self.delegate?.rightMenuWillHide()
265 | animator.animate(rightMenuView: rightMenuVC.view, contentView: contentView, progress: 0, animated: animated, completion: {
266 | self.menuState = .closed
267 | self.delegate?.rightMenuDidHide()
268 | handler?()
269 | })
270 | }
271 |
272 | open func switchContentTo(vc: UIViewController, animated: Bool = true) {
273 | UIView.setAnimationsEnabled(animated)
274 | let segue = AMContentSegue(identifier: "content", source: self, destination: vc)
275 | segue.perform()
276 | UIView.setAnimationsEnabled(true)
277 | }
278 |
279 | //MARK: - Internal
280 | func setLeftMenu(_ leftMenuVC: UIViewController) {
281 | self.leftMenuVC = leftMenuVC
282 | }
283 |
284 | func setRightMenu(_ rightMenuVC: UIViewController) {
285 | self.rightMenuVC = rightMenuVC
286 | }
287 |
288 | func setContentVC(_ contentVC: UIViewController) {
289 | self.contentVC = contentVC
290 | }
291 |
292 | func setupContent() {
293 | guard let segueName = contentSegueName else { return }
294 | contentView.frame = view.bounds
295 | view.addSubview(contentView)
296 |
297 | performSegue(withIdentifier: segueName, sender: self)
298 | }
299 |
300 | func setupLeftMenu() {
301 | guard let segueName = leftMenuSegueName else { return }
302 | overlayView.frame = contentView.bounds
303 | contentView.addSubview(overlayView)
304 | performSegue(withIdentifier: segueName, sender: self)
305 | }
306 |
307 | func setupRightMenu() {
308 | guard let segueName = rightMenuSegueName else { return }
309 | overlayView.frame = contentView.bounds
310 | contentView.addSubview(overlayView)
311 | performSegue(withIdentifier: segueName, sender: self)
312 | }
313 |
314 | func updateLeftMenuFrame() {
315 | guard let window = UIWindow.keyWindow else {return}
316 | let x = menuState == .leftOpened ? 0 : -leftMenuWidth
317 | leftMenuVC?.view.frame = CGRect(x: x, y: 0, width: leftMenuWidth, height: window.height)
318 | }
319 |
320 | func updateRightMenuFrame() {
321 | guard let window = UIWindow.keyWindow else {return}
322 | let x = menuState == .rightOpened ? (window.width - rightMenuWidth) : window.width
323 | rightMenuVC?.view.frame = CGRect(x: x, y: 0, width: rightMenuWidth, height: window.height)
324 | }
325 |
326 | func setupGestures() {
327 | contentPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
328 | contentPanGestureRecognizer.delegate = self
329 |
330 | contentTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
331 |
332 | leftMenuPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
333 | leftMenuPanGestureRecognizer.delegate = self
334 |
335 | rightMenuPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
336 | rightMenuPanGestureRecognizer.delegate = self
337 | }
338 |
339 | func addGestures() {
340 | contentView.addGestureRecognizer(contentPanGestureRecognizer)
341 | overlayView.addGestureRecognizer(contentTapGestureRecognizer)
342 | leftMenuVC?.view.addGestureRecognizer(leftMenuPanGestureRecognizer)
343 | rightMenuVC?.view.addGestureRecognizer(rightMenuPanGestureRecognizer)
344 | }
345 |
346 | @objc func handleShowLeftMenuNote(_ note: Notification) {
347 | showLeftMenu(animated: true, completion: nil)
348 | }
349 |
350 | @objc func handleShowRightMenuNote(_ note: Notification) {
351 | showRightMenu(animated: true, completion: nil)
352 | }
353 |
354 | @objc func handleTap(_ tap: UITapGestureRecognizer) {
355 | if tap == self.contentTapGestureRecognizer {
356 | if menuState == .leftOpened {
357 | hideLeftMenu(animated: true)
358 | } else if menuState == .rightOpened {
359 | hideRightMenu(animated: true)
360 | }
361 | }
362 | }
363 |
364 | @objc func handlePan(_ pan: UIPanGestureRecognizer) {
365 | guard pan == self.leftMenuPanGestureRecognizer || pan == self.rightMenuPanGestureRecognizer || pan == self.contentPanGestureRecognizer else {
366 | return
367 | }
368 |
369 | enum PanIntentMenu {
370 | case left
371 | case right
372 | }
373 |
374 | struct Holder {
375 | static var firstNonZeroHorizontalVelocity: CGFloat = 0
376 | static var lastNonZeroHorizontalVelocity: CGFloat = 0
377 | }
378 |
379 | //guard let leftMenuVC = leftMenuVC, let leftMenuView = leftMenuVC.view else { return }
380 |
381 | var panIntentMenu: PanIntentMenu = .left
382 |
383 | let leftMenuView = leftMenuVC?.view
384 | let rightMenuView = rightMenuVC?.view
385 |
386 | let panningView = pan.view
387 | let translation = pan.translation(in: panningView)
388 |
389 | let velocity = pan.velocity(in: view)
390 | if velocity.x != 0 {
391 | Holder.lastNonZeroHorizontalVelocity = velocity.x
392 |
393 | if Holder.firstNonZeroHorizontalVelocity == 0 {
394 | Holder.firstNonZeroHorizontalVelocity = velocity.x
395 | }
396 | }
397 |
398 | if menuState == .closed {
399 | panIntentMenu = Holder.firstNonZeroHorizontalVelocity < 0 ? .right : .left
400 | } else if menuState == .leftOpened {
401 | panIntentMenu = .left
402 | } else if menuState == .rightOpened {
403 | panIntentMenu = .right
404 | }
405 |
406 | if pan.state == .began {
407 | if self.menuState == .closed {
408 | if velocity.x > 0 {
409 |
410 | self.updateLeftMenuFrame()
411 | self.delegate?.leftMenuWillShow()
412 | } else {
413 | self.updateRightMenuFrame()
414 | self.delegate?.rightMenuWillShow()
415 | }
416 | } else {
417 | if velocity.x < 0, menuState == .leftOpened {
418 | self.delegate?.leftMenuWillHide()
419 | } else if velocity.x > 0, menuState == .rightOpened {
420 | self.delegate?.rightMenuWillHide()
421 | }
422 | }
423 | pan.setTranslation(.zero, in: panningView)
424 | } else if pan.state == .ended || pan.state == .cancelled || pan.state == .failed {
425 |
426 | if panIntentMenu == .left, let leftMenuView = leftMenuView {
427 | let progressToAnimate: CGFloat = Holder.lastNonZeroHorizontalVelocity > 0 ? 1 : 0
428 | animator.animate(leftMenuView: leftMenuView, contentView: contentView, progress: progressToAnimate, animated: true) {
429 | if progressToAnimate == 0 {
430 | //Closed
431 | self.menuState = .closed
432 | self.delegate?.leftMenuDidHide()
433 | } else {
434 | //Opened
435 | self.menuState = .leftOpened
436 | self.delegate?.leftMenuDidShow()
437 | }
438 | }
439 | } else if panIntentMenu == .right, let rightMenuView = rightMenuView {
440 | let progressToAnimate: CGFloat = Holder.lastNonZeroHorizontalVelocity < 0 ? 1 : 0
441 | animator.animate(rightMenuView: rightMenuView, contentView: contentView, progress: progressToAnimate, animated: true) {
442 | if progressToAnimate == 0 {
443 | //Closed
444 | self.menuState = .closed
445 | self.delegate?.rightMenuDidHide()
446 | } else {
447 | //Opened
448 | self.menuState = .rightOpened
449 | self.delegate?.rightMenuDidShow()
450 | }
451 | }
452 | }
453 |
454 | Holder.firstNonZeroHorizontalVelocity = 0
455 | } else {
456 | var progress: CGFloat = 0
457 |
458 | if panIntentMenu == .left, let leftMenuView = leftMenuView {
459 | if menuState == .closed {
460 | progress = translation.x / leftMenuWidth
461 | } else {
462 | progress = 1 + translation.x / leftMenuWidth
463 | }
464 |
465 | animator.animate(leftMenuView: leftMenuView,
466 | contentView: contentView,
467 | progress: progress,
468 | animated: false,
469 | completion: nil)
470 | } else if panIntentMenu == .right, let rightMenuView = rightMenuView {
471 | if menuState == .closed {
472 | progress = -translation.x / rightMenuWidth
473 | } else {
474 | progress = 1 - translation.x / rightMenuWidth
475 | }
476 | animator.animate(rightMenuView: rightMenuView,
477 | contentView: contentView,
478 | progress: progress,
479 | animated: false,
480 | completion: nil)
481 | }
482 | }
483 | }
484 | }
485 |
486 | extension AMSlideMenuMainViewController: UIGestureRecognizerDelegate {
487 | open func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
488 | if gestureRecognizer == leftMenuPanGestureRecognizer || gestureRecognizer == rightMenuPanGestureRecognizer || gestureRecognizer == contentPanGestureRecognizer {
489 | if let pan = gestureRecognizer as? UIPanGestureRecognizer {
490 | let velocity = pan.velocity(in: pan.view)
491 | let isHorizontalGesture = abs(velocity.y) < abs(velocity.x)
492 |
493 | if !isHorizontalGesture {
494 | return false
495 | }
496 |
497 | if menuState != .closed {
498 | return true
499 | }
500 |
501 | let point = pan.location(in: contentView)
502 |
503 | if velocity.x > 0 {
504 | if let rightMenuFrame = rightMenuVC?.view.layer.presentation()?.frame, rightMenuFrame.origin.x < contentView.bounds.width {
505 | print(rightMenuFrame)
506 | return false
507 | }
508 | return point.x <= contentView.bounds.width * CGFloat(panGestureWorkingAreaPercent) / 100
509 | } else {
510 | if let leftMenuFrame = leftMenuVC?.view.layer.presentation()?.frame, leftMenuFrame.maxX > 0 {
511 | return false
512 | }
513 | return point.x > contentView.bounds.width * (1 - CGFloat(panGestureWorkingAreaPercent) / 100)
514 | }
515 | }
516 | }
517 | return true
518 | }
519 |
520 | open func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
521 | guard gestureRecognizer == self.contentPanGestureRecognizer else {return true}
522 |
523 | let velocity = self.contentPanGestureRecognizer.velocity(in: self.contentPanGestureRecognizer.view)
524 | let isHorizontalGesture = abs(velocity.y) < abs(velocity.x)
525 |
526 | if otherGestureRecognizer.view is UITableView {
527 | if isHorizontalGesture {
528 | let directionIsLeft = velocity.x < 0
529 | if directionIsLeft {
530 | if menuState == .closed {
531 | contentPanGestureRecognizer.isEnabled = false
532 | contentPanGestureRecognizer.isEnabled = true
533 | return true
534 | }
535 | } else {
536 | let tableView = otherGestureRecognizer.view as! UITableView
537 | let point = otherGestureRecognizer.location(in: tableView)
538 | if let indexPath = tableView.indexPathForRow(at: point), let cell = tableView.cellForRow(at: indexPath) {
539 | if (cell.isEditing) {
540 | contentPanGestureRecognizer.isEnabled = false
541 | contentPanGestureRecognizer.isEnabled = true
542 | return true
543 | }
544 | }
545 | }
546 | }
547 | } else {
548 | if let c = NSClassFromString("UITableViewCellScrollView"), otherGestureRecognizer.view?.isKind(of: c) ?? false {
549 | return true
550 | }
551 | }
552 |
553 | return false
554 | }
555 | }
556 |
557 | extension AMSlideMenuMainViewController {
558 | public enum MenuState {
559 | case closed
560 | case leftOpened
561 | case rightOpened
562 | }
563 | }
564 |
565 | extension NSNotification.Name {
566 | public static let showLeftMenu = NSNotification.Name("showLeftMenu")
567 | public static let showRightMenu = NSNotification.Name("showRightMenu")
568 | }
569 |
--------------------------------------------------------------------------------
/AMSlideMenuExample/Pods/Pods.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 51;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 00B049ECB63E758434E91BD4BA33C5B1 /* AMSlidingShadowAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98774218C7FD0968F9B13A01C8007F7A /* AMSlidingShadowAnimator.swift */; };
11 | 07355CDFF36C32B3C1834C21B2E42C09 /* AMSlidingDimmedBackgroundAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE4CD17682456514C4D8BEBD9C152A /* AMSlidingDimmedBackgroundAnimator.swift */; };
12 | 0A0A04CB3B3CC042D9B97C591F3BFD77 /* AMContentSegue.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9A75B22DF3DC391874AB094CDB391E9 /* AMContentSegue.swift */; };
13 | 0F178E5D99371DEF38BF57B9F5E2B148 /* AMSlidingAnimatorFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 245EB0A62E76A412B30A0A538937D03D /* AMSlidingAnimatorFactory.swift */; };
14 | 2BE46B7FFE1E2095B201A50D36FB6A3A /* CAMediaTimingFunction+AMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76DCA304215BD805F61CF73238D54333 /* CAMediaTimingFunction+AMExtension.swift */; };
15 | 2FD21B869A96FDE69367632B9428DB62 /* AMLeftMenuSegue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E6EB6AF27330370296F8A0ABD5A0D8F /* AMLeftMenuSegue.swift */; };
16 | 3BA75B6945572169BE0CEDF141FCA836 /* Pods-AMSlideMenuExample-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 772B182833F9DD0BD5193A609C76385D /* Pods-AMSlideMenuExample-dummy.m */; };
17 | 458891ADAB3970CB2A6CBECA9E22E8CB /* AMSlidingAnimationOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76408170C31FC0A17761CE523932DFC3 /* AMSlidingAnimationOptions.swift */; };
18 | 4CB8D91AB81036D44516B6843A86C60F /* BlurryOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B083BD35174E4668536276CAB1CA1C6 /* BlurryOverlayView.swift */; };
19 | 5B4CFE73B3BFB878785EDA0616405BE3 /* AMSlidingFixedMenuAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA2C6E611F2823FB7ACC02F68A0BA42C /* AMSlidingFixedMenuAnimator.swift */; };
20 | 795EF86EB482B7537404D3E4769ECC64 /* Pods-AMSlideMenuExample-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D6109D3DCC621A5E9D69281236F55B90 /* Pods-AMSlideMenuExample-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
21 | 8A326DF3E20276FA783EF8CFC7D7FE10 /* AMSlideMenu-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 74E5C9947086DE7CC569C381FDF395DF /* AMSlideMenu-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
22 | 8E22653D875FFA4ED4BF772B9B4C7CF7 /* AMSlidingAnimatorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34BF0BC5A2621BBDD069B4D06B49570E /* AMSlidingAnimatorProtocol.swift */; };
23 | 952A76D07F0F2B0D5F4174202E89BBDB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; };
24 | 952C6B79434379139DE92D7B643245C0 /* AMSlidingStandardAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7963B7066E3BD19FA92207B3F584E1 /* AMSlidingStandardAnimator.swift */; };
25 | A8AB80EB3F4BC5BD43B0BC46F506BA2C /* AMSlideMenu-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B548A4DD608DCCAB3D25E0494D6B285 /* AMSlideMenu-dummy.m */; };
26 | AC6C8D2FF0F074D4EAA33C5B0792DB75 /* UIViewController+AMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25254DF4F6F5C55EAA7C439EB4EDA826 /* UIViewController+AMExtension.swift */; };
27 | B48BBC1AF5E90A7C0C6B43F244E3DFEE /* AMSlidingContentAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2237CC2351CF7CADE7AB6F725585174B /* AMSlidingContentAnimator.swift */; };
28 | C149B88CD093785A9788C9E2AD700A5D /* AMSlidingGroupAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00090FA032451C81A6487803788F42AA /* AMSlidingGroupAnimator.swift */; };
29 | C24D957AB66E5A52F105C9E321D21CE7 /* AMSlidingBlurAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1057D6FA823118376B30833C3A447FB2 /* AMSlidingBlurAnimator.swift */; };
30 | CCF39EF4D437B7434E2D15170C5CBF6C /* AMSlidingContentShadowAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B944EAB979BC8D0518F0133080A37467 /* AMSlidingContentShadowAnimator.swift */; };
31 | D261697DB0E26479B55ECFB1442366D2 /* AMRightMenuSegue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8530898E6EAB52C7AE055C3AD4C26C5B /* AMRightMenuSegue.swift */; };
32 | DF896B70C15E17A89BA08E1E349E7545 /* AMSlideMenuMainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A88AE47F29C742A20B2205C41734E21 /* AMSlideMenuMainViewController.swift */; };
33 | F50A233660BFEDDD26721A2954A839A6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; };
34 | /* End PBXBuildFile section */
35 |
36 | /* Begin PBXContainerItemProxy section */
37 | 1940865B866AACB712BF0CFD30E75898 /* PBXContainerItemProxy */ = {
38 | isa = PBXContainerItemProxy;
39 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
40 | proxyType = 1;
41 | remoteGlobalIDString = D1AB14E63B3BDEC2459220B44EC93D1C;
42 | remoteInfo = AMSlideMenu;
43 | };
44 | /* End PBXContainerItemProxy section */
45 |
46 | /* Begin PBXFileReference section */
47 | 00090FA032451C81A6487803788F42AA /* AMSlidingGroupAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMSlidingGroupAnimator.swift; sourceTree = ""; };
48 | 08674E449B1B7788F7B54494F8EDD4E9 /* Pods-AMSlideMenuExample.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AMSlideMenuExample.modulemap"; sourceTree = ""; };
49 | 0C067F73AF415C9152619176FC97EB7A /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; };
50 | 1057D6FA823118376B30833C3A447FB2 /* AMSlidingBlurAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMSlidingBlurAnimator.swift; sourceTree = ""; };
51 | 12147B1CD3AC6CEC7BDF479E6E846155 /* Pods-AMSlideMenuExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AMSlideMenuExample.release.xcconfig"; sourceTree = ""; };
52 | 186C7BD768F2C5CC545FF0405C7B10EF /* AMSlideMenu-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "AMSlideMenu-Info.plist"; sourceTree = ""; };
53 | 215FCBDD0BF68FE79AE22FDD3C4C9DAD /* Pods-AMSlideMenuExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AMSlideMenuExample.debug.xcconfig"; sourceTree = ""; };
54 | 2237CC2351CF7CADE7AB6F725585174B /* AMSlidingContentAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMSlidingContentAnimator.swift; sourceTree = ""; };
55 | 245EB0A62E76A412B30A0A538937D03D /* AMSlidingAnimatorFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMSlidingAnimatorFactory.swift; sourceTree = ""; };
56 | 25254DF4F6F5C55EAA7C439EB4EDA826 /* UIViewController+AMExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIViewController+AMExtension.swift"; sourceTree = ""; };
57 | 258B87661676BD7276262FB40E6F435C /* Pods-AMSlideMenuExample-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AMSlideMenuExample-acknowledgements.markdown"; sourceTree = ""; };
58 | 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; };
59 | 34BF0BC5A2621BBDD069B4D06B49570E /* AMSlidingAnimatorProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMSlidingAnimatorProtocol.swift; sourceTree = ""; };
60 | 5152048B5757B37A08870C2010DCBB4F /* AMSlideMenu.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AMSlideMenu.framework; path = AMSlideMenu.framework; sourceTree = BUILT_PRODUCTS_DIR; };
61 | 624406D3B18E98602885B2FE18CDF14D /* AMSlideMenu-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AMSlideMenu-prefix.pch"; sourceTree = ""; };
62 | 6B083BD35174E4668536276CAB1CA1C6 /* BlurryOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BlurryOverlayView.swift; sourceTree = ""; };
63 | 74E5C9947086DE7CC569C381FDF395DF /* AMSlideMenu-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AMSlideMenu-umbrella.h"; sourceTree = ""; };
64 | 76408170C31FC0A17761CE523932DFC3 /* AMSlidingAnimationOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMSlidingAnimationOptions.swift; sourceTree = ""; };
65 | 76DCA304215BD805F61CF73238D54333 /* CAMediaTimingFunction+AMExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CAMediaTimingFunction+AMExtension.swift"; sourceTree = ""; };
66 | 772B182833F9DD0BD5193A609C76385D /* Pods-AMSlideMenuExample-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AMSlideMenuExample-dummy.m"; sourceTree = ""; };
67 | 7A88AE47F29C742A20B2205C41734E21 /* AMSlideMenuMainViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AMSlideMenuMainViewController.swift; path = AMSlideMenu/AMSlideMenuMainViewController.swift; sourceTree = ""; };
68 | 7B548A4DD608DCCAB3D25E0494D6B285 /* AMSlideMenu-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AMSlideMenu-dummy.m"; sourceTree = ""; };
69 | 7E6EB6AF27330370296F8A0ABD5A0D8F /* AMLeftMenuSegue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMLeftMenuSegue.swift; sourceTree = ""; };
70 | 8530898E6EAB52C7AE055C3AD4C26C5B /* AMRightMenuSegue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMRightMenuSegue.swift; sourceTree = ""; };
71 | 9679CE423B9DC5378E9BAEE331C14666 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; };
72 | 98774218C7FD0968F9B13A01C8007F7A /* AMSlidingShadowAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMSlidingShadowAnimator.swift; sourceTree = ""; };
73 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
74 | A371AD296239A0AECFDA73A36F59D398 /* AMSlideMenu.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AMSlideMenu.release.xcconfig; sourceTree = ""; };
75 | B944EAB979BC8D0518F0133080A37467 /* AMSlidingContentShadowAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMSlidingContentShadowAnimator.swift; sourceTree = ""; };
76 | BA2C6E611F2823FB7ACC02F68A0BA42C /* AMSlidingFixedMenuAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMSlidingFixedMenuAnimator.swift; sourceTree = ""; };
77 | C1E74C5925A04CC9135101DA47F72C82 /* AMSlideMenu.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = AMSlideMenu.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
78 | CB69B06C89C383857620E72CA51902B9 /* Pods-AMSlideMenuExample-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AMSlideMenuExample-Info.plist"; sourceTree = ""; };
79 | CBEE4CD17682456514C4D8BEBD9C152A /* AMSlidingDimmedBackgroundAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMSlidingDimmedBackgroundAnimator.swift; sourceTree = ""; };
80 | D6109D3DCC621A5E9D69281236F55B90 /* Pods-AMSlideMenuExample-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AMSlideMenuExample-umbrella.h"; sourceTree = ""; };
81 | DA09FFA9DB4DC52D5BEF0789C5105564 /* AMSlideMenu.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AMSlideMenu.debug.xcconfig; sourceTree = ""; };
82 | DB2EC49A3CD1532E27676A083FA2ACB8 /* Pods-AMSlideMenuExample-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AMSlideMenuExample-acknowledgements.plist"; sourceTree = ""; };
83 | DB7963B7066E3BD19FA92207B3F584E1 /* AMSlidingStandardAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMSlidingStandardAnimator.swift; sourceTree = ""; };
84 | DC05D8B1B1B3D0CBB307C22F884E68F1 /* Pods_AMSlideMenuExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_AMSlideMenuExample.framework; path = "Pods-AMSlideMenuExample.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
85 | E1C09436C1F8B8C2B9A5D7974ADCFB35 /* Pods-AMSlideMenuExample-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AMSlideMenuExample-frameworks.sh"; sourceTree = ""; };
86 | E9A75B22DF3DC391874AB094CDB391E9 /* AMContentSegue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AMContentSegue.swift; sourceTree = ""; };
87 | F01F6332CE97A6273C107D3EF377193A /* AMSlideMenu.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AMSlideMenu.modulemap; sourceTree = ""; };
88 | /* End PBXFileReference section */
89 |
90 | /* Begin PBXFrameworksBuildPhase section */
91 | 3507A10B643BCB132BDB17DA1D996330 /* Frameworks */ = {
92 | isa = PBXFrameworksBuildPhase;
93 | buildActionMask = 2147483647;
94 | files = (
95 | F50A233660BFEDDD26721A2954A839A6 /* Foundation.framework in Frameworks */,
96 | );
97 | runOnlyForDeploymentPostprocessing = 0;
98 | };
99 | FD1F03160D34D481E0D1D2A8777B4C2E /* Frameworks */ = {
100 | isa = PBXFrameworksBuildPhase;
101 | buildActionMask = 2147483647;
102 | files = (
103 | 952A76D07F0F2B0D5F4174202E89BBDB /* Foundation.framework in Frameworks */,
104 | );
105 | runOnlyForDeploymentPostprocessing = 0;
106 | };
107 | /* End PBXFrameworksBuildPhase section */
108 |
109 | /* Begin PBXGroup section */
110 | 07E8D432254C3E6B5C0483AACBBB502D /* Products */ = {
111 | isa = PBXGroup;
112 | children = (
113 | 5152048B5757B37A08870C2010DCBB4F /* AMSlideMenu.framework */,
114 | DC05D8B1B1B3D0CBB307C22F884E68F1 /* Pods_AMSlideMenuExample.framework */,
115 | );
116 | name = Products;
117 | sourceTree = "";
118 | };
119 | 098F6EC43605045846A5B218AD8C5CA1 /* Pods-AMSlideMenuExample */ = {
120 | isa = PBXGroup;
121 | children = (
122 | 08674E449B1B7788F7B54494F8EDD4E9 /* Pods-AMSlideMenuExample.modulemap */,
123 | 258B87661676BD7276262FB40E6F435C /* Pods-AMSlideMenuExample-acknowledgements.markdown */,
124 | DB2EC49A3CD1532E27676A083FA2ACB8 /* Pods-AMSlideMenuExample-acknowledgements.plist */,
125 | 772B182833F9DD0BD5193A609C76385D /* Pods-AMSlideMenuExample-dummy.m */,
126 | E1C09436C1F8B8C2B9A5D7974ADCFB35 /* Pods-AMSlideMenuExample-frameworks.sh */,
127 | CB69B06C89C383857620E72CA51902B9 /* Pods-AMSlideMenuExample-Info.plist */,
128 | D6109D3DCC621A5E9D69281236F55B90 /* Pods-AMSlideMenuExample-umbrella.h */,
129 | 215FCBDD0BF68FE79AE22FDD3C4C9DAD /* Pods-AMSlideMenuExample.debug.xcconfig */,
130 | 12147B1CD3AC6CEC7BDF479E6E846155 /* Pods-AMSlideMenuExample.release.xcconfig */,
131 | );
132 | name = "Pods-AMSlideMenuExample";
133 | path = "Target Support Files/Pods-AMSlideMenuExample";
134 | sourceTree = "";
135 | };
136 | 0D15F5CA8CCF17BAF338FE6BCC56B28B /* Pod */ = {
137 | isa = PBXGroup;
138 | children = (
139 | C1E74C5925A04CC9135101DA47F72C82 /* AMSlideMenu.podspec */,
140 | 0C067F73AF415C9152619176FC97EB7A /* LICENSE */,
141 | 9679CE423B9DC5378E9BAEE331C14666 /* README.md */,
142 | );
143 | name = Pod;
144 | sourceTree = "";
145 | };
146 | 1A9064D80141E1085C43929D1C8B8E8A /* AMSlideMenu */ = {
147 | isa = PBXGroup;
148 | children = (
149 | 7A88AE47F29C742A20B2205C41734E21 /* AMSlideMenuMainViewController.swift */,
150 | D8B2CC920CC478C03B8C439BA15B4317 /* Animation */,
151 | 680102352E8D62E41A9673FD0DC419DE /* CustomVisualEffectView */,
152 | 38CF5BB369A5CAC743D96474F5C726D1 /* Extensions */,
153 | 0D15F5CA8CCF17BAF338FE6BCC56B28B /* Pod */,
154 | 51F92BEB5083D26F83DDE38CBBF321F3 /* Segues */,
155 | 5B752A8BDEAD14EA88C2C5C090200431 /* Support Files */,
156 | );
157 | name = AMSlideMenu;
158 | path = ../..;
159 | sourceTree = "";
160 | };
161 | 38CF5BB369A5CAC743D96474F5C726D1 /* Extensions */ = {
162 | isa = PBXGroup;
163 | children = (
164 | 25254DF4F6F5C55EAA7C439EB4EDA826 /* UIViewController+AMExtension.swift */,
165 | );
166 | name = Extensions;
167 | path = AMSlideMenu/Extensions;
168 | sourceTree = "";
169 | };
170 | 3D03F7175F203E8A4537AA611140C759 /* Targets Support Files */ = {
171 | isa = PBXGroup;
172 | children = (
173 | 098F6EC43605045846A5B218AD8C5CA1 /* Pods-AMSlideMenuExample */,
174 | );
175 | name = "Targets Support Files";
176 | sourceTree = "";
177 | };
178 | 51F92BEB5083D26F83DDE38CBBF321F3 /* Segues */ = {
179 | isa = PBXGroup;
180 | children = (
181 | E9A75B22DF3DC391874AB094CDB391E9 /* AMContentSegue.swift */,
182 | 7E6EB6AF27330370296F8A0ABD5A0D8F /* AMLeftMenuSegue.swift */,
183 | 8530898E6EAB52C7AE055C3AD4C26C5B /* AMRightMenuSegue.swift */,
184 | );
185 | name = Segues;
186 | path = AMSlideMenu/Segues;
187 | sourceTree = "";
188 | };
189 | 5B752A8BDEAD14EA88C2C5C090200431 /* Support Files */ = {
190 | isa = PBXGroup;
191 | children = (
192 | F01F6332CE97A6273C107D3EF377193A /* AMSlideMenu.modulemap */,
193 | 7B548A4DD608DCCAB3D25E0494D6B285 /* AMSlideMenu-dummy.m */,
194 | 186C7BD768F2C5CC545FF0405C7B10EF /* AMSlideMenu-Info.plist */,
195 | 624406D3B18E98602885B2FE18CDF14D /* AMSlideMenu-prefix.pch */,
196 | 74E5C9947086DE7CC569C381FDF395DF /* AMSlideMenu-umbrella.h */,
197 | DA09FFA9DB4DC52D5BEF0789C5105564 /* AMSlideMenu.debug.xcconfig */,
198 | A371AD296239A0AECFDA73A36F59D398 /* AMSlideMenu.release.xcconfig */,
199 | );
200 | name = "Support Files";
201 | path = "AMSlideMenuExample/Pods/Target Support Files/AMSlideMenu";
202 | sourceTree = "";
203 | };
204 | 680102352E8D62E41A9673FD0DC419DE /* CustomVisualEffectView */ = {
205 | isa = PBXGroup;
206 | children = (
207 | 6B083BD35174E4668536276CAB1CA1C6 /* BlurryOverlayView.swift */,
208 | );
209 | name = CustomVisualEffectView;
210 | path = AMSlideMenu/CustomVisualEffectView;
211 | sourceTree = "";
212 | };
213 | A7B7C2DB33D0C35A9BC5313F599840E1 /* Animators */ = {
214 | isa = PBXGroup;
215 | children = (
216 | 1057D6FA823118376B30833C3A447FB2 /* AMSlidingBlurAnimator.swift */,
217 | 2237CC2351CF7CADE7AB6F725585174B /* AMSlidingContentAnimator.swift */,
218 | B944EAB979BC8D0518F0133080A37467 /* AMSlidingContentShadowAnimator.swift */,
219 | CBEE4CD17682456514C4D8BEBD9C152A /* AMSlidingDimmedBackgroundAnimator.swift */,
220 | BA2C6E611F2823FB7ACC02F68A0BA42C /* AMSlidingFixedMenuAnimator.swift */,
221 | 00090FA032451C81A6487803788F42AA /* AMSlidingGroupAnimator.swift */,
222 | 98774218C7FD0968F9B13A01C8007F7A /* AMSlidingShadowAnimator.swift */,
223 | DB7963B7066E3BD19FA92207B3F584E1 /* AMSlidingStandardAnimator.swift */,
224 | );
225 | name = Animators;
226 | path = Animators;
227 | sourceTree = "";
228 | };
229 | C0834CEBB1379A84116EF29F93051C60 /* iOS */ = {
230 | isa = PBXGroup;
231 | children = (
232 | 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */,
233 | );
234 | name = iOS;
235 | sourceTree = "";
236 | };
237 | CF1408CF629C7361332E53B88F7BD30C = {
238 | isa = PBXGroup;
239 | children = (
240 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
241 | DBF7340886A9AF3CE5E65148DF453518 /* Development Pods */,
242 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */,
243 | 07E8D432254C3E6B5C0483AACBBB502D /* Products */,
244 | 3D03F7175F203E8A4537AA611140C759 /* Targets Support Files */,
245 | );
246 | sourceTree = "";
247 | };
248 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = {
249 | isa = PBXGroup;
250 | children = (
251 | C0834CEBB1379A84116EF29F93051C60 /* iOS */,
252 | );
253 | name = Frameworks;
254 | sourceTree = "";
255 | };
256 | D8B2CC920CC478C03B8C439BA15B4317 /* Animation */ = {
257 | isa = PBXGroup;
258 | children = (
259 | 76408170C31FC0A17761CE523932DFC3 /* AMSlidingAnimationOptions.swift */,
260 | 245EB0A62E76A412B30A0A538937D03D /* AMSlidingAnimatorFactory.swift */,
261 | 34BF0BC5A2621BBDD069B4D06B49570E /* AMSlidingAnimatorProtocol.swift */,
262 | 76DCA304215BD805F61CF73238D54333 /* CAMediaTimingFunction+AMExtension.swift */,
263 | A7B7C2DB33D0C35A9BC5313F599840E1 /* Animators */,
264 | );
265 | name = Animation;
266 | path = AMSlideMenu/Animation;
267 | sourceTree = "";
268 | };
269 | DBF7340886A9AF3CE5E65148DF453518 /* Development Pods */ = {
270 | isa = PBXGroup;
271 | children = (
272 | 1A9064D80141E1085C43929D1C8B8E8A /* AMSlideMenu */,
273 | );
274 | name = "Development Pods";
275 | sourceTree = "";
276 | };
277 | /* End PBXGroup section */
278 |
279 | /* Begin PBXHeadersBuildPhase section */
280 | AA0719E5EA83256C1BA9309BEE441165 /* Headers */ = {
281 | isa = PBXHeadersBuildPhase;
282 | buildActionMask = 2147483647;
283 | files = (
284 | 8A326DF3E20276FA783EF8CFC7D7FE10 /* AMSlideMenu-umbrella.h in Headers */,
285 | );
286 | runOnlyForDeploymentPostprocessing = 0;
287 | };
288 | BB6497CBE8F66FE9BAD618DC30791D42 /* Headers */ = {
289 | isa = PBXHeadersBuildPhase;
290 | buildActionMask = 2147483647;
291 | files = (
292 | 795EF86EB482B7537404D3E4769ECC64 /* Pods-AMSlideMenuExample-umbrella.h in Headers */,
293 | );
294 | runOnlyForDeploymentPostprocessing = 0;
295 | };
296 | /* End PBXHeadersBuildPhase section */
297 |
298 | /* Begin PBXNativeTarget section */
299 | A34FDDE0E9AEAF13DC7FB93A73179030 /* Pods-AMSlideMenuExample */ = {
300 | isa = PBXNativeTarget;
301 | buildConfigurationList = 0062B62CBD1B91C9ECF27C5E46A99C24 /* Build configuration list for PBXNativeTarget "Pods-AMSlideMenuExample" */;
302 | buildPhases = (
303 | BB6497CBE8F66FE9BAD618DC30791D42 /* Headers */,
304 | FD730ABCD247BB6F0F71E73ED8BB3E52 /* Sources */,
305 | FD1F03160D34D481E0D1D2A8777B4C2E /* Frameworks */,
306 | B6A78600E2D66185ACC8245B0E90DA6C /* Resources */,
307 | );
308 | buildRules = (
309 | );
310 | dependencies = (
311 | CF0E33C09453B42305CFEC898707B6BF /* PBXTargetDependency */,
312 | );
313 | name = "Pods-AMSlideMenuExample";
314 | productName = "Pods-AMSlideMenuExample";
315 | productReference = DC05D8B1B1B3D0CBB307C22F884E68F1 /* Pods_AMSlideMenuExample.framework */;
316 | productType = "com.apple.product-type.framework";
317 | };
318 | D1AB14E63B3BDEC2459220B44EC93D1C /* AMSlideMenu */ = {
319 | isa = PBXNativeTarget;
320 | buildConfigurationList = 847C2CDDDBB7C5042AB66A299BD0462A /* Build configuration list for PBXNativeTarget "AMSlideMenu" */;
321 | buildPhases = (
322 | AA0719E5EA83256C1BA9309BEE441165 /* Headers */,
323 | 4B3D3CE4F2B87EABC6438FED4568B420 /* Sources */,
324 | 3507A10B643BCB132BDB17DA1D996330 /* Frameworks */,
325 | 8EF31E69D8E090B842331F47A1DFE71F /* Resources */,
326 | );
327 | buildRules = (
328 | );
329 | dependencies = (
330 | );
331 | name = AMSlideMenu;
332 | productName = AMSlideMenu;
333 | productReference = 5152048B5757B37A08870C2010DCBB4F /* AMSlideMenu.framework */;
334 | productType = "com.apple.product-type.framework";
335 | };
336 | /* End PBXNativeTarget section */
337 |
338 | /* Begin PBXProject section */
339 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = {
340 | isa = PBXProject;
341 | attributes = {
342 | LastSwiftUpdateCheck = 1100;
343 | LastUpgradeCheck = 1100;
344 | };
345 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
346 | compatibilityVersion = "Xcode 10.0";
347 | developmentRegion = en;
348 | hasScannedForEncodings = 0;
349 | knownRegions = (
350 | en,
351 | Base,
352 | );
353 | mainGroup = CF1408CF629C7361332E53B88F7BD30C;
354 | productRefGroup = 07E8D432254C3E6B5C0483AACBBB502D /* Products */;
355 | projectDirPath = "";
356 | projectRoot = "";
357 | targets = (
358 | D1AB14E63B3BDEC2459220B44EC93D1C /* AMSlideMenu */,
359 | A34FDDE0E9AEAF13DC7FB93A73179030 /* Pods-AMSlideMenuExample */,
360 | );
361 | };
362 | /* End PBXProject section */
363 |
364 | /* Begin PBXResourcesBuildPhase section */
365 | 8EF31E69D8E090B842331F47A1DFE71F /* Resources */ = {
366 | isa = PBXResourcesBuildPhase;
367 | buildActionMask = 2147483647;
368 | files = (
369 | );
370 | runOnlyForDeploymentPostprocessing = 0;
371 | };
372 | B6A78600E2D66185ACC8245B0E90DA6C /* Resources */ = {
373 | isa = PBXResourcesBuildPhase;
374 | buildActionMask = 2147483647;
375 | files = (
376 | );
377 | runOnlyForDeploymentPostprocessing = 0;
378 | };
379 | /* End PBXResourcesBuildPhase section */
380 |
381 | /* Begin PBXSourcesBuildPhase section */
382 | 4B3D3CE4F2B87EABC6438FED4568B420 /* Sources */ = {
383 | isa = PBXSourcesBuildPhase;
384 | buildActionMask = 2147483647;
385 | files = (
386 | 0A0A04CB3B3CC042D9B97C591F3BFD77 /* AMContentSegue.swift in Sources */,
387 | 2FD21B869A96FDE69367632B9428DB62 /* AMLeftMenuSegue.swift in Sources */,
388 | D261697DB0E26479B55ECFB1442366D2 /* AMRightMenuSegue.swift in Sources */,
389 | A8AB80EB3F4BC5BD43B0BC46F506BA2C /* AMSlideMenu-dummy.m in Sources */,
390 | DF896B70C15E17A89BA08E1E349E7545 /* AMSlideMenuMainViewController.swift in Sources */,
391 | 458891ADAB3970CB2A6CBECA9E22E8CB /* AMSlidingAnimationOptions.swift in Sources */,
392 | 0F178E5D99371DEF38BF57B9F5E2B148 /* AMSlidingAnimatorFactory.swift in Sources */,
393 | 8E22653D875FFA4ED4BF772B9B4C7CF7 /* AMSlidingAnimatorProtocol.swift in Sources */,
394 | C24D957AB66E5A52F105C9E321D21CE7 /* AMSlidingBlurAnimator.swift in Sources */,
395 | B48BBC1AF5E90A7C0C6B43F244E3DFEE /* AMSlidingContentAnimator.swift in Sources */,
396 | CCF39EF4D437B7434E2D15170C5CBF6C /* AMSlidingContentShadowAnimator.swift in Sources */,
397 | 07355CDFF36C32B3C1834C21B2E42C09 /* AMSlidingDimmedBackgroundAnimator.swift in Sources */,
398 | 5B4CFE73B3BFB878785EDA0616405BE3 /* AMSlidingFixedMenuAnimator.swift in Sources */,
399 | C149B88CD093785A9788C9E2AD700A5D /* AMSlidingGroupAnimator.swift in Sources */,
400 | 00B049ECB63E758434E91BD4BA33C5B1 /* AMSlidingShadowAnimator.swift in Sources */,
401 | 952C6B79434379139DE92D7B643245C0 /* AMSlidingStandardAnimator.swift in Sources */,
402 | 4CB8D91AB81036D44516B6843A86C60F /* BlurryOverlayView.swift in Sources */,
403 | 2BE46B7FFE1E2095B201A50D36FB6A3A /* CAMediaTimingFunction+AMExtension.swift in Sources */,
404 | AC6C8D2FF0F074D4EAA33C5B0792DB75 /* UIViewController+AMExtension.swift in Sources */,
405 | );
406 | runOnlyForDeploymentPostprocessing = 0;
407 | };
408 | FD730ABCD247BB6F0F71E73ED8BB3E52 /* Sources */ = {
409 | isa = PBXSourcesBuildPhase;
410 | buildActionMask = 2147483647;
411 | files = (
412 | 3BA75B6945572169BE0CEDF141FCA836 /* Pods-AMSlideMenuExample-dummy.m in Sources */,
413 | );
414 | runOnlyForDeploymentPostprocessing = 0;
415 | };
416 | /* End PBXSourcesBuildPhase section */
417 |
418 | /* Begin PBXTargetDependency section */
419 | CF0E33C09453B42305CFEC898707B6BF /* PBXTargetDependency */ = {
420 | isa = PBXTargetDependency;
421 | name = AMSlideMenu;
422 | target = D1AB14E63B3BDEC2459220B44EC93D1C /* AMSlideMenu */;
423 | targetProxy = 1940865B866AACB712BF0CFD30E75898 /* PBXContainerItemProxy */;
424 | };
425 | /* End PBXTargetDependency section */
426 |
427 | /* Begin XCBuildConfiguration section */
428 | 49FDD9975C00A6B99639F0C32CAF6C8D /* Release */ = {
429 | isa = XCBuildConfiguration;
430 | baseConfigurationReference = 12147B1CD3AC6CEC7BDF479E6E846155 /* Pods-AMSlideMenuExample.release.xcconfig */;
431 | buildSettings = {
432 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
433 | CLANG_ENABLE_OBJC_WEAK = NO;
434 | CODE_SIGN_IDENTITY = "";
435 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
436 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
437 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
438 | CURRENT_PROJECT_VERSION = 1;
439 | DEFINES_MODULE = YES;
440 | DYLIB_COMPATIBILITY_VERSION = 1;
441 | DYLIB_CURRENT_VERSION = 1;
442 | DYLIB_INSTALL_NAME_BASE = "@rpath";
443 | INFOPLIST_FILE = "Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-Info.plist";
444 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
445 | IPHONEOS_DEPLOYMENT_TARGET = 13.4;
446 | LD_RUNPATH_SEARCH_PATHS = (
447 | "$(inherited)",
448 | "@executable_path/Frameworks",
449 | "@loader_path/Frameworks",
450 | );
451 | MACH_O_TYPE = staticlib;
452 | MODULEMAP_FILE = "Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample.modulemap";
453 | OTHER_LDFLAGS = "";
454 | OTHER_LIBTOOLFLAGS = "";
455 | PODS_ROOT = "$(SRCROOT)";
456 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
457 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
458 | SDKROOT = iphoneos;
459 | SKIP_INSTALL = YES;
460 | TARGETED_DEVICE_FAMILY = "1,2";
461 | VALIDATE_PRODUCT = YES;
462 | VERSIONING_SYSTEM = "apple-generic";
463 | VERSION_INFO_PREFIX = "";
464 | };
465 | name = Release;
466 | };
467 | 4AADD14F937156BCF89CD485F4694F8D /* Debug */ = {
468 | isa = XCBuildConfiguration;
469 | baseConfigurationReference = 215FCBDD0BF68FE79AE22FDD3C4C9DAD /* Pods-AMSlideMenuExample.debug.xcconfig */;
470 | buildSettings = {
471 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
472 | CLANG_ENABLE_OBJC_WEAK = NO;
473 | CODE_SIGN_IDENTITY = "";
474 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
475 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
476 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
477 | CURRENT_PROJECT_VERSION = 1;
478 | DEFINES_MODULE = YES;
479 | DYLIB_COMPATIBILITY_VERSION = 1;
480 | DYLIB_CURRENT_VERSION = 1;
481 | DYLIB_INSTALL_NAME_BASE = "@rpath";
482 | INFOPLIST_FILE = "Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample-Info.plist";
483 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
484 | IPHONEOS_DEPLOYMENT_TARGET = 13.4;
485 | LD_RUNPATH_SEARCH_PATHS = (
486 | "$(inherited)",
487 | "@executable_path/Frameworks",
488 | "@loader_path/Frameworks",
489 | );
490 | MACH_O_TYPE = staticlib;
491 | MODULEMAP_FILE = "Target Support Files/Pods-AMSlideMenuExample/Pods-AMSlideMenuExample.modulemap";
492 | OTHER_LDFLAGS = "";
493 | OTHER_LIBTOOLFLAGS = "";
494 | PODS_ROOT = "$(SRCROOT)";
495 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
496 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
497 | SDKROOT = iphoneos;
498 | SKIP_INSTALL = YES;
499 | TARGETED_DEVICE_FAMILY = "1,2";
500 | VERSIONING_SYSTEM = "apple-generic";
501 | VERSION_INFO_PREFIX = "";
502 | };
503 | name = Debug;
504 | };
505 | 6C61D818ACD3C2C116FED6A9C67E91B4 /* Debug */ = {
506 | isa = XCBuildConfiguration;
507 | buildSettings = {
508 | ALWAYS_SEARCH_USER_PATHS = NO;
509 | CLANG_ANALYZER_NONNULL = YES;
510 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
511 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
512 | CLANG_CXX_LIBRARY = "libc++";
513 | CLANG_ENABLE_MODULES = YES;
514 | CLANG_ENABLE_OBJC_ARC = YES;
515 | CLANG_ENABLE_OBJC_WEAK = YES;
516 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
517 | CLANG_WARN_BOOL_CONVERSION = YES;
518 | CLANG_WARN_COMMA = YES;
519 | CLANG_WARN_CONSTANT_CONVERSION = YES;
520 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
521 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
522 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
523 | CLANG_WARN_EMPTY_BODY = YES;
524 | CLANG_WARN_ENUM_CONVERSION = YES;
525 | CLANG_WARN_INFINITE_RECURSION = YES;
526 | CLANG_WARN_INT_CONVERSION = YES;
527 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
528 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
529 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
530 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
531 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
532 | CLANG_WARN_STRICT_PROTOTYPES = YES;
533 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
534 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
535 | CLANG_WARN_UNREACHABLE_CODE = YES;
536 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
537 | COPY_PHASE_STRIP = NO;
538 | DEBUG_INFORMATION_FORMAT = dwarf;
539 | ENABLE_STRICT_OBJC_MSGSEND = YES;
540 | ENABLE_TESTABILITY = YES;
541 | GCC_C_LANGUAGE_STANDARD = gnu11;
542 | GCC_DYNAMIC_NO_PIC = NO;
543 | GCC_NO_COMMON_BLOCKS = YES;
544 | GCC_OPTIMIZATION_LEVEL = 0;
545 | GCC_PREPROCESSOR_DEFINITIONS = (
546 | "POD_CONFIGURATION_DEBUG=1",
547 | "DEBUG=1",
548 | "$(inherited)",
549 | );
550 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
551 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
552 | GCC_WARN_UNDECLARED_SELECTOR = YES;
553 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
554 | GCC_WARN_UNUSED_FUNCTION = YES;
555 | GCC_WARN_UNUSED_VARIABLE = YES;
556 | IPHONEOS_DEPLOYMENT_TARGET = 13.4;
557 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
558 | MTL_FAST_MATH = YES;
559 | ONLY_ACTIVE_ARCH = YES;
560 | PRODUCT_NAME = "$(TARGET_NAME)";
561 | STRIP_INSTALLED_PRODUCT = NO;
562 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
563 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
564 | SWIFT_VERSION = 5.0;
565 | SYMROOT = "${SRCROOT}/../build";
566 | };
567 | name = Debug;
568 | };
569 | 7DC5F11AFBEAE473E8D3C24A2D11338D /* Release */ = {
570 | isa = XCBuildConfiguration;
571 | buildSettings = {
572 | ALWAYS_SEARCH_USER_PATHS = NO;
573 | CLANG_ANALYZER_NONNULL = YES;
574 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
575 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
576 | CLANG_CXX_LIBRARY = "libc++";
577 | CLANG_ENABLE_MODULES = YES;
578 | CLANG_ENABLE_OBJC_ARC = YES;
579 | CLANG_ENABLE_OBJC_WEAK = YES;
580 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
581 | CLANG_WARN_BOOL_CONVERSION = YES;
582 | CLANG_WARN_COMMA = YES;
583 | CLANG_WARN_CONSTANT_CONVERSION = YES;
584 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
585 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
586 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
587 | CLANG_WARN_EMPTY_BODY = YES;
588 | CLANG_WARN_ENUM_CONVERSION = YES;
589 | CLANG_WARN_INFINITE_RECURSION = YES;
590 | CLANG_WARN_INT_CONVERSION = YES;
591 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
592 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
593 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
594 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
595 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
596 | CLANG_WARN_STRICT_PROTOTYPES = YES;
597 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
598 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
599 | CLANG_WARN_UNREACHABLE_CODE = YES;
600 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
601 | COPY_PHASE_STRIP = NO;
602 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
603 | ENABLE_NS_ASSERTIONS = NO;
604 | ENABLE_STRICT_OBJC_MSGSEND = YES;
605 | GCC_C_LANGUAGE_STANDARD = gnu11;
606 | GCC_NO_COMMON_BLOCKS = YES;
607 | GCC_PREPROCESSOR_DEFINITIONS = (
608 | "POD_CONFIGURATION_RELEASE=1",
609 | "$(inherited)",
610 | );
611 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
612 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
613 | GCC_WARN_UNDECLARED_SELECTOR = YES;
614 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
615 | GCC_WARN_UNUSED_FUNCTION = YES;
616 | GCC_WARN_UNUSED_VARIABLE = YES;
617 | IPHONEOS_DEPLOYMENT_TARGET = 13.4;
618 | MTL_ENABLE_DEBUG_INFO = NO;
619 | MTL_FAST_MATH = YES;
620 | PRODUCT_NAME = "$(TARGET_NAME)";
621 | STRIP_INSTALLED_PRODUCT = NO;
622 | SWIFT_COMPILATION_MODE = wholemodule;
623 | SWIFT_OPTIMIZATION_LEVEL = "-O";
624 | SWIFT_VERSION = 5.0;
625 | SYMROOT = "${SRCROOT}/../build";
626 | };
627 | name = Release;
628 | };
629 | BAE44C7386B0F327C0155828DB37627F /* Release */ = {
630 | isa = XCBuildConfiguration;
631 | baseConfigurationReference = A371AD296239A0AECFDA73A36F59D398 /* AMSlideMenu.release.xcconfig */;
632 | buildSettings = {
633 | CLANG_ENABLE_OBJC_WEAK = NO;
634 | CODE_SIGN_IDENTITY = "";
635 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
636 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
637 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
638 | CURRENT_PROJECT_VERSION = 1;
639 | DEFINES_MODULE = YES;
640 | DYLIB_COMPATIBILITY_VERSION = 1;
641 | DYLIB_CURRENT_VERSION = 1;
642 | DYLIB_INSTALL_NAME_BASE = "@rpath";
643 | GCC_PREFIX_HEADER = "Target Support Files/AMSlideMenu/AMSlideMenu-prefix.pch";
644 | INFOPLIST_FILE = "Target Support Files/AMSlideMenu/AMSlideMenu-Info.plist";
645 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
646 | IPHONEOS_DEPLOYMENT_TARGET = 10.0;
647 | LD_RUNPATH_SEARCH_PATHS = (
648 | "$(inherited)",
649 | "@executable_path/Frameworks",
650 | "@loader_path/Frameworks",
651 | );
652 | MODULEMAP_FILE = "Target Support Files/AMSlideMenu/AMSlideMenu.modulemap";
653 | PRODUCT_MODULE_NAME = AMSlideMenu;
654 | PRODUCT_NAME = AMSlideMenu;
655 | SDKROOT = iphoneos;
656 | SKIP_INSTALL = YES;
657 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
658 | SWIFT_VERSION = 5.1;
659 | TARGETED_DEVICE_FAMILY = "1,2";
660 | VALIDATE_PRODUCT = YES;
661 | VERSIONING_SYSTEM = "apple-generic";
662 | VERSION_INFO_PREFIX = "";
663 | };
664 | name = Release;
665 | };
666 | E900D441B7EC98EAFF4200C526E170A4 /* Debug */ = {
667 | isa = XCBuildConfiguration;
668 | baseConfigurationReference = DA09FFA9DB4DC52D5BEF0789C5105564 /* AMSlideMenu.debug.xcconfig */;
669 | buildSettings = {
670 | CLANG_ENABLE_OBJC_WEAK = NO;
671 | CODE_SIGN_IDENTITY = "";
672 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
673 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
674 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
675 | CURRENT_PROJECT_VERSION = 1;
676 | DEFINES_MODULE = YES;
677 | DYLIB_COMPATIBILITY_VERSION = 1;
678 | DYLIB_CURRENT_VERSION = 1;
679 | DYLIB_INSTALL_NAME_BASE = "@rpath";
680 | GCC_PREFIX_HEADER = "Target Support Files/AMSlideMenu/AMSlideMenu-prefix.pch";
681 | INFOPLIST_FILE = "Target Support Files/AMSlideMenu/AMSlideMenu-Info.plist";
682 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
683 | IPHONEOS_DEPLOYMENT_TARGET = 10.0;
684 | LD_RUNPATH_SEARCH_PATHS = (
685 | "$(inherited)",
686 | "@executable_path/Frameworks",
687 | "@loader_path/Frameworks",
688 | );
689 | MODULEMAP_FILE = "Target Support Files/AMSlideMenu/AMSlideMenu.modulemap";
690 | PRODUCT_MODULE_NAME = AMSlideMenu;
691 | PRODUCT_NAME = AMSlideMenu;
692 | SDKROOT = iphoneos;
693 | SKIP_INSTALL = YES;
694 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
695 | SWIFT_VERSION = 5.1;
696 | TARGETED_DEVICE_FAMILY = "1,2";
697 | VERSIONING_SYSTEM = "apple-generic";
698 | VERSION_INFO_PREFIX = "";
699 | };
700 | name = Debug;
701 | };
702 | /* End XCBuildConfiguration section */
703 |
704 | /* Begin XCConfigurationList section */
705 | 0062B62CBD1B91C9ECF27C5E46A99C24 /* Build configuration list for PBXNativeTarget "Pods-AMSlideMenuExample" */ = {
706 | isa = XCConfigurationList;
707 | buildConfigurations = (
708 | 4AADD14F937156BCF89CD485F4694F8D /* Debug */,
709 | 49FDD9975C00A6B99639F0C32CAF6C8D /* Release */,
710 | );
711 | defaultConfigurationIsVisible = 0;
712 | defaultConfigurationName = Release;
713 | };
714 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
715 | isa = XCConfigurationList;
716 | buildConfigurations = (
717 | 6C61D818ACD3C2C116FED6A9C67E91B4 /* Debug */,
718 | 7DC5F11AFBEAE473E8D3C24A2D11338D /* Release */,
719 | );
720 | defaultConfigurationIsVisible = 0;
721 | defaultConfigurationName = Release;
722 | };
723 | 847C2CDDDBB7C5042AB66A299BD0462A /* Build configuration list for PBXNativeTarget "AMSlideMenu" */ = {
724 | isa = XCConfigurationList;
725 | buildConfigurations = (
726 | E900D441B7EC98EAFF4200C526E170A4 /* Debug */,
727 | BAE44C7386B0F327C0155828DB37627F /* Release */,
728 | );
729 | defaultConfigurationIsVisible = 0;
730 | defaultConfigurationName = Release;
731 | };
732 | /* End XCConfigurationList section */
733 | };
734 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */;
735 | }
736 |
--------------------------------------------------------------------------------