├── .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 | [![Video Tutorial](https://raw.github.com/arturdev/AMSlideMenu/master/AMSlideMenuDemo-with%20Storyboard/AMSlideMenu/youtube.png)](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 | --------------------------------------------------------------------------------