├── .gitattributes ├── .gitignore ├── .swift-version ├── .swiftlint.yml ├── .travis.yml ├── Brewfile ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Gemfile ├── LICENSE ├── Podfile ├── Podfile.lock ├── README.md ├── Samples ├── SideNavigationControllerSample-iOS │ ├── SideNavigationControllerSample-iOS.xcodeproj │ │ ├── project.pbxproj │ │ └── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ └── SideNavigationControllerSample-iOS │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ │ ├── ChildViewController.swift │ │ ├── ChildViewController.xib │ │ ├── Info.plist │ │ ├── LeftViewController.swift │ │ ├── LeftViewController.xib │ │ ├── RightViewController.swift │ │ ├── RightViewController.xib │ │ ├── ViewController.swift │ │ └── ViewController.xib └── SideNavigationControllerSample-tvOS │ ├── SideNavigationControllerSample-tvOS.xcodeproj │ └── project.pbxproj │ └── SideNavigationControllerSample-tvOS │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── App Icon & Top Shelf Image.brandassets │ │ ├── App Icon - Large.imagestack │ │ │ ├── Back.imagestacklayer │ │ │ │ ├── Content.imageset │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── Front.imagestacklayer │ │ │ │ ├── Content.imageset │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ └── Middle.imagestacklayer │ │ │ │ ├── Content.imageset │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ ├── App Icon - Small.imagestack │ │ │ ├── Back.imagestacklayer │ │ │ │ ├── Content.imageset │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── Front.imagestacklayer │ │ │ │ ├── Content.imageset │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ └── Middle.imagestacklayer │ │ │ │ ├── Content.imageset │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Top Shelf Image Wide.imageset │ │ │ └── Contents.json │ │ └── Top Shelf Image.imageset │ │ │ └── Contents.json │ ├── Contents.json │ └── LaunchImage.launchimage │ │ └── Contents.json │ ├── Info.plist │ ├── LeftViewController.swift │ ├── LeftViewController.xib │ ├── RightViewController.swift │ ├── RightViewController.xib │ ├── ViewController.swift │ └── ViewController.xib ├── Screenshots ├── ios_capture.gif └── tvos_capture.gif ├── SideNavigationController.podspec ├── SideNavigationController.xcodeproj ├── project.pbxproj └── xcshareddata │ └── xcschemes │ ├── SideNavigationController-iOS.xcscheme │ └── SideNavigationController-tvOS.xcscheme ├── SideNavigationController.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── Sources ├── Info.plist ├── SideNavigationController+NestedTypes.swift ├── SideNavigationController.h ├── SideNavigationController.swift └── UIViewController+SideNavigationController.swift ├── Tests ├── Info.plist └── SideNavigationControllerTests │ └── SideNavigationControllerTests.swift └── fastlane ├── Appfile ├── Fastfile └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | fastlane/* linguist-vendored 2 | *.rb linguist-vendored 3 | Podfile* linguist-vendored 4 | Gemfile* linguist-vendored 5 | Brewfile* linguist-vendored 6 | *.podspec linguist-vendored 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xcuserstate 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | *.ipa 27 | *.dSYM.zip 28 | *.dSYM 29 | 30 | ## Playgrounds 31 | timeline.xctimeline 32 | playground.xcworkspace 33 | 34 | # Swift Package Manager 35 | # 36 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 37 | # Packages/ 38 | .build/ 39 | 40 | # CocoaPods 41 | # 42 | # We recommend against adding the Pods directory to your .gitignore. However 43 | # you should judge for yourself, the pros and cons are mentioned at: 44 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 45 | # 46 | Pods/ 47 | 48 | # Carthage 49 | # 50 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 51 | # Carthage/Checkouts 52 | 53 | Carthage/Build 54 | 55 | # fastlane 56 | # 57 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 58 | # screenshots whenever they are needed. 59 | # For more information about the recommended setup visit: 60 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 61 | 62 | fastlane/report.xml 63 | fastlane/Preview.html 64 | fastlane/screenshots 65 | fastlane/test_output 66 | fastlane/xcov_report 67 | 68 | ## Ruby specific 69 | # for a library or gem, you might want to ignore these files since the code is 70 | # intended to run in multiple environments; otherwise, check them in: 71 | Gemfile.lock 72 | 73 | # Environment normalization: 74 | /.bundle/ 75 | /vendor/bundle 76 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 5.0 2 | -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | line_length: 200 2 | file_length: 600 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | osx_image: xcode10.2 2 | language: objective-c 3 | cache: 4 | - bundler 5 | - cocoapods 6 | branches: 7 | only: 8 | - develop 9 | - master 10 | notifications: 11 | email: false 12 | before_install: 13 | - gem install bundler 14 | - brew update 15 | - bundle install && brew bundle 16 | install: bundle exec pod install --repo-update --silent 17 | script: bundle exec fastlane tests 18 | after_success: bundle exec fastlane ci_framework_deploy 19 | -------------------------------------------------------------------------------- /Brewfile: -------------------------------------------------------------------------------- 1 | brew 'swiftlint' 2 | brew 'git-flow' 3 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | `side-navigation-controller` adheres to [Semantic Versioning](http://semver.org/). 5 | --- 6 | 7 | ## [2.0.1](https://github.com/Digipolitan/side-navigation/releases/tag/v2.0.1) 8 | 9 | add new needsUpdate iOS11 && tvOS11 10 | 11 | --- 12 | 13 | ## [2.0.0](https://github.com/Digipolitan/side-navigation/releases/tag/v2.0.0) 14 | 15 | swift 5.0 support & renaming side-navigation-controller 16 | 17 | --- 18 | 19 | ## [1.0.1](https://github.com/Digipolitan/side-navigation-controller/releases/tag/v1.0.1) 20 | 21 | move the addChildViewController to call viewWillAppear with the side set 22 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [contact@digipolitan.com](mailto:contact@digipolitan.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to side-navigation-controller 2 | 3 | First off, thanks for taking the time to contribute! :tada::+1: 4 | 5 | The following is a set of guidelines for contributing to Digipolitan and its packages, which are hosted in the [Digipolitan Organization](https://github.com/digipolitan) on GitHub. 6 | These are just guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. 7 | 8 | #### Table Of Contents 9 | 10 | [What should I know before I get started?](#what-should-i-know-before-i-get-started) 11 | * [Code of Conduct](#code-of-conduct) 12 | 13 | [How Can I Contribute?](#how-can-i-contribute) 14 | * [Reporting Bugs](#reporting-bugs) 15 | 16 | ## What should I know before I get started? 17 | 18 | ### Code of Conduct 19 | 20 | This project adheres to the Contributor Covenant [code of conduct](CODE_OF_CONDUCT.md). 21 | By participating, you are expected to uphold this code. 22 | Please report unacceptable behavior to [contact@digipolitan.com](mailto:contact@digipolitan.com). 23 | 24 | ### Reporting Bugs 25 | 26 | This section guides you through submitting a bug report for Digipolitan. Following these guidelines helps maintainers and the community understand your report :pencil:, reproduce the behavior :computer: :computer:, and find related reports :mag_right:. 27 | 28 | Before creating bug reports, please check [this list](#before-submitting-a-bug-report) as you might find out that you don't need to create one. When you are creating a bug report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). If you'd like, you can use [this template](#template-for-submitting-bug-reports) to structure the information. 29 | 30 | #### Before Submitting A Bug Report 31 | 32 | * **Perform a [search](https://github.com/issues?q=+is%3Aissue+user%3Adigipolitan)** to see if the problem has already been reported. If it has, add a comment to the existing issue instead of opening a new one. 33 | 34 | #### How Do I Submit A (Good) Bug Report? 35 | 36 | Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). After you've determined 37 | 38 | Explain the problem and include additional details to help maintainers reproduce the problem: 39 | 40 | * **Use a clear and descriptive title** for the issue to identify the problem. 41 | * **Describe the exact steps which reproduce the problem** in as many details as possible. 42 | * **Provide specific examples to demonstrate the steps**. Include links to files or GitHub projects, or copy/pasteable snippets, which you use in those examples. If you're providing snippets in the issue, use [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines). 43 | * **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior. 44 | * **Explain which behavior you expected to see instead and why.** 45 | * **Include screenshots and animated GIFs** which show you following the described steps and clearly demonstrate the problem. 46 | * **If you're reporting that side-navigation-swift crashed**, include a crash report with a stack trace from the operating system. On iOS, the crash report is available in Xcode, on macOS, the crash report will be available in `Console.app` under "Diagnostic and usage information" > "User diagnostic reports". Include the crash report in the issue in a [code block](https://help.github.com/articles/markdown-basics/#multiple-lines), a [file attachment](https://help.github.com/articles/file-attachments-on-issues-and-pull-requests/), or put it in a [gist](https://gist.github.com/) and provide link to that gist. 47 | * **If the problem is related to performance**, include a CPU profile capture and a screenshot with your report. 48 | * **If the problem wasn't triggered by a specific action**, describe what you were doing before the problem happened and share more information using the guidelines below. 49 | 50 | Provide more context by answering these questions: 51 | 52 | * **Did the problem start happening recently** (e.g. after updating to a new version of side-navigation-swift) or was this always a problem? 53 | * If the problem started happening recently, **can you reproduce the problem in an older version of side-navigation-swift ?** What's the most recent version in which the problem doesn't happen? You can download older versions of side-navigation-swift from [the releases page](https://github.com/digipolitan/side-navigation-swift/releases). 54 | * **Can you reliably reproduce the issue?** If not, provide details about how often the problem happens and under which conditions it normally happens. 55 | 56 | Include details about your configuration and environment: 57 | 58 | * **Which version of side-navigation-swift are you using? 59 | * **What's the name and version of the macOS or iOS you're using**? 60 | 61 | #### Template For Submitting Bug Reports 62 | 63 | [Short description of problem here] 64 | 65 | **Reproduction Steps:** 66 | 67 | 1. [First Step] 68 | 2. [Second Step] 69 | 3. [Other Steps...] 70 | 71 | **Expected behavior:** 72 | 73 | [Describe expected behavior here] 74 | 75 | **Observed behavior:** 76 | 77 | [Describe observed behavior here] 78 | 79 | **Screenshots and GIFs** 80 | 81 | ![Screenshots and GIFs which follow reproduction steps to demonstrate the problem](url) 82 | 83 | **side-navigation-swift version:** [Enter side-navigation-swift version here] 84 | **OS and version:** [Enter macOS / iOS / linux name and version here] 85 | 86 | **Installed packages:** 87 | 88 | [List of installed packages here] 89 | 90 | **Additional information:** 91 | 92 | * Problem started happening recently, didn't happen in an older version of side-navigation-swift: [Yes/No] 93 | * Problem can be reliably reproduced, doesn't happen randomly: [Yes/No] 94 | * Problem happens with all files and projects, not only some files or projects: [Yes/No] 95 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "cocoapods" 4 | gem "fastlane" 5 | gem 'digipolitan-apps-tools' 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2019, Digipolitan 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | workspace 'SideNavigationController.xcworkspace' 2 | 3 | ## Frameworks targets 4 | abstract_target 'Frameworks' do 5 | use_frameworks! 6 | target 'SideNavigationController-iOS' do 7 | platform :ios, '9.0' 8 | end 9 | 10 | target 'SideNavigationController-tvOS' do 11 | platform :tvos, '9.0' 12 | end 13 | end 14 | 15 | ## Tests targets 16 | abstract_target 'Tests' do 17 | use_frameworks! 18 | target 'SideNavigationControllerTests-iOS' do 19 | platform :ios, '8.0' 20 | end 21 | 22 | target 'SideNavigationControllerTests-tvOS' do 23 | platform :tvos, '9.0' 24 | end 25 | end 26 | 27 | ## Samples targets 28 | abstract_target 'Samples' do 29 | use_frameworks! 30 | target 'SideNavigationControllerSample-iOS' do 31 | project 'Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS' 32 | platform :ios, '8.0' 33 | end 34 | 35 | target 'SideNavigationControllerSample-tvOS' do 36 | project 'Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS' 37 | platform :tvos, '9.0' 38 | end 39 | end 40 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODFILE CHECKSUM: e6fb4f0774793c8c0cb0d53cb6140d46f84d99f5 2 | 3 | COCOAPODS: 1.7.1 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | SideNavigationController 2 | ================================= 3 | 4 | [![Swift Version](https://img.shields.io/badge/swift-5.0-orange.svg?style=flat)](https://developer.apple.com/swift/) 5 | [![Build Status](https://travis-ci.org/Digipolitan/side-navigation-controller.svg?branch=master)](https://travis-ci.org/Digipolitan/side-navigation-controller) 6 | [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/SideNavigationController.svg)](https://img.shields.io/cocoapods/v/SideNavigationController.svg) 7 | [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 8 | [![Platform](https://img.shields.io/cocoapods/p/SideNavigationController.svg?style=flat)](http://cocoadocs.org/docsets/SideNavigationController) 9 | [![Twitter](https://img.shields.io/badge/twitter-@Digipolitan-blue.svg?style=flat)](http://twitter.com/Digipolitan) 10 | 11 | Side navigation controller written in swift. 12 | 13 | ### Demo iOS 14 | 15 | ![Demo iOS](https://github.com/Digipolitan/side-navigation-controller/blob/develop/Screenshots/ios_capture.gif?raw=true "Demo iOS") 16 | 17 | ### Demo tvOS 18 | 19 | ![Demo tvOS](https://github.com/Digipolitan/side-navigation-controller/blob/develop/Screenshots/tvos_capture.gif?raw=true "Demo tvOS") 20 | 21 | ## Getting Started 22 | 23 | These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system. 24 | 25 | ### Prerequisites 26 | 27 | Works with iOS 9+, tested on Xcode 8.2 28 | 29 | ### Installing 30 | 31 | To install the `SideNavigationController` using **cocoapods** 32 | 33 | - Add an entry in your Podfile 34 | 35 | ``` 36 | # Uncomment this line to define a global platform for your project 37 | platform :ios, '9.0' 38 | 39 | target 'YourTarget' do 40 | frameworks 41 | use_frameworks! 42 | 43 | # Pods for YourTarget 44 | pod 'SideNavigationController' 45 | end 46 | ``` 47 | 48 | - Then install the dependency with the `pod install` command. 49 | 50 | ## Usage 51 | 52 | How to register the side navigation 53 | 54 | ```swift 55 | let sideNavigationController = SideNavigationController(mainViewController: UINavigationController(rootViewController: ViewController())) 56 | sideNavigationController.rightSide(viewController: RightViewController()) 57 | window.rootViewController = sideNavigationController 58 | self.window = window 59 | ``` 60 | 61 | ### Configuration 62 | 63 | You can customize the side by passing options: 64 | 65 | ```swift 66 | let options = SideNavigationController.Options(widthPercent: 0.5, 67 | scale: 0.9, 68 | position: .front) 69 | sideNavigationController.rightSide(viewController: RightViewController(), 70 | options: options) 71 | ``` 72 | 73 | Here the list of all available options : 74 | 75 | | Property | type | Description | Default | 76 | | --- | --- | --- | --- | 77 | | widthPercent | `CGFloat` | Size of the side view controller [0-1] | 0.33 | 78 | | animationDuration | `TimeInterval` | How long the animation will last | 0.3 | 79 | | overlayColor | `UIColor` | The overlay color | white | 80 | | overlayOpacity | `CGFloat` | Opacity of the overlay [0-1] | 0.5 | 81 | | shadowColor | `UIColor` | Shadow color around the main or the side view controller | white | 82 | | shadowOpacity | `CGFloat` | Opacity of the shadow [0-1] | 0.8 | 83 | | alwaysInteractionEnabled | `Bool` | Sets to true allows always user interaction on the main view controller | false | 84 | | panningEnabled | `Bool` | Allows panning to display and hide sides | true | 85 | | scale | `CGFloat` | Transform the scale of main view controller during the animation [0-2] | 1 | 86 | | position | `SideNavigationController.Position` | The position of the side, such as below or above the main view controller | back | 87 | 88 | ## Built With 89 | 90 | [Fastlane](https://fastlane.tools/) 91 | Fastlane is a tool for iOS, Mac, and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application. 92 | 93 | ## Contributing 94 | 95 | See [CONTRIBUTING.md](CONTRIBUTING.md) for more details! 96 | 97 | This project adheres to the [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md). 98 | By participating, you are expected to uphold this code. Please report 99 | unacceptable behavior to [contact@digipolitan.com](mailto:contact@digipolitan.com). 100 | 101 | ## License 102 | 103 | SideNavigationController is licensed under the [BSD 3-Clause license](LICENSE). 104 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4BC6868BA8832E8A083E9ECE /* Pods_Samples_SideNavigationControllerSample_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8971F06C0506E7C4223846C3 /* Pods_Samples_SideNavigationControllerSample_iOS.framework */; }; 11 | A30D63F21E0D717E00A3CE45 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30D63F11E0D717E00A3CE45 /* AppDelegate.swift */; }; 12 | A30D63F91E0D717E00A3CE45 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A30D63F81E0D717E00A3CE45 /* Assets.xcassets */; }; 13 | A30D63FC1E0D717E00A3CE45 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A30D63FA1E0D717E00A3CE45 /* LaunchScreen.storyboard */; }; 14 | A30D640A1E0D71CB00A3CE45 /* SideNavigationController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A30D64091E0D71CB00A3CE45 /* SideNavigationController.framework */; }; 15 | A30D640B1E0D71CB00A3CE45 /* SideNavigationController.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A30D64091E0D71CB00A3CE45 /* SideNavigationController.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 16 | A30D640F1E0D73B300A3CE45 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30D640D1E0D73B300A3CE45 /* ViewController.swift */; }; 17 | A30D64101E0D73B300A3CE45 /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A30D640E1E0D73B300A3CE45 /* ViewController.xib */; }; 18 | A3A0AEBE1E622F0C00F2D9B6 /* LeftViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3A0AEBC1E622F0C00F2D9B6 /* LeftViewController.swift */; }; 19 | A3A0AEBF1E622F0C00F2D9B6 /* LeftViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A3A0AEBD1E622F0C00F2D9B6 /* LeftViewController.xib */; }; 20 | A3F597301E76D96E001F230F /* RightViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3F5972E1E76D96E001F230F /* RightViewController.swift */; }; 21 | A3F597311E76D96E001F230F /* RightViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A3F5972F1E76D96E001F230F /* RightViewController.xib */; }; 22 | A3F597341E76E23E001F230F /* ChildViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3F597321E76E23E001F230F /* ChildViewController.swift */; }; 23 | A3F597351E76E23E001F230F /* ChildViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A3F597331E76E23E001F230F /* ChildViewController.xib */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXCopyFilesBuildPhase section */ 27 | A30D640C1E0D71CB00A3CE45 /* Embed Frameworks */ = { 28 | isa = PBXCopyFilesBuildPhase; 29 | buildActionMask = 2147483647; 30 | dstPath = ""; 31 | dstSubfolderSpec = 10; 32 | files = ( 33 | A30D640B1E0D71CB00A3CE45 /* SideNavigationController.framework in Embed Frameworks */, 34 | ); 35 | name = "Embed Frameworks"; 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXCopyFilesBuildPhase section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | 41547DC2F02F11F432F03CBF /* Pods-SideNavigationControllerSample-SideNavigationControllerSample-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideNavigationControllerSample-SideNavigationControllerSample-iOS.release.xcconfig"; path = "../../Pods/Target Support Files/Pods-SideNavigationControllerSample-SideNavigationControllerSample-iOS/Pods-SideNavigationControllerSample-SideNavigationControllerSample-iOS.release.xcconfig"; sourceTree = ""; }; 42 | 437CB24F88DE489FD8141488 /* Pods-Samples-SideNavigationControllerSample-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Samples-SideNavigationControllerSample-iOS.release.xcconfig"; path = "../../Pods/Target Support Files/Pods-Samples-SideNavigationControllerSample-iOS/Pods-Samples-SideNavigationControllerSample-iOS.release.xcconfig"; sourceTree = ""; }; 43 | 444C2E3A94BE72ECE95421F5 /* Pods-Samples-SideNavigationControllerSample-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Samples-SideNavigationControllerSample-iOS.debug.xcconfig"; path = "../../Pods/Target Support Files/Pods-Samples-SideNavigationControllerSample-iOS/Pods-Samples-SideNavigationControllerSample-iOS.debug.xcconfig"; sourceTree = ""; }; 44 | 465646586A414E17162D185D /* Pods-SideNavigationControllerSample-SideNavigationControllerSample-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideNavigationControllerSample-SideNavigationControllerSample-iOS.debug.xcconfig"; path = "../../Pods/Target Support Files/Pods-SideNavigationControllerSample-SideNavigationControllerSample-iOS/Pods-SideNavigationControllerSample-SideNavigationControllerSample-iOS.debug.xcconfig"; sourceTree = ""; }; 45 | 846FE99F4361DD69C14E72CB /* Pods_SideNavigationControllerSample_SideNavigationControllerSample_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SideNavigationControllerSample_SideNavigationControllerSample_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 8971F06C0506E7C4223846C3 /* Pods_Samples_SideNavigationControllerSample_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Samples_SideNavigationControllerSample_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 47 | A30D63EE1E0D717E00A3CE45 /* SideNavigationControllerSample-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SideNavigationControllerSample-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | A30D63F11E0D717E00A3CE45 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 49 | A30D63F81E0D717E00A3CE45 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 50 | A30D63FB1E0D717E00A3CE45 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 51 | A30D63FD1E0D717E00A3CE45 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 52 | A30D64091E0D71CB00A3CE45 /* SideNavigationController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SideNavigationController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | A30D640D1E0D73B300A3CE45 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 54 | A30D640E1E0D73B300A3CE45 /* ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewController.xib; sourceTree = ""; }; 55 | A3A0AEBC1E622F0C00F2D9B6 /* LeftViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LeftViewController.swift; sourceTree = ""; }; 56 | A3A0AEBD1E622F0C00F2D9B6 /* LeftViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LeftViewController.xib; sourceTree = ""; }; 57 | A3F5972E1E76D96E001F230F /* RightViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RightViewController.swift; sourceTree = ""; }; 58 | A3F5972F1E76D96E001F230F /* RightViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RightViewController.xib; sourceTree = ""; }; 59 | A3F597321E76E23E001F230F /* ChildViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChildViewController.swift; sourceTree = ""; }; 60 | A3F597331E76E23E001F230F /* ChildViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ChildViewController.xib; sourceTree = ""; }; 61 | /* End PBXFileReference section */ 62 | 63 | /* Begin PBXFrameworksBuildPhase section */ 64 | A30D63EB1E0D717E00A3CE45 /* Frameworks */ = { 65 | isa = PBXFrameworksBuildPhase; 66 | buildActionMask = 2147483647; 67 | files = ( 68 | A30D640A1E0D71CB00A3CE45 /* SideNavigationController.framework in Frameworks */, 69 | 4BC6868BA8832E8A083E9ECE /* Pods_Samples_SideNavigationControllerSample_iOS.framework in Frameworks */, 70 | ); 71 | runOnlyForDeploymentPostprocessing = 0; 72 | }; 73 | /* End PBXFrameworksBuildPhase section */ 74 | 75 | /* Begin PBXGroup section */ 76 | A30D63E51E0D717E00A3CE45 = { 77 | isa = PBXGroup; 78 | children = ( 79 | A30D63F01E0D717E00A3CE45 /* SideNavigationControllerSample-iOS */, 80 | A30D64111E0D745C00A3CE45 /* Frameworks */, 81 | A30D63EF1E0D717E00A3CE45 /* Products */, 82 | B8FF5AA30A09A2E69BAC9EB0 /* Pods */, 83 | ); 84 | sourceTree = ""; 85 | }; 86 | A30D63EF1E0D717E00A3CE45 /* Products */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | A30D63EE1E0D717E00A3CE45 /* SideNavigationControllerSample-iOS.app */, 90 | ); 91 | name = Products; 92 | sourceTree = ""; 93 | }; 94 | A30D63F01E0D717E00A3CE45 /* SideNavigationControllerSample-iOS */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | A30D63F11E0D717E00A3CE45 /* AppDelegate.swift */, 98 | A30D640D1E0D73B300A3CE45 /* ViewController.swift */, 99 | A30D640E1E0D73B300A3CE45 /* ViewController.xib */, 100 | A3A0AEBC1E622F0C00F2D9B6 /* LeftViewController.swift */, 101 | A3A0AEBD1E622F0C00F2D9B6 /* LeftViewController.xib */, 102 | A3F5972E1E76D96E001F230F /* RightViewController.swift */, 103 | A3F5972F1E76D96E001F230F /* RightViewController.xib */, 104 | A3F597321E76E23E001F230F /* ChildViewController.swift */, 105 | A3F597331E76E23E001F230F /* ChildViewController.xib */, 106 | A30D63F81E0D717E00A3CE45 /* Assets.xcassets */, 107 | A30D63FA1E0D717E00A3CE45 /* LaunchScreen.storyboard */, 108 | A30D63FD1E0D717E00A3CE45 /* Info.plist */, 109 | ); 110 | path = "SideNavigationControllerSample-iOS"; 111 | sourceTree = ""; 112 | }; 113 | A30D64111E0D745C00A3CE45 /* Frameworks */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | A30D64091E0D71CB00A3CE45 /* SideNavigationController.framework */, 117 | 846FE99F4361DD69C14E72CB /* Pods_SideNavigationControllerSample_SideNavigationControllerSample_iOS.framework */, 118 | 8971F06C0506E7C4223846C3 /* Pods_Samples_SideNavigationControllerSample_iOS.framework */, 119 | ); 120 | name = Frameworks; 121 | sourceTree = ""; 122 | }; 123 | B8FF5AA30A09A2E69BAC9EB0 /* Pods */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 465646586A414E17162D185D /* Pods-SideNavigationControllerSample-SideNavigationControllerSample-iOS.debug.xcconfig */, 127 | 41547DC2F02F11F432F03CBF /* Pods-SideNavigationControllerSample-SideNavigationControllerSample-iOS.release.xcconfig */, 128 | 444C2E3A94BE72ECE95421F5 /* Pods-Samples-SideNavigationControllerSample-iOS.debug.xcconfig */, 129 | 437CB24F88DE489FD8141488 /* Pods-Samples-SideNavigationControllerSample-iOS.release.xcconfig */, 130 | ); 131 | name = Pods; 132 | sourceTree = ""; 133 | }; 134 | /* End PBXGroup section */ 135 | 136 | /* Begin PBXNativeTarget section */ 137 | A30D63ED1E0D717E00A3CE45 /* SideNavigationControllerSample-iOS */ = { 138 | isa = PBXNativeTarget; 139 | buildConfigurationList = A30D64001E0D717E00A3CE45 /* Build configuration list for PBXNativeTarget "SideNavigationControllerSample-iOS" */; 140 | buildPhases = ( 141 | 986B8F2F5A04B5574D6124D9 /* [CP] Check Pods Manifest.lock */, 142 | A30D63EA1E0D717E00A3CE45 /* Sources */, 143 | A30D63EB1E0D717E00A3CE45 /* Frameworks */, 144 | A30D63EC1E0D717E00A3CE45 /* Resources */, 145 | A30D640C1E0D71CB00A3CE45 /* Embed Frameworks */, 146 | ); 147 | buildRules = ( 148 | ); 149 | dependencies = ( 150 | ); 151 | name = "SideNavigationControllerSample-iOS"; 152 | productName = "SideNavigationControllerSample-iOS"; 153 | productReference = A30D63EE1E0D717E00A3CE45 /* SideNavigationControllerSample-iOS.app */; 154 | productType = "com.apple.product-type.application"; 155 | }; 156 | /* End PBXNativeTarget section */ 157 | 158 | /* Begin PBXProject section */ 159 | A30D63E61E0D717E00A3CE45 /* Project object */ = { 160 | isa = PBXProject; 161 | attributes = { 162 | LastSwiftUpdateCheck = 0820; 163 | LastUpgradeCheck = 1020; 164 | ORGANIZATIONNAME = Digipolitan; 165 | TargetAttributes = { 166 | A30D63ED1E0D717E00A3CE45 = { 167 | CreatedOnToolsVersion = 8.2.1; 168 | DevelopmentTeam = 582762VK3P; 169 | ProvisioningStyle = Automatic; 170 | }; 171 | }; 172 | }; 173 | buildConfigurationList = A30D63E91E0D717E00A3CE45 /* Build configuration list for PBXProject "SideNavigationControllerSample-iOS" */; 174 | compatibilityVersion = "Xcode 3.2"; 175 | developmentRegion = en; 176 | hasScannedForEncodings = 0; 177 | knownRegions = ( 178 | en, 179 | Base, 180 | ); 181 | mainGroup = A30D63E51E0D717E00A3CE45; 182 | productRefGroup = A30D63EF1E0D717E00A3CE45 /* Products */; 183 | projectDirPath = ""; 184 | projectRoot = ""; 185 | targets = ( 186 | A30D63ED1E0D717E00A3CE45 /* SideNavigationControllerSample-iOS */, 187 | ); 188 | }; 189 | /* End PBXProject section */ 190 | 191 | /* Begin PBXResourcesBuildPhase section */ 192 | A30D63EC1E0D717E00A3CE45 /* Resources */ = { 193 | isa = PBXResourcesBuildPhase; 194 | buildActionMask = 2147483647; 195 | files = ( 196 | A30D63FC1E0D717E00A3CE45 /* LaunchScreen.storyboard in Resources */, 197 | A3F597351E76E23E001F230F /* ChildViewController.xib in Resources */, 198 | A3F597311E76D96E001F230F /* RightViewController.xib in Resources */, 199 | A3A0AEBF1E622F0C00F2D9B6 /* LeftViewController.xib in Resources */, 200 | A30D64101E0D73B300A3CE45 /* ViewController.xib in Resources */, 201 | A30D63F91E0D717E00A3CE45 /* Assets.xcassets in Resources */, 202 | ); 203 | runOnlyForDeploymentPostprocessing = 0; 204 | }; 205 | /* End PBXResourcesBuildPhase section */ 206 | 207 | /* Begin PBXShellScriptBuildPhase section */ 208 | 986B8F2F5A04B5574D6124D9 /* [CP] Check Pods Manifest.lock */ = { 209 | isa = PBXShellScriptBuildPhase; 210 | buildActionMask = 2147483647; 211 | files = ( 212 | ); 213 | inputPaths = ( 214 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 215 | "${PODS_ROOT}/Manifest.lock", 216 | ); 217 | name = "[CP] Check Pods Manifest.lock"; 218 | outputPaths = ( 219 | "$(DERIVED_FILE_DIR)/Pods-Samples-SideNavigationControllerSample-iOS-checkManifestLockResult.txt", 220 | ); 221 | runOnlyForDeploymentPostprocessing = 0; 222 | shellPath = /bin/sh; 223 | 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"; 224 | showEnvVarsInLog = 0; 225 | }; 226 | /* End PBXShellScriptBuildPhase section */ 227 | 228 | /* Begin PBXSourcesBuildPhase section */ 229 | A30D63EA1E0D717E00A3CE45 /* Sources */ = { 230 | isa = PBXSourcesBuildPhase; 231 | buildActionMask = 2147483647; 232 | files = ( 233 | A3A0AEBE1E622F0C00F2D9B6 /* LeftViewController.swift in Sources */, 234 | A3F597341E76E23E001F230F /* ChildViewController.swift in Sources */, 235 | A3F597301E76D96E001F230F /* RightViewController.swift in Sources */, 236 | A30D640F1E0D73B300A3CE45 /* ViewController.swift in Sources */, 237 | A30D63F21E0D717E00A3CE45 /* AppDelegate.swift in Sources */, 238 | ); 239 | runOnlyForDeploymentPostprocessing = 0; 240 | }; 241 | /* End PBXSourcesBuildPhase section */ 242 | 243 | /* Begin PBXVariantGroup section */ 244 | A30D63FA1E0D717E00A3CE45 /* LaunchScreen.storyboard */ = { 245 | isa = PBXVariantGroup; 246 | children = ( 247 | A30D63FB1E0D717E00A3CE45 /* Base */, 248 | ); 249 | name = LaunchScreen.storyboard; 250 | sourceTree = ""; 251 | }; 252 | /* End PBXVariantGroup section */ 253 | 254 | /* Begin XCBuildConfiguration section */ 255 | A30D63FE1E0D717E00A3CE45 /* Debug */ = { 256 | isa = XCBuildConfiguration; 257 | buildSettings = { 258 | ALWAYS_SEARCH_USER_PATHS = NO; 259 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 260 | CLANG_ANALYZER_NONNULL = YES; 261 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 262 | CLANG_CXX_LIBRARY = "libc++"; 263 | CLANG_ENABLE_MODULES = YES; 264 | CLANG_ENABLE_OBJC_ARC = YES; 265 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 266 | CLANG_WARN_BOOL_CONVERSION = YES; 267 | CLANG_WARN_COMMA = YES; 268 | CLANG_WARN_CONSTANT_CONVERSION = YES; 269 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 270 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 271 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 272 | CLANG_WARN_EMPTY_BODY = YES; 273 | CLANG_WARN_ENUM_CONVERSION = YES; 274 | CLANG_WARN_INFINITE_RECURSION = YES; 275 | CLANG_WARN_INT_CONVERSION = YES; 276 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 277 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 278 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 279 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 280 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 281 | CLANG_WARN_STRICT_PROTOTYPES = YES; 282 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 283 | CLANG_WARN_UNREACHABLE_CODE = YES; 284 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 285 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 286 | COPY_PHASE_STRIP = NO; 287 | CURRENT_PROJECT_VERSION = 1; 288 | DEBUG_INFORMATION_FORMAT = dwarf; 289 | ENABLE_STRICT_OBJC_MSGSEND = YES; 290 | ENABLE_TESTABILITY = YES; 291 | GCC_C_LANGUAGE_STANDARD = gnu99; 292 | GCC_DYNAMIC_NO_PIC = NO; 293 | GCC_NO_COMMON_BLOCKS = YES; 294 | GCC_OPTIMIZATION_LEVEL = 0; 295 | GCC_PREPROCESSOR_DEFINITIONS = ( 296 | "DEBUG=1", 297 | "$(inherited)", 298 | ); 299 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 300 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 301 | GCC_WARN_UNDECLARED_SELECTOR = YES; 302 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 303 | GCC_WARN_UNUSED_FUNCTION = YES; 304 | GCC_WARN_UNUSED_VARIABLE = YES; 305 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 306 | MTL_ENABLE_DEBUG_INFO = YES; 307 | ONLY_ACTIVE_ARCH = YES; 308 | SDKROOT = iphoneos; 309 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 310 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 311 | SWIFT_VERSION = 5.0; 312 | VERSIONING_SYSTEM = "apple-generic"; 313 | }; 314 | name = Debug; 315 | }; 316 | A30D63FF1E0D717E00A3CE45 /* Release */ = { 317 | isa = XCBuildConfiguration; 318 | buildSettings = { 319 | ALWAYS_SEARCH_USER_PATHS = NO; 320 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 321 | CLANG_ANALYZER_NONNULL = YES; 322 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 323 | CLANG_CXX_LIBRARY = "libc++"; 324 | CLANG_ENABLE_MODULES = YES; 325 | CLANG_ENABLE_OBJC_ARC = YES; 326 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 327 | CLANG_WARN_BOOL_CONVERSION = YES; 328 | CLANG_WARN_COMMA = YES; 329 | CLANG_WARN_CONSTANT_CONVERSION = YES; 330 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 331 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 332 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 333 | CLANG_WARN_EMPTY_BODY = YES; 334 | CLANG_WARN_ENUM_CONVERSION = YES; 335 | CLANG_WARN_INFINITE_RECURSION = YES; 336 | CLANG_WARN_INT_CONVERSION = YES; 337 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 338 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 339 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 340 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 341 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 342 | CLANG_WARN_STRICT_PROTOTYPES = YES; 343 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 344 | CLANG_WARN_UNREACHABLE_CODE = YES; 345 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 346 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 347 | COPY_PHASE_STRIP = NO; 348 | CURRENT_PROJECT_VERSION = 1; 349 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 350 | ENABLE_NS_ASSERTIONS = NO; 351 | ENABLE_STRICT_OBJC_MSGSEND = YES; 352 | GCC_C_LANGUAGE_STANDARD = gnu99; 353 | GCC_NO_COMMON_BLOCKS = YES; 354 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 355 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 356 | GCC_WARN_UNDECLARED_SELECTOR = YES; 357 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 358 | GCC_WARN_UNUSED_FUNCTION = YES; 359 | GCC_WARN_UNUSED_VARIABLE = YES; 360 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 361 | MTL_ENABLE_DEBUG_INFO = NO; 362 | SDKROOT = iphoneos; 363 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 364 | SWIFT_VERSION = 5.0; 365 | VALIDATE_PRODUCT = YES; 366 | VERSIONING_SYSTEM = "apple-generic"; 367 | }; 368 | name = Release; 369 | }; 370 | A30D64011E0D717E00A3CE45 /* Debug */ = { 371 | isa = XCBuildConfiguration; 372 | baseConfigurationReference = 444C2E3A94BE72ECE95421F5 /* Pods-Samples-SideNavigationControllerSample-iOS.debug.xcconfig */; 373 | buildSettings = { 374 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 375 | DEVELOPMENT_TEAM = 582762VK3P; 376 | INFOPLIST_FILE = "SideNavigationControllerSample-iOS/Info.plist"; 377 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 378 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 379 | PRODUCT_BUNDLE_IDENTIFIER = "com.digipolitan.SideNavigationControllerSample-iOS"; 380 | PRODUCT_NAME = "$(TARGET_NAME)"; 381 | }; 382 | name = Debug; 383 | }; 384 | A30D64021E0D717E00A3CE45 /* Release */ = { 385 | isa = XCBuildConfiguration; 386 | baseConfigurationReference = 437CB24F88DE489FD8141488 /* Pods-Samples-SideNavigationControllerSample-iOS.release.xcconfig */; 387 | buildSettings = { 388 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 389 | DEVELOPMENT_TEAM = 582762VK3P; 390 | INFOPLIST_FILE = "SideNavigationControllerSample-iOS/Info.plist"; 391 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 392 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 393 | PRODUCT_BUNDLE_IDENTIFIER = "com.digipolitan.SideNavigationControllerSample-iOS"; 394 | PRODUCT_NAME = "$(TARGET_NAME)"; 395 | }; 396 | name = Release; 397 | }; 398 | /* End XCBuildConfiguration section */ 399 | 400 | /* Begin XCConfigurationList section */ 401 | A30D63E91E0D717E00A3CE45 /* Build configuration list for PBXProject "SideNavigationControllerSample-iOS" */ = { 402 | isa = XCConfigurationList; 403 | buildConfigurations = ( 404 | A30D63FE1E0D717E00A3CE45 /* Debug */, 405 | A30D63FF1E0D717E00A3CE45 /* Release */, 406 | ); 407 | defaultConfigurationIsVisible = 0; 408 | defaultConfigurationName = Release; 409 | }; 410 | A30D64001E0D717E00A3CE45 /* Build configuration list for PBXNativeTarget "SideNavigationControllerSample-iOS" */ = { 411 | isa = XCConfigurationList; 412 | buildConfigurations = ( 413 | A30D64011E0D717E00A3CE45 /* Debug */, 414 | A30D64021E0D717E00A3CE45 /* Release */, 415 | ); 416 | defaultConfigurationIsVisible = 0; 417 | defaultConfigurationName = Release; 418 | }; 419 | /* End XCConfigurationList section */ 420 | }; 421 | rootObject = A30D63E61E0D717E00A3CE45 /* Project object */; 422 | } 423 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // SideNavigationControllerSample-iOS 4 | // 5 | // Created by Benoit BRIATTE on 23/12/2016. 6 | // Copyright © 2016 Digipolitan. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @testable import SideNavigationController 12 | 13 | @UIApplicationMain 14 | class AppDelegate: UIResponder, UIApplicationDelegate { 15 | 16 | var window: UIWindow? 17 | 18 | internal func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 19 | let window = UIWindow(frame: UIScreen.main.bounds) 20 | 21 | let side = SideNavigationController(mainViewController: UINavigationController(rootViewController: ViewController())) 22 | side.leftSide(viewController: LeftViewController()) 23 | 24 | side.rightSide(viewController: RightViewController(), options: .init(widthPercent: 0.7, 25 | overlayColor: .gray, 26 | overlayOpacity: 0.5, 27 | shadowColor: .black, 28 | scale: 0.8, 29 | position: .front)) 30 | window.rootViewController = side 31 | 32 | self.window = window 33 | window.makeKeyAndVisible() 34 | return true 35 | } 36 | 37 | func applicationWillResignActive(_ application: UIApplication) { 38 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions 39 | // (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 40 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 41 | } 42 | 43 | func applicationDidEnterBackground(_ application: UIApplication) { 44 | // Use this method to release shared resources, save user data, invalidate timers, 45 | // and store enough application state information to restore your application to its current state in case it is terminated later. 46 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 47 | } 48 | 49 | func applicationWillEnterForeground(_ application: UIApplication) { 50 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 51 | } 52 | 53 | func applicationDidBecomeActive(_ application: UIApplication) { 54 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 55 | } 56 | 57 | func applicationWillTerminate(_ application: UIApplication) { 58 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "size" : "1024x1024", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS/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 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS/ChildViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChildViewController.swift 3 | // SideNavigationControllerSample-iOS 4 | // 5 | // Created by Benoit BRIATTE on 13/03/2017. 6 | // Copyright © 2017 Digipolitan. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ChildViewController: UIViewController { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS/ChildViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 36 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | fr_FR 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIRequiredDeviceCapabilities 26 | 27 | armv7 28 | 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS/LeftViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LeftViewController.swift 3 | // SideNavigationControllerSample-iOS 4 | // 5 | // Created by Benoit BRIATTE on 25/02/2017. 6 | // Copyright © 2017 Digipolitan. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class LeftViewController: UIViewController { 12 | 13 | override var prefersStatusBarHidden: Bool { 14 | return true 15 | } 16 | 17 | override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 18 | return .slide 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS/LeftViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS/RightViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RightViewController.swift 3 | // SideNavigationControllerSample-iOS 4 | // 5 | // Created by Benoit BRIATTE on 13/03/2017. 6 | // Copyright © 2017 Digipolitan. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class RightViewController: UIViewController { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS/RightViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // SideNavigationControllerSample-iOS 4 | // 5 | // Created by Benoit BRIATTE on 23/12/2016. 6 | // Copyright © 2019 Digipolitan. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SideNavigationController 11 | 12 | class ViewController: UIViewController { 13 | 14 | @IBOutlet var otherSideViewConainer: UIView! 15 | private var otherSideNavigationController: SideNavigationController? 16 | 17 | @IBAction func touchLeft(_ sender: UIButton) { 18 | self.sideNavigationController?.showLeftSide() 19 | } 20 | 21 | @IBAction func touchRight(_ sender: UIButton) { 22 | self.sideNavigationController?.showRightSide() 23 | } 24 | 25 | override func viewDidLoad() { 26 | super.viewDidLoad() 27 | 28 | let snv = SideNavigationController(mainViewController: ChildViewController()) 29 | snv.leftSide(viewController: LeftViewController(), options: .init(widthPercent: 0.5, 30 | overlayColor: .gray, 31 | overlayOpacity: 0.5, 32 | shadowColor: .black, 33 | scale: 0.8, 34 | position: .front)) 35 | snv.rightSide(viewController: RightViewController()) 36 | 37 | snv.view.frame = self.otherSideViewConainer.bounds 38 | 39 | self.otherSideViewConainer.addSubview(snv.view) 40 | self.otherSideNavigationController = snv 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-iOS/SideNavigationControllerSample-iOS/ViewController.xib: -------------------------------------------------------------------------------- 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 | 34 | 42 | 43 | 44 | 45 | 46 | 47 | 54 | 61 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 34DDE7D37FD36E461D4A12B8 /* Pods_Samples_SideNavigationControllerSample_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7555CFD588FF39D73FDF1 /* Pods_Samples_SideNavigationControllerSample_tvOS.framework */; }; 11 | A30D64901E0D7B2A00A3CE45 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30D648F1E0D7B2A00A3CE45 /* AppDelegate.swift */; }; 12 | A30D64971E0D7B2A00A3CE45 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A30D64961E0D7B2A00A3CE45 /* Assets.xcassets */; }; 13 | A30D649F1E0D7BA200A3CE45 /* SideNavigationController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A30D649E1E0D7BA200A3CE45 /* SideNavigationController.framework */; }; 14 | A30D64A01E0D7BA200A3CE45 /* SideNavigationController.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A30D649E1E0D7BA200A3CE45 /* SideNavigationController.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 15 | A30D64A51E0D7BC200A3CE45 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30D64A31E0D7BC200A3CE45 /* ViewController.swift */; }; 16 | A30D64A61E0D7BC200A3CE45 /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A30D64A41E0D7BC200A3CE45 /* ViewController.xib */; }; 17 | A3F5973C1E770747001F230F /* LeftViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3F5973A1E770747001F230F /* LeftViewController.swift */; }; 18 | A3F5973D1E770747001F230F /* LeftViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A3F5973B1E770747001F230F /* LeftViewController.xib */; }; 19 | A3F597401E774C68001F230F /* RightViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3F5973E1E774C68001F230F /* RightViewController.swift */; }; 20 | A3F597411E774C68001F230F /* RightViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A3F5973F1E774C68001F230F /* RightViewController.xib */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXCopyFilesBuildPhase section */ 24 | A30D64A11E0D7BA200A3CE45 /* Embed Frameworks */ = { 25 | isa = PBXCopyFilesBuildPhase; 26 | buildActionMask = 2147483647; 27 | dstPath = ""; 28 | dstSubfolderSpec = 10; 29 | files = ( 30 | A30D64A01E0D7BA200A3CE45 /* SideNavigationController.framework in Embed Frameworks */, 31 | ); 32 | name = "Embed Frameworks"; 33 | runOnlyForDeploymentPostprocessing = 0; 34 | }; 35 | /* End PBXCopyFilesBuildPhase section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | 066D1A22246FF0D2CA34D179 /* Pods-SideNavigationControllerSample-SideNavigationControllerSample-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideNavigationControllerSample-SideNavigationControllerSample-tvOS.debug.xcconfig"; path = "../../Pods/Target Support Files/Pods-SideNavigationControllerSample-SideNavigationControllerSample-tvOS/Pods-SideNavigationControllerSample-SideNavigationControllerSample-tvOS.debug.xcconfig"; sourceTree = ""; }; 39 | 37F6C77DDB9960488AEFDF89 /* Pods-SideNavigationControllerSample-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideNavigationControllerSample-tvOS.debug.xcconfig"; path = "../../Pods/Target Support Files/Pods-SideNavigationControllerSample-tvOS/Pods-SideNavigationControllerSample-tvOS.debug.xcconfig"; sourceTree = ""; }; 40 | 63C7555CFD588FF39D73FDF1 /* Pods_Samples_SideNavigationControllerSample_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Samples_SideNavigationControllerSample_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 834A6462DDEA44C90F6C4159 /* Pods-SideNavigationControllerSample-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideNavigationControllerSample-tvOS.release.xcconfig"; path = "../../Pods/Target Support Files/Pods-SideNavigationControllerSample-tvOS/Pods-SideNavigationControllerSample-tvOS.release.xcconfig"; sourceTree = ""; }; 42 | 86F04D0709DA0D6A2D69C509 /* Pods_SideNavigationControllerSample_SideNavigationControllerSample_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SideNavigationControllerSample_SideNavigationControllerSample_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 8D5D11F835CD3CA7BB6F03DF /* Pods_SideNavigationControllerSample_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SideNavigationControllerSample_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | A30D648C1E0D7B2A00A3CE45 /* SideNavigationControllerSample-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SideNavigationControllerSample-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | A30D648F1E0D7B2A00A3CE45 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 46 | A30D64961E0D7B2A00A3CE45 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 47 | A30D64981E0D7B2A00A3CE45 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 48 | A30D649E1E0D7BA200A3CE45 /* SideNavigationController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SideNavigationController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | A30D64A31E0D7BC200A3CE45 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 50 | A30D64A41E0D7BC200A3CE45 /* ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewController.xib; sourceTree = ""; }; 51 | A3F5973A1E770747001F230F /* LeftViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LeftViewController.swift; sourceTree = ""; }; 52 | A3F5973B1E770747001F230F /* LeftViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LeftViewController.xib; sourceTree = ""; }; 53 | A3F5973E1E774C68001F230F /* RightViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RightViewController.swift; sourceTree = ""; }; 54 | A3F5973F1E774C68001F230F /* RightViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RightViewController.xib; sourceTree = ""; }; 55 | B59EBA76E4EE0948B3D0809A /* Pods-SideNavigationControllerSample-SideNavigationControllerSample-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideNavigationControllerSample-SideNavigationControllerSample-tvOS.release.xcconfig"; path = "../../Pods/Target Support Files/Pods-SideNavigationControllerSample-SideNavigationControllerSample-tvOS/Pods-SideNavigationControllerSample-SideNavigationControllerSample-tvOS.release.xcconfig"; sourceTree = ""; }; 56 | ED2ADEE910CDAC99133FE3EF /* Pods-Samples-SideNavigationControllerSample-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Samples-SideNavigationControllerSample-tvOS.debug.xcconfig"; path = "../../Pods/Target Support Files/Pods-Samples-SideNavigationControllerSample-tvOS/Pods-Samples-SideNavigationControllerSample-tvOS.debug.xcconfig"; sourceTree = ""; }; 57 | FFD332EBB09E825D4FA391D8 /* Pods-Samples-SideNavigationControllerSample-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Samples-SideNavigationControllerSample-tvOS.release.xcconfig"; path = "../../Pods/Target Support Files/Pods-Samples-SideNavigationControllerSample-tvOS/Pods-Samples-SideNavigationControllerSample-tvOS.release.xcconfig"; sourceTree = ""; }; 58 | /* End PBXFileReference section */ 59 | 60 | /* Begin PBXFrameworksBuildPhase section */ 61 | A30D64891E0D7B2A00A3CE45 /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | A30D649F1E0D7BA200A3CE45 /* SideNavigationController.framework in Frameworks */, 66 | 34DDE7D37FD36E461D4A12B8 /* Pods_Samples_SideNavigationControllerSample_tvOS.framework in Frameworks */, 67 | ); 68 | runOnlyForDeploymentPostprocessing = 0; 69 | }; 70 | /* End PBXFrameworksBuildPhase section */ 71 | 72 | /* Begin PBXGroup section */ 73 | 7406AAB64BCC5F8B0262648E /* Pods */ = { 74 | isa = PBXGroup; 75 | children = ( 76 | 37F6C77DDB9960488AEFDF89 /* Pods-SideNavigationControllerSample-tvOS.debug.xcconfig */, 77 | 834A6462DDEA44C90F6C4159 /* Pods-SideNavigationControllerSample-tvOS.release.xcconfig */, 78 | 066D1A22246FF0D2CA34D179 /* Pods-SideNavigationControllerSample-SideNavigationControllerSample-tvOS.debug.xcconfig */, 79 | B59EBA76E4EE0948B3D0809A /* Pods-SideNavigationControllerSample-SideNavigationControllerSample-tvOS.release.xcconfig */, 80 | ED2ADEE910CDAC99133FE3EF /* Pods-Samples-SideNavigationControllerSample-tvOS.debug.xcconfig */, 81 | FFD332EBB09E825D4FA391D8 /* Pods-Samples-SideNavigationControllerSample-tvOS.release.xcconfig */, 82 | ); 83 | name = Pods; 84 | sourceTree = ""; 85 | }; 86 | A30D64831E0D7B2A00A3CE45 = { 87 | isa = PBXGroup; 88 | children = ( 89 | A30D648E1E0D7B2A00A3CE45 /* SideNavigationControllerSample-tvOS */, 90 | A30D64A21E0D7BA600A3CE45 /* Frameworks */, 91 | A30D648D1E0D7B2A00A3CE45 /* Products */, 92 | 7406AAB64BCC5F8B0262648E /* Pods */, 93 | ); 94 | sourceTree = ""; 95 | }; 96 | A30D648D1E0D7B2A00A3CE45 /* Products */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | A30D648C1E0D7B2A00A3CE45 /* SideNavigationControllerSample-tvOS.app */, 100 | ); 101 | name = Products; 102 | sourceTree = ""; 103 | }; 104 | A30D648E1E0D7B2A00A3CE45 /* SideNavigationControllerSample-tvOS */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | A30D648F1E0D7B2A00A3CE45 /* AppDelegate.swift */, 108 | A30D64A31E0D7BC200A3CE45 /* ViewController.swift */, 109 | A30D64A41E0D7BC200A3CE45 /* ViewController.xib */, 110 | A3F5973A1E770747001F230F /* LeftViewController.swift */, 111 | A3F5973B1E770747001F230F /* LeftViewController.xib */, 112 | A3F5973E1E774C68001F230F /* RightViewController.swift */, 113 | A3F5973F1E774C68001F230F /* RightViewController.xib */, 114 | A30D64961E0D7B2A00A3CE45 /* Assets.xcassets */, 115 | A30D64981E0D7B2A00A3CE45 /* Info.plist */, 116 | ); 117 | path = "SideNavigationControllerSample-tvOS"; 118 | sourceTree = ""; 119 | }; 120 | A30D64A21E0D7BA600A3CE45 /* Frameworks */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | A30D649E1E0D7BA200A3CE45 /* SideNavigationController.framework */, 124 | 8D5D11F835CD3CA7BB6F03DF /* Pods_SideNavigationControllerSample_tvOS.framework */, 125 | 86F04D0709DA0D6A2D69C509 /* Pods_SideNavigationControllerSample_SideNavigationControllerSample_tvOS.framework */, 126 | 63C7555CFD588FF39D73FDF1 /* Pods_Samples_SideNavigationControllerSample_tvOS.framework */, 127 | ); 128 | name = Frameworks; 129 | sourceTree = ""; 130 | }; 131 | /* End PBXGroup section */ 132 | 133 | /* Begin PBXNativeTarget section */ 134 | A30D648B1E0D7B2A00A3CE45 /* SideNavigationControllerSample-tvOS */ = { 135 | isa = PBXNativeTarget; 136 | buildConfigurationList = A30D649B1E0D7B2A00A3CE45 /* Build configuration list for PBXNativeTarget "SideNavigationControllerSample-tvOS" */; 137 | buildPhases = ( 138 | C9C3C7D7C59B1AB10EA77253 /* [CP] Check Pods Manifest.lock */, 139 | A30D64881E0D7B2A00A3CE45 /* Sources */, 140 | A30D64891E0D7B2A00A3CE45 /* Frameworks */, 141 | A30D648A1E0D7B2A00A3CE45 /* Resources */, 142 | A30D64A11E0D7BA200A3CE45 /* Embed Frameworks */, 143 | ); 144 | buildRules = ( 145 | ); 146 | dependencies = ( 147 | ); 148 | name = "SideNavigationControllerSample-tvOS"; 149 | productName = "SideNavigationControllerSample-tvOS"; 150 | productReference = A30D648C1E0D7B2A00A3CE45 /* SideNavigationControllerSample-tvOS.app */; 151 | productType = "com.apple.product-type.application"; 152 | }; 153 | /* End PBXNativeTarget section */ 154 | 155 | /* Begin PBXProject section */ 156 | A30D64841E0D7B2A00A3CE45 /* Project object */ = { 157 | isa = PBXProject; 158 | attributes = { 159 | LastSwiftUpdateCheck = 0820; 160 | LastUpgradeCheck = 1020; 161 | ORGANIZATIONNAME = Digipolitan; 162 | TargetAttributes = { 163 | A30D648B1E0D7B2A00A3CE45 = { 164 | CreatedOnToolsVersion = 8.2.1; 165 | DevelopmentTeam = 582762VK3P; 166 | ProvisioningStyle = Automatic; 167 | }; 168 | }; 169 | }; 170 | buildConfigurationList = A30D64871E0D7B2A00A3CE45 /* Build configuration list for PBXProject "SideNavigationControllerSample-tvOS" */; 171 | compatibilityVersion = "Xcode 3.2"; 172 | developmentRegion = en; 173 | hasScannedForEncodings = 0; 174 | knownRegions = ( 175 | en, 176 | Base, 177 | ); 178 | mainGroup = A30D64831E0D7B2A00A3CE45; 179 | productRefGroup = A30D648D1E0D7B2A00A3CE45 /* Products */; 180 | projectDirPath = ""; 181 | projectRoot = ""; 182 | targets = ( 183 | A30D648B1E0D7B2A00A3CE45 /* SideNavigationControllerSample-tvOS */, 184 | ); 185 | }; 186 | /* End PBXProject section */ 187 | 188 | /* Begin PBXResourcesBuildPhase section */ 189 | A30D648A1E0D7B2A00A3CE45 /* Resources */ = { 190 | isa = PBXResourcesBuildPhase; 191 | buildActionMask = 2147483647; 192 | files = ( 193 | A30D64A61E0D7BC200A3CE45 /* ViewController.xib in Resources */, 194 | A3F597411E774C68001F230F /* RightViewController.xib in Resources */, 195 | A3F5973D1E770747001F230F /* LeftViewController.xib in Resources */, 196 | A30D64971E0D7B2A00A3CE45 /* Assets.xcassets in Resources */, 197 | ); 198 | runOnlyForDeploymentPostprocessing = 0; 199 | }; 200 | /* End PBXResourcesBuildPhase section */ 201 | 202 | /* Begin PBXShellScriptBuildPhase section */ 203 | C9C3C7D7C59B1AB10EA77253 /* [CP] Check Pods Manifest.lock */ = { 204 | isa = PBXShellScriptBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | ); 208 | inputPaths = ( 209 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 210 | "${PODS_ROOT}/Manifest.lock", 211 | ); 212 | name = "[CP] Check Pods Manifest.lock"; 213 | outputPaths = ( 214 | "$(DERIVED_FILE_DIR)/Pods-Samples-SideNavigationControllerSample-tvOS-checkManifestLockResult.txt", 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | shellPath = /bin/sh; 218 | 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"; 219 | showEnvVarsInLog = 0; 220 | }; 221 | /* End PBXShellScriptBuildPhase section */ 222 | 223 | /* Begin PBXSourcesBuildPhase section */ 224 | A30D64881E0D7B2A00A3CE45 /* Sources */ = { 225 | isa = PBXSourcesBuildPhase; 226 | buildActionMask = 2147483647; 227 | files = ( 228 | A3F5973C1E770747001F230F /* LeftViewController.swift in Sources */, 229 | A3F597401E774C68001F230F /* RightViewController.swift in Sources */, 230 | A30D64A51E0D7BC200A3CE45 /* ViewController.swift in Sources */, 231 | A30D64901E0D7B2A00A3CE45 /* AppDelegate.swift in Sources */, 232 | ); 233 | runOnlyForDeploymentPostprocessing = 0; 234 | }; 235 | /* End PBXSourcesBuildPhase section */ 236 | 237 | /* Begin XCBuildConfiguration section */ 238 | A30D64991E0D7B2A00A3CE45 /* Debug */ = { 239 | isa = XCBuildConfiguration; 240 | buildSettings = { 241 | ALWAYS_SEARCH_USER_PATHS = NO; 242 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 243 | CLANG_ANALYZER_NONNULL = YES; 244 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 245 | CLANG_CXX_LIBRARY = "libc++"; 246 | CLANG_ENABLE_MODULES = YES; 247 | CLANG_ENABLE_OBJC_ARC = YES; 248 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 249 | CLANG_WARN_BOOL_CONVERSION = YES; 250 | CLANG_WARN_COMMA = YES; 251 | CLANG_WARN_CONSTANT_CONVERSION = YES; 252 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 253 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 254 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 255 | CLANG_WARN_EMPTY_BODY = YES; 256 | CLANG_WARN_ENUM_CONVERSION = YES; 257 | CLANG_WARN_INFINITE_RECURSION = YES; 258 | CLANG_WARN_INT_CONVERSION = YES; 259 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 260 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 261 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 262 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 263 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 264 | CLANG_WARN_STRICT_PROTOTYPES = YES; 265 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 266 | CLANG_WARN_UNREACHABLE_CODE = YES; 267 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 268 | COPY_PHASE_STRIP = NO; 269 | CURRENT_PROJECT_VERSION = 1; 270 | DEBUG_INFORMATION_FORMAT = dwarf; 271 | ENABLE_STRICT_OBJC_MSGSEND = YES; 272 | ENABLE_TESTABILITY = YES; 273 | GCC_C_LANGUAGE_STANDARD = gnu99; 274 | GCC_DYNAMIC_NO_PIC = NO; 275 | GCC_NO_COMMON_BLOCKS = YES; 276 | GCC_OPTIMIZATION_LEVEL = 0; 277 | GCC_PREPROCESSOR_DEFINITIONS = ( 278 | "DEBUG=1", 279 | "$(inherited)", 280 | ); 281 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 282 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 283 | GCC_WARN_UNDECLARED_SELECTOR = YES; 284 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 285 | GCC_WARN_UNUSED_FUNCTION = YES; 286 | GCC_WARN_UNUSED_VARIABLE = YES; 287 | MTL_ENABLE_DEBUG_INFO = YES; 288 | ONLY_ACTIVE_ARCH = YES; 289 | SDKROOT = appletvos; 290 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 291 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 292 | SWIFT_VERSION = 5.0; 293 | TARGETED_DEVICE_FAMILY = 3; 294 | TVOS_DEPLOYMENT_TARGET = 10.1; 295 | VERSIONING_SYSTEM = "apple-generic"; 296 | }; 297 | name = Debug; 298 | }; 299 | A30D649A1E0D7B2A00A3CE45 /* Release */ = { 300 | isa = XCBuildConfiguration; 301 | buildSettings = { 302 | ALWAYS_SEARCH_USER_PATHS = NO; 303 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 304 | CLANG_ANALYZER_NONNULL = YES; 305 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 306 | CLANG_CXX_LIBRARY = "libc++"; 307 | CLANG_ENABLE_MODULES = YES; 308 | CLANG_ENABLE_OBJC_ARC = YES; 309 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 310 | CLANG_WARN_BOOL_CONVERSION = YES; 311 | CLANG_WARN_COMMA = YES; 312 | CLANG_WARN_CONSTANT_CONVERSION = YES; 313 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 314 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 315 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 316 | CLANG_WARN_EMPTY_BODY = YES; 317 | CLANG_WARN_ENUM_CONVERSION = YES; 318 | CLANG_WARN_INFINITE_RECURSION = YES; 319 | CLANG_WARN_INT_CONVERSION = YES; 320 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 321 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 322 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 323 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 324 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 325 | CLANG_WARN_STRICT_PROTOTYPES = YES; 326 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 327 | CLANG_WARN_UNREACHABLE_CODE = YES; 328 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 329 | COPY_PHASE_STRIP = NO; 330 | CURRENT_PROJECT_VERSION = 1; 331 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 332 | ENABLE_NS_ASSERTIONS = NO; 333 | ENABLE_STRICT_OBJC_MSGSEND = YES; 334 | GCC_C_LANGUAGE_STANDARD = gnu99; 335 | GCC_NO_COMMON_BLOCKS = YES; 336 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 337 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 338 | GCC_WARN_UNDECLARED_SELECTOR = YES; 339 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 340 | GCC_WARN_UNUSED_FUNCTION = YES; 341 | GCC_WARN_UNUSED_VARIABLE = YES; 342 | MTL_ENABLE_DEBUG_INFO = NO; 343 | SDKROOT = appletvos; 344 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 345 | SWIFT_VERSION = 5.0; 346 | TARGETED_DEVICE_FAMILY = 3; 347 | TVOS_DEPLOYMENT_TARGET = 10.1; 348 | VALIDATE_PRODUCT = YES; 349 | VERSIONING_SYSTEM = "apple-generic"; 350 | }; 351 | name = Release; 352 | }; 353 | A30D649C1E0D7B2A00A3CE45 /* Debug */ = { 354 | isa = XCBuildConfiguration; 355 | baseConfigurationReference = ED2ADEE910CDAC99133FE3EF /* Pods-Samples-SideNavigationControllerSample-tvOS.debug.xcconfig */; 356 | buildSettings = { 357 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; 358 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 359 | DEVELOPMENT_TEAM = 582762VK3P; 360 | INFOPLIST_FILE = "SideNavigationControllerSample-tvOS/Info.plist"; 361 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 362 | PRODUCT_BUNDLE_IDENTIFIER = "com.digipolitan.SideNavigationControllerSample-tvOS"; 363 | PRODUCT_NAME = "$(TARGET_NAME)"; 364 | TVOS_DEPLOYMENT_TARGET = 9.0; 365 | }; 366 | name = Debug; 367 | }; 368 | A30D649D1E0D7B2A00A3CE45 /* Release */ = { 369 | isa = XCBuildConfiguration; 370 | baseConfigurationReference = FFD332EBB09E825D4FA391D8 /* Pods-Samples-SideNavigationControllerSample-tvOS.release.xcconfig */; 371 | buildSettings = { 372 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; 373 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 374 | DEVELOPMENT_TEAM = 582762VK3P; 375 | INFOPLIST_FILE = "SideNavigationControllerSample-tvOS/Info.plist"; 376 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 377 | PRODUCT_BUNDLE_IDENTIFIER = "com.digipolitan.SideNavigationControllerSample-tvOS"; 378 | PRODUCT_NAME = "$(TARGET_NAME)"; 379 | TVOS_DEPLOYMENT_TARGET = 9.0; 380 | }; 381 | name = Release; 382 | }; 383 | /* End XCBuildConfiguration section */ 384 | 385 | /* Begin XCConfigurationList section */ 386 | A30D64871E0D7B2A00A3CE45 /* Build configuration list for PBXProject "SideNavigationControllerSample-tvOS" */ = { 387 | isa = XCConfigurationList; 388 | buildConfigurations = ( 389 | A30D64991E0D7B2A00A3CE45 /* Debug */, 390 | A30D649A1E0D7B2A00A3CE45 /* Release */, 391 | ); 392 | defaultConfigurationIsVisible = 0; 393 | defaultConfigurationName = Release; 394 | }; 395 | A30D649B1E0D7B2A00A3CE45 /* Build configuration list for PBXNativeTarget "SideNavigationControllerSample-tvOS" */ = { 396 | isa = XCConfigurationList; 397 | buildConfigurations = ( 398 | A30D649C1E0D7B2A00A3CE45 /* Debug */, 399 | A30D649D1E0D7B2A00A3CE45 /* Release */, 400 | ); 401 | defaultConfigurationIsVisible = 0; 402 | defaultConfigurationName = Release; 403 | }; 404 | /* End XCConfigurationList section */ 405 | }; 406 | rootObject = A30D64841E0D7B2A00A3CE45 /* Project object */; 407 | } 408 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // SideNavigationControllerSample-tvOS 4 | // 5 | // Created by Benoit BRIATTE on 23/12/2016. 6 | // Copyright © 2016 Digipolitan. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | @testable import SideNavigationController 11 | 12 | @UIApplicationMain 13 | class AppDelegate: UIResponder, UIApplicationDelegate { 14 | 15 | var window: UIWindow? 16 | 17 | internal func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | let window = UIWindow(frame: UIScreen.main.bounds) 19 | 20 | let sideNavigationController = SideNavigationController(mainViewController: UINavigationController(rootViewController: ViewController())) 21 | sideNavigationController.leftSide(viewController: LeftViewController(), options: .init( 22 | widthPercent: 0.3, 23 | overlayOpacity: 0.8, 24 | shadowColor: .gray, 25 | panningEnabled: true, 26 | scale: 0.6, 27 | position: .front)) 28 | sideNavigationController.rightSide(viewController: RightViewController()) 29 | 30 | window.rootViewController = sideNavigationController 31 | 32 | self.window = window 33 | window.makeKeyAndVisible() 34 | return true 35 | } 36 | 37 | func applicationWillResignActive(_ application: UIApplication) { 38 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions 39 | // (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 40 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 41 | } 42 | 43 | func applicationDidEnterBackground(_ application: UIApplication) { 44 | // Use this method to release shared resources, save user data, invalidate timers, 45 | // and store enough application state information to restore your application to its current state in case it is terminated later. 46 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 47 | } 48 | 49 | func applicationWillEnterForeground(_ application: UIApplication) { 50 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 51 | } 52 | 53 | func applicationDidBecomeActive(_ application: UIApplication) { 54 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 55 | } 56 | 57 | func applicationWillTerminate(_ application: UIApplication) { 58 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "scale" : "1x" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "layers" : [ 3 | { 4 | "filename" : "Front.imagestacklayer" 5 | }, 6 | { 7 | "filename" : "Middle.imagestacklayer" 8 | }, 9 | { 10 | "filename" : "Back.imagestacklayer" 11 | } 12 | ], 13 | "info" : { 14 | "version" : 1, 15 | "author" : "xcode" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "scale" : "1x" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "scale" : "1x" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "scale" : "1x" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "layers" : [ 3 | { 4 | "filename" : "Front.imagestacklayer" 5 | }, 6 | { 7 | "filename" : "Middle.imagestacklayer" 8 | }, 9 | { 10 | "filename" : "Back.imagestacklayer" 11 | } 12 | ], 13 | "info" : { 14 | "version" : 1, 15 | "author" : "xcode" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "scale" : "1x" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "scale" : "1x" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "assets" : [ 3 | { 4 | "size" : "1280x768", 5 | "idiom" : "tv", 6 | "filename" : "App Icon - Large.imagestack", 7 | "role" : "primary-app-icon" 8 | }, 9 | { 10 | "size" : "400x240", 11 | "idiom" : "tv", 12 | "filename" : "App Icon - Small.imagestack", 13 | "role" : "primary-app-icon" 14 | }, 15 | { 16 | "size" : "2320x720", 17 | "idiom" : "tv", 18 | "filename" : "Top Shelf Image Wide.imageset", 19 | "role" : "top-shelf-image-wide" 20 | }, 21 | { 22 | "size" : "1920x720", 23 | "idiom" : "tv", 24 | "filename" : "Top Shelf Image.imageset", 25 | "role" : "top-shelf-image" 26 | } 27 | ], 28 | "info" : { 29 | "version" : 1, 30 | "author" : "xcode" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "scale" : "1x" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "scale" : "1x" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Assets.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "landscape", 5 | "idiom" : "tv", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "9.0", 8 | "scale" : "1x" 9 | } 10 | ], 11 | "info" : { 12 | "version" : 1, 13 | "author" : "xcode" 14 | } 15 | } -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | fr_FR 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIRequiredDeviceCapabilities 24 | 25 | arm64 26 | 27 | UIUserInterfaceStyle 28 | Automatic 29 | 30 | 31 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/LeftViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LeftViewController.swift 3 | // SideNavigationControllerSample-tvOS 4 | // 5 | // Created by Benoit BRIATTE on 13/03/2017. 6 | // Copyright © 2017 Digipolitan. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SideNavigationController 11 | 12 | class LeftViewController: UIViewController { 13 | 14 | @IBAction func closeSide(_ sender: UIButton) { 15 | self.sideNavigationController?.closeSide() 16 | } 17 | 18 | @IBAction func consoleLog(_ sender: UIButton) { 19 | print("UI Event") 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/LeftViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 30 | 38 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/RightViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RightViewController.swift 3 | // SideNavigationControllerSample-tvOS 4 | // 5 | // Created by Benoit BRIATTE on 13/03/2017. 6 | // Copyright © 2017 Digipolitan. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class RightViewController: UIViewController { 12 | } 13 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/RightViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // SideNavigationControllerSample-tvOS 4 | // 5 | // Created by Benoit BRIATTE on 23/12/2016. 6 | // Copyright © 2016 Digipolitan. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SideNavigationController 11 | 12 | class ViewController: UIViewController { 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | } 17 | 18 | @IBAction func displayLeft(_ sender: UIButton) { 19 | self.sideNavigationController?.showLeftSide() 20 | } 21 | 22 | @IBAction func displayRight(_ sender: UIButton) { 23 | self.sideNavigationController?.showRightSide() 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Samples/SideNavigationControllerSample-tvOS/SideNavigationControllerSample-tvOS/ViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 32 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /Screenshots/ios_capture.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Digipolitan/side-navigation-controller/d26c472d8ba8e96c4c2d610b7e22961a8d7fa5a5/Screenshots/ios_capture.gif -------------------------------------------------------------------------------- /Screenshots/tvos_capture.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Digipolitan/side-navigation-controller/d26c472d8ba8e96c4c2d610b7e22961a8d7fa5a5/Screenshots/tvos_capture.gif -------------------------------------------------------------------------------- /SideNavigationController.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "SideNavigationController" 3 | s.version = "2.0.1" 4 | s.summary = "Side navigation controller written in swift" 5 | s.homepage = "https://github.com/Digipolitan/side-navigation-controller" 6 | s.authors = "Digipolitan" 7 | s.source = { :git => "https://github.com/Digipolitan/side-navigation-controller.git", :tag => "v#{s.version}" } 8 | s.license = { :type => "BSD", :file => "LICENSE" } 9 | s.source_files = 'Sources/**/*.{swift,h}' 10 | s.ios.deployment_target = '9.0' 11 | s.tvos.deployment_target = '9.0' 12 | s.swift_version = '5.0' 13 | end 14 | -------------------------------------------------------------------------------- /SideNavigationController.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 01D06965137512C271FAD142 /* Pods_Frameworks_SideNavigationController_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CDB7A3727755B3B81F83C59B /* Pods_Frameworks_SideNavigationController_iOS.framework */; }; 11 | 4DE06866156BD64874277C9E /* Pods_Tests_SideNavigationControllerTests_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00818DDDDE8B5C19763566A3 /* Pods_Tests_SideNavigationControllerTests_tvOS.framework */; }; 12 | A3169DBA1DE05E8300BABAFD /* SideNavigationController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A3169DB01DE05E8300BABAFD /* SideNavigationController.framework */; }; 13 | A3169DF81DE0718900BABAFD /* SideNavigationController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A3169DEF1DE0718900BABAFD /* SideNavigationController.framework */; }; 14 | A3169E761DE083D900BABAFD /* SideNavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = A3169E751DE083D900BABAFD /* SideNavigationController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | A3169E781DE083D900BABAFD /* SideNavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = A3169E751DE083D900BABAFD /* SideNavigationController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | A38EF2CA1DECF97000637484 /* SideNavigationControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A38EF2C71DECF97000637484 /* SideNavigationControllerTests.swift */; }; 17 | A38EF2CB1DECF97000637484 /* SideNavigationControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A38EF2C71DECF97000637484 /* SideNavigationControllerTests.swift */; }; 18 | A3A0AEBA1E6073AE00F2D9B6 /* SideNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3A0AEB91E6073AE00F2D9B6 /* SideNavigationController.swift */; }; 19 | A3A0AEBB1E6073AE00F2D9B6 /* SideNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3A0AEB91E6073AE00F2D9B6 /* SideNavigationController.swift */; }; 20 | A3ED88581E76AF80006438EF /* UIViewController+SideNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3ED88571E76AF80006438EF /* UIViewController+SideNavigationController.swift */; }; 21 | A3ED88591E76AF80006438EF /* UIViewController+SideNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3ED88571E76AF80006438EF /* UIViewController+SideNavigationController.swift */; }; 22 | A3ED885B1E76AF9E006438EF /* SideNavigationController+NestedTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3ED885A1E76AF9E006438EF /* SideNavigationController+NestedTypes.swift */; }; 23 | A3ED885C1E76AF9E006438EF /* SideNavigationController+NestedTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3ED885A1E76AF9E006438EF /* SideNavigationController+NestedTypes.swift */; }; 24 | AFC250B362379E292E2D3254 /* Pods_Frameworks_SideNavigationController_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6254FBA17163EABFDEEC29C5 /* Pods_Frameworks_SideNavigationController_tvOS.framework */; }; 25 | D431FCC86A134B13C4FE43FA /* Pods_Tests_SideNavigationControllerTests_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA4939F0E316EAC3E524EB68 /* Pods_Tests_SideNavigationControllerTests_iOS.framework */; }; 26 | /* End PBXBuildFile section */ 27 | 28 | /* Begin PBXContainerItemProxy section */ 29 | A3169DBB1DE05E8300BABAFD /* PBXContainerItemProxy */ = { 30 | isa = PBXContainerItemProxy; 31 | containerPortal = A3169DA71DE05E8300BABAFD /* Project object */; 32 | proxyType = 1; 33 | remoteGlobalIDString = A3169DAF1DE05E8300BABAFD; 34 | remoteInfo = SideNavigationController; 35 | }; 36 | A3169DF91DE0718900BABAFD /* PBXContainerItemProxy */ = { 37 | isa = PBXContainerItemProxy; 38 | containerPortal = A3169DA71DE05E8300BABAFD /* Project object */; 39 | proxyType = 1; 40 | remoteGlobalIDString = A3169DEE1DE0718900BABAFD; 41 | remoteInfo = SideNavigationController; 42 | }; 43 | /* End PBXContainerItemProxy section */ 44 | 45 | /* Begin PBXFileReference section */ 46 | 00818DDDDE8B5C19763566A3 /* Pods_Tests_SideNavigationControllerTests_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Tests_SideNavigationControllerTests_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 47 | 34AE35334D57387D7B6D2F3A /* Pods-Tests-SideNavigationControllerTests-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests-SideNavigationControllerTests-tvOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-Tests-SideNavigationControllerTests-tvOS/Pods-Tests-SideNavigationControllerTests-tvOS.release.xcconfig"; sourceTree = ""; }; 48 | 5348EBF207A6CF9116174BC1 /* Pods-Frameworks-SideNavigationController-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Frameworks-SideNavigationController-tvOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-Frameworks-SideNavigationController-tvOS/Pods-Frameworks-SideNavigationController-tvOS.release.xcconfig"; sourceTree = ""; }; 49 | 5EACA27D15F258AE6141E2B4 /* Pods-Frameworks-SideNavigationController-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Frameworks-SideNavigationController-iOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Frameworks-SideNavigationController-iOS/Pods-Frameworks-SideNavigationController-iOS.debug.xcconfig"; sourceTree = ""; }; 50 | 6254FBA17163EABFDEEC29C5 /* Pods_Frameworks_SideNavigationController_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Frameworks_SideNavigationController_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | 75E26923B13FAD9F3851B41B /* Pods-Tests-SideNavigationControllerTests-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests-SideNavigationControllerTests-iOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Tests-SideNavigationControllerTests-iOS/Pods-Tests-SideNavigationControllerTests-iOS.debug.xcconfig"; sourceTree = ""; }; 52 | 7726579128038F991ECED9E9 /* Pods-Tests-SideNavigationControllerTests-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests-SideNavigationControllerTests-iOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-Tests-SideNavigationControllerTests-iOS/Pods-Tests-SideNavigationControllerTests-iOS.release.xcconfig"; sourceTree = ""; }; 53 | A3169DB01DE05E8300BABAFD /* SideNavigationController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SideNavigationController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | A3169DB91DE05E8300BABAFD /* SideNavigationControllerTests-iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SideNavigationControllerTests-iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | A3169DCC1DE0629100BABAFD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 56 | A3169DD11DE062A000BABAFD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 57 | A3169DDE1DE06EF400BABAFD /* SideNavigationController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SideNavigationController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 58 | A3169DEF1DE0718900BABAFD /* SideNavigationController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SideNavigationController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | A3169DF71DE0718900BABAFD /* SideNavigationControllerTests-tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SideNavigationControllerTests-tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 60 | A3169E0C1DE072C700BABAFD /* SideNavigationController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SideNavigationController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 61 | A3169E141DE072C800BABAFD /* SideNavigationControllerTests-OSX.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SideNavigationControllerTests-OSX.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | A3169E751DE083D900BABAFD /* SideNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SideNavigationController.h; sourceTree = ""; }; 63 | A38EF2C71DECF97000637484 /* SideNavigationControllerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SideNavigationControllerTests.swift; sourceTree = ""; }; 64 | A3A0AEB91E6073AE00F2D9B6 /* SideNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SideNavigationController.swift; sourceTree = ""; }; 65 | A3ED88571E76AF80006438EF /* UIViewController+SideNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+SideNavigationController.swift"; sourceTree = ""; }; 66 | A3ED885A1E76AF9E006438EF /* SideNavigationController+NestedTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SideNavigationController+NestedTypes.swift"; sourceTree = ""; }; 67 | CDB7A3727755B3B81F83C59B /* Pods_Frameworks_SideNavigationController_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Frameworks_SideNavigationController_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 68 | DA4939F0E316EAC3E524EB68 /* Pods_Tests_SideNavigationControllerTests_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Tests_SideNavigationControllerTests_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 69 | E3A356BAFDAD87A508B964EB /* Pods-Tests-SideNavigationControllerTests-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests-SideNavigationControllerTests-tvOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Tests-SideNavigationControllerTests-tvOS/Pods-Tests-SideNavigationControllerTests-tvOS.debug.xcconfig"; sourceTree = ""; }; 70 | F4809B5CE9A27D14E207959C /* Pods-Frameworks-SideNavigationController-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Frameworks-SideNavigationController-tvOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Frameworks-SideNavigationController-tvOS/Pods-Frameworks-SideNavigationController-tvOS.debug.xcconfig"; sourceTree = ""; }; 71 | FF3E7B399FB5E1559FF8E0B0 /* Pods-Frameworks-SideNavigationController-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Frameworks-SideNavigationController-iOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-Frameworks-SideNavigationController-iOS/Pods-Frameworks-SideNavigationController-iOS.release.xcconfig"; sourceTree = ""; }; 72 | /* End PBXFileReference section */ 73 | 74 | /* Begin PBXFrameworksBuildPhase section */ 75 | A3169DAC1DE05E8300BABAFD /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | 01D06965137512C271FAD142 /* Pods_Frameworks_SideNavigationController_iOS.framework in Frameworks */, 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | A3169DB61DE05E8300BABAFD /* Frameworks */ = { 84 | isa = PBXFrameworksBuildPhase; 85 | buildActionMask = 2147483647; 86 | files = ( 87 | A3169DBA1DE05E8300BABAFD /* SideNavigationController.framework in Frameworks */, 88 | D431FCC86A134B13C4FE43FA /* Pods_Tests_SideNavigationControllerTests_iOS.framework in Frameworks */, 89 | ); 90 | runOnlyForDeploymentPostprocessing = 0; 91 | }; 92 | A3169DEB1DE0718900BABAFD /* Frameworks */ = { 93 | isa = PBXFrameworksBuildPhase; 94 | buildActionMask = 2147483647; 95 | files = ( 96 | AFC250B362379E292E2D3254 /* Pods_Frameworks_SideNavigationController_tvOS.framework in Frameworks */, 97 | ); 98 | runOnlyForDeploymentPostprocessing = 0; 99 | }; 100 | A3169DF41DE0718900BABAFD /* Frameworks */ = { 101 | isa = PBXFrameworksBuildPhase; 102 | buildActionMask = 2147483647; 103 | files = ( 104 | A3169DF81DE0718900BABAFD /* SideNavigationController.framework in Frameworks */, 105 | 4DE06866156BD64874277C9E /* Pods_Tests_SideNavigationControllerTests_tvOS.framework in Frameworks */, 106 | ); 107 | runOnlyForDeploymentPostprocessing = 0; 108 | }; 109 | /* End PBXFrameworksBuildPhase section */ 110 | 111 | /* Begin PBXGroup section */ 112 | 58DBF5FB6EE3B109CCC86FD6 /* Pods */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 5EACA27D15F258AE6141E2B4 /* Pods-Frameworks-SideNavigationController-iOS.debug.xcconfig */, 116 | FF3E7B399FB5E1559FF8E0B0 /* Pods-Frameworks-SideNavigationController-iOS.release.xcconfig */, 117 | F4809B5CE9A27D14E207959C /* Pods-Frameworks-SideNavigationController-tvOS.debug.xcconfig */, 118 | 5348EBF207A6CF9116174BC1 /* Pods-Frameworks-SideNavigationController-tvOS.release.xcconfig */, 119 | 75E26923B13FAD9F3851B41B /* Pods-Tests-SideNavigationControllerTests-iOS.debug.xcconfig */, 120 | 7726579128038F991ECED9E9 /* Pods-Tests-SideNavigationControllerTests-iOS.release.xcconfig */, 121 | E3A356BAFDAD87A508B964EB /* Pods-Tests-SideNavigationControllerTests-tvOS.debug.xcconfig */, 122 | 34AE35334D57387D7B6D2F3A /* Pods-Tests-SideNavigationControllerTests-tvOS.release.xcconfig */, 123 | ); 124 | name = Pods; 125 | sourceTree = ""; 126 | }; 127 | A3169DA61DE05E8300BABAFD = { 128 | isa = PBXGroup; 129 | children = ( 130 | A3169DCA1DE0629100BABAFD /* Sources */, 131 | A3169DCF1DE062A000BABAFD /* Tests */, 132 | A3169DB11DE05E8300BABAFD /* Products */, 133 | 58DBF5FB6EE3B109CCC86FD6 /* Pods */, 134 | D29A4918F9F432676E2B1B4F /* Frameworks */, 135 | ); 136 | sourceTree = ""; 137 | }; 138 | A3169DB11DE05E8300BABAFD /* Products */ = { 139 | isa = PBXGroup; 140 | children = ( 141 | A3169DB01DE05E8300BABAFD /* SideNavigationController.framework */, 142 | A3169DB91DE05E8300BABAFD /* SideNavigationControllerTests-iOS.xctest */, 143 | A3169DDE1DE06EF400BABAFD /* SideNavigationController.framework */, 144 | A3169DEF1DE0718900BABAFD /* SideNavigationController.framework */, 145 | A3169DF71DE0718900BABAFD /* SideNavigationControllerTests-tvOS.xctest */, 146 | A3169E0C1DE072C700BABAFD /* SideNavigationController.framework */, 147 | A3169E141DE072C800BABAFD /* SideNavigationControllerTests-OSX.xctest */, 148 | ); 149 | name = Products; 150 | sourceTree = ""; 151 | }; 152 | A3169DCA1DE0629100BABAFD /* Sources */ = { 153 | isa = PBXGroup; 154 | children = ( 155 | A3169E751DE083D900BABAFD /* SideNavigationController.h */, 156 | A3A0AEB91E6073AE00F2D9B6 /* SideNavigationController.swift */, 157 | A3ED885A1E76AF9E006438EF /* SideNavigationController+NestedTypes.swift */, 158 | A3ED88571E76AF80006438EF /* UIViewController+SideNavigationController.swift */, 159 | A3169DCC1DE0629100BABAFD /* Info.plist */, 160 | ); 161 | path = Sources; 162 | sourceTree = ""; 163 | }; 164 | A3169DCF1DE062A000BABAFD /* Tests */ = { 165 | isa = PBXGroup; 166 | children = ( 167 | A38EF2C61DECF97000637484 /* SideNavigationControllerTests */, 168 | A3169DD11DE062A000BABAFD /* Info.plist */, 169 | ); 170 | path = Tests; 171 | sourceTree = ""; 172 | }; 173 | A38EF2C61DECF97000637484 /* SideNavigationControllerTests */ = { 174 | isa = PBXGroup; 175 | children = ( 176 | A38EF2C71DECF97000637484 /* SideNavigationControllerTests.swift */, 177 | ); 178 | path = SideNavigationControllerTests; 179 | sourceTree = ""; 180 | }; 181 | D29A4918F9F432676E2B1B4F /* Frameworks */ = { 182 | isa = PBXGroup; 183 | children = ( 184 | CDB7A3727755B3B81F83C59B /* Pods_Frameworks_SideNavigationController_iOS.framework */, 185 | 6254FBA17163EABFDEEC29C5 /* Pods_Frameworks_SideNavigationController_tvOS.framework */, 186 | DA4939F0E316EAC3E524EB68 /* Pods_Tests_SideNavigationControllerTests_iOS.framework */, 187 | 00818DDDDE8B5C19763566A3 /* Pods_Tests_SideNavigationControllerTests_tvOS.framework */, 188 | ); 189 | name = Frameworks; 190 | sourceTree = ""; 191 | }; 192 | /* End PBXGroup section */ 193 | 194 | /* Begin PBXHeadersBuildPhase section */ 195 | A3169E281DE07B0500BABAFD /* Headers */ = { 196 | isa = PBXHeadersBuildPhase; 197 | buildActionMask = 2147483647; 198 | files = ( 199 | A3169E781DE083D900BABAFD /* SideNavigationController.h in Headers */, 200 | ); 201 | runOnlyForDeploymentPostprocessing = 0; 202 | }; 203 | A3169E631DE0804300BABAFD /* Headers */ = { 204 | isa = PBXHeadersBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | A3169E761DE083D900BABAFD /* SideNavigationController.h in Headers */, 208 | ); 209 | runOnlyForDeploymentPostprocessing = 0; 210 | }; 211 | /* End PBXHeadersBuildPhase section */ 212 | 213 | /* Begin PBXNativeTarget section */ 214 | A3169DAF1DE05E8300BABAFD /* SideNavigationController-iOS */ = { 215 | isa = PBXNativeTarget; 216 | buildConfigurationList = A3169DC41DE05E8300BABAFD /* Build configuration list for PBXNativeTarget "SideNavigationController-iOS" */; 217 | buildPhases = ( 218 | 5E19F302A570153F12FAE974 /* [CP] Check Pods Manifest.lock */, 219 | A3169DAB1DE05E8300BABAFD /* Sources */, 220 | A3169DAC1DE05E8300BABAFD /* Frameworks */, 221 | A3169DAE1DE05E8300BABAFD /* Resources */, 222 | A3169DD81DE0654400BABAFD /* Swiftlint */, 223 | A3169E631DE0804300BABAFD /* Headers */, 224 | ); 225 | buildRules = ( 226 | ); 227 | dependencies = ( 228 | ); 229 | name = "SideNavigationController-iOS"; 230 | productName = SideNavigationController; 231 | productReference = A3169DB01DE05E8300BABAFD /* SideNavigationController.framework */; 232 | productType = "com.apple.product-type.framework"; 233 | }; 234 | A3169DB81DE05E8300BABAFD /* SideNavigationControllerTests-iOS */ = { 235 | isa = PBXNativeTarget; 236 | buildConfigurationList = A3169DC71DE05E8300BABAFD /* Build configuration list for PBXNativeTarget "SideNavigationControllerTests-iOS" */; 237 | buildPhases = ( 238 | 1FDB570F531CF713A43D990E /* [CP] Check Pods Manifest.lock */, 239 | A3169DB51DE05E8300BABAFD /* Sources */, 240 | A3169DB61DE05E8300BABAFD /* Frameworks */, 241 | A3169DB71DE05E8300BABAFD /* Resources */, 242 | ); 243 | buildRules = ( 244 | ); 245 | dependencies = ( 246 | A3169DBC1DE05E8300BABAFD /* PBXTargetDependency */, 247 | ); 248 | name = "SideNavigationControllerTests-iOS"; 249 | productName = SideNavigationControllerTests; 250 | productReference = A3169DB91DE05E8300BABAFD /* SideNavigationControllerTests-iOS.xctest */; 251 | productType = "com.apple.product-type.bundle.unit-test"; 252 | }; 253 | A3169DEE1DE0718900BABAFD /* SideNavigationController-tvOS */ = { 254 | isa = PBXNativeTarget; 255 | buildConfigurationList = A3169E001DE0718900BABAFD /* Build configuration list for PBXNativeTarget "SideNavigationController-tvOS" */; 256 | buildPhases = ( 257 | B2B0D3CD8D65D995B2A0509F /* [CP] Check Pods Manifest.lock */, 258 | A3169DEA1DE0718900BABAFD /* Sources */, 259 | A3169DEB1DE0718900BABAFD /* Frameworks */, 260 | A3169DED1DE0718900BABAFD /* Resources */, 261 | A3169E061DE0727A00BABAFD /* Swiftlint */, 262 | A3169E281DE07B0500BABAFD /* Headers */, 263 | ); 264 | buildRules = ( 265 | ); 266 | dependencies = ( 267 | ); 268 | name = "SideNavigationController-tvOS"; 269 | productName = SideNavigationController; 270 | productReference = A3169DEF1DE0718900BABAFD /* SideNavigationController.framework */; 271 | productType = "com.apple.product-type.framework"; 272 | }; 273 | A3169DF61DE0718900BABAFD /* SideNavigationControllerTests-tvOS */ = { 274 | isa = PBXNativeTarget; 275 | buildConfigurationList = A3169E031DE0718900BABAFD /* Build configuration list for PBXNativeTarget "SideNavigationControllerTests-tvOS" */; 276 | buildPhases = ( 277 | 6BE62C142BE784A263C3A1FA /* [CP] Check Pods Manifest.lock */, 278 | A3169DF31DE0718900BABAFD /* Sources */, 279 | A3169DF41DE0718900BABAFD /* Frameworks */, 280 | A3169DF51DE0718900BABAFD /* Resources */, 281 | ); 282 | buildRules = ( 283 | ); 284 | dependencies = ( 285 | A3169DFA1DE0718900BABAFD /* PBXTargetDependency */, 286 | ); 287 | name = "SideNavigationControllerTests-tvOS"; 288 | productName = SideNavigationControllerTests; 289 | productReference = A3169DF71DE0718900BABAFD /* SideNavigationControllerTests-tvOS.xctest */; 290 | productType = "com.apple.product-type.bundle.unit-test"; 291 | }; 292 | /* End PBXNativeTarget section */ 293 | 294 | /* Begin PBXProject section */ 295 | A3169DA71DE05E8300BABAFD /* Project object */ = { 296 | isa = PBXProject; 297 | attributes = { 298 | LastSwiftUpdateCheck = 0810; 299 | LastUpgradeCheck = 1020; 300 | ORGANIZATIONNAME = Digipolitan; 301 | TargetAttributes = { 302 | A3169DAF1DE05E8300BABAFD = { 303 | CreatedOnToolsVersion = 8.1; 304 | DevelopmentTeam = 582762VK3P; 305 | LastSwiftMigration = 0820; 306 | ProvisioningStyle = Automatic; 307 | }; 308 | A3169DB81DE05E8300BABAFD = { 309 | CreatedOnToolsVersion = 8.1; 310 | DevelopmentTeam = 582762VK3P; 311 | ProvisioningStyle = Automatic; 312 | }; 313 | A3169DEE1DE0718900BABAFD = { 314 | CreatedOnToolsVersion = 8.1; 315 | DevelopmentTeam = 582762VK3P; 316 | LastSwiftMigration = 0820; 317 | ProvisioningStyle = Automatic; 318 | }; 319 | A3169DF61DE0718900BABAFD = { 320 | CreatedOnToolsVersion = 8.1; 321 | DevelopmentTeam = 582762VK3P; 322 | ProvisioningStyle = Automatic; 323 | }; 324 | }; 325 | }; 326 | buildConfigurationList = A3169DAA1DE05E8300BABAFD /* Build configuration list for PBXProject "SideNavigationController" */; 327 | compatibilityVersion = "Xcode 3.2"; 328 | developmentRegion = en; 329 | hasScannedForEncodings = 0; 330 | knownRegions = ( 331 | en, 332 | Base, 333 | ); 334 | mainGroup = A3169DA61DE05E8300BABAFD; 335 | productRefGroup = A3169DB11DE05E8300BABAFD /* Products */; 336 | projectDirPath = ""; 337 | projectRoot = ""; 338 | targets = ( 339 | A3169DAF1DE05E8300BABAFD /* SideNavigationController-iOS */, 340 | A3169DB81DE05E8300BABAFD /* SideNavigationControllerTests-iOS */, 341 | A3169DEE1DE0718900BABAFD /* SideNavigationController-tvOS */, 342 | A3169DF61DE0718900BABAFD /* SideNavigationControllerTests-tvOS */, 343 | ); 344 | }; 345 | /* End PBXProject section */ 346 | 347 | /* Begin PBXResourcesBuildPhase section */ 348 | A3169DAE1DE05E8300BABAFD /* Resources */ = { 349 | isa = PBXResourcesBuildPhase; 350 | buildActionMask = 2147483647; 351 | files = ( 352 | ); 353 | runOnlyForDeploymentPostprocessing = 0; 354 | }; 355 | A3169DB71DE05E8300BABAFD /* Resources */ = { 356 | isa = PBXResourcesBuildPhase; 357 | buildActionMask = 2147483647; 358 | files = ( 359 | ); 360 | runOnlyForDeploymentPostprocessing = 0; 361 | }; 362 | A3169DED1DE0718900BABAFD /* Resources */ = { 363 | isa = PBXResourcesBuildPhase; 364 | buildActionMask = 2147483647; 365 | files = ( 366 | ); 367 | runOnlyForDeploymentPostprocessing = 0; 368 | }; 369 | A3169DF51DE0718900BABAFD /* Resources */ = { 370 | isa = PBXResourcesBuildPhase; 371 | buildActionMask = 2147483647; 372 | files = ( 373 | ); 374 | runOnlyForDeploymentPostprocessing = 0; 375 | }; 376 | /* End PBXResourcesBuildPhase section */ 377 | 378 | /* Begin PBXShellScriptBuildPhase section */ 379 | 1FDB570F531CF713A43D990E /* [CP] Check Pods Manifest.lock */ = { 380 | isa = PBXShellScriptBuildPhase; 381 | buildActionMask = 2147483647; 382 | files = ( 383 | ); 384 | inputPaths = ( 385 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 386 | "${PODS_ROOT}/Manifest.lock", 387 | ); 388 | name = "[CP] Check Pods Manifest.lock"; 389 | outputPaths = ( 390 | "$(DERIVED_FILE_DIR)/Pods-Tests-SideNavigationControllerTests-iOS-checkManifestLockResult.txt", 391 | ); 392 | runOnlyForDeploymentPostprocessing = 0; 393 | shellPath = /bin/sh; 394 | 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"; 395 | showEnvVarsInLog = 0; 396 | }; 397 | 5E19F302A570153F12FAE974 /* [CP] Check Pods Manifest.lock */ = { 398 | isa = PBXShellScriptBuildPhase; 399 | buildActionMask = 2147483647; 400 | files = ( 401 | ); 402 | inputPaths = ( 403 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 404 | "${PODS_ROOT}/Manifest.lock", 405 | ); 406 | name = "[CP] Check Pods Manifest.lock"; 407 | outputPaths = ( 408 | "$(DERIVED_FILE_DIR)/Pods-Frameworks-SideNavigationController-iOS-checkManifestLockResult.txt", 409 | ); 410 | runOnlyForDeploymentPostprocessing = 0; 411 | shellPath = /bin/sh; 412 | 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"; 413 | showEnvVarsInLog = 0; 414 | }; 415 | 6BE62C142BE784A263C3A1FA /* [CP] Check Pods Manifest.lock */ = { 416 | isa = PBXShellScriptBuildPhase; 417 | buildActionMask = 2147483647; 418 | files = ( 419 | ); 420 | inputPaths = ( 421 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 422 | "${PODS_ROOT}/Manifest.lock", 423 | ); 424 | name = "[CP] Check Pods Manifest.lock"; 425 | outputPaths = ( 426 | "$(DERIVED_FILE_DIR)/Pods-Tests-SideNavigationControllerTests-tvOS-checkManifestLockResult.txt", 427 | ); 428 | runOnlyForDeploymentPostprocessing = 0; 429 | shellPath = /bin/sh; 430 | 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"; 431 | showEnvVarsInLog = 0; 432 | }; 433 | A3169DD81DE0654400BABAFD /* Swiftlint */ = { 434 | isa = PBXShellScriptBuildPhase; 435 | buildActionMask = 2147483647; 436 | files = ( 437 | ); 438 | inputPaths = ( 439 | ); 440 | name = Swiftlint; 441 | outputPaths = ( 442 | ); 443 | runOnlyForDeploymentPostprocessing = 0; 444 | shellPath = /bin/sh; 445 | shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; 446 | }; 447 | A3169E061DE0727A00BABAFD /* Swiftlint */ = { 448 | isa = PBXShellScriptBuildPhase; 449 | buildActionMask = 2147483647; 450 | files = ( 451 | ); 452 | inputPaths = ( 453 | ); 454 | name = Swiftlint; 455 | outputPaths = ( 456 | ); 457 | runOnlyForDeploymentPostprocessing = 0; 458 | shellPath = /bin/sh; 459 | shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; 460 | }; 461 | B2B0D3CD8D65D995B2A0509F /* [CP] Check Pods Manifest.lock */ = { 462 | isa = PBXShellScriptBuildPhase; 463 | buildActionMask = 2147483647; 464 | files = ( 465 | ); 466 | inputPaths = ( 467 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 468 | "${PODS_ROOT}/Manifest.lock", 469 | ); 470 | name = "[CP] Check Pods Manifest.lock"; 471 | outputPaths = ( 472 | "$(DERIVED_FILE_DIR)/Pods-Frameworks-SideNavigationController-tvOS-checkManifestLockResult.txt", 473 | ); 474 | runOnlyForDeploymentPostprocessing = 0; 475 | shellPath = /bin/sh; 476 | 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"; 477 | showEnvVarsInLog = 0; 478 | }; 479 | /* End PBXShellScriptBuildPhase section */ 480 | 481 | /* Begin PBXSourcesBuildPhase section */ 482 | A3169DAB1DE05E8300BABAFD /* Sources */ = { 483 | isa = PBXSourcesBuildPhase; 484 | buildActionMask = 2147483647; 485 | files = ( 486 | A3A0AEBA1E6073AE00F2D9B6 /* SideNavigationController.swift in Sources */, 487 | A3ED885B1E76AF9E006438EF /* SideNavigationController+NestedTypes.swift in Sources */, 488 | A3ED88581E76AF80006438EF /* UIViewController+SideNavigationController.swift in Sources */, 489 | ); 490 | runOnlyForDeploymentPostprocessing = 0; 491 | }; 492 | A3169DB51DE05E8300BABAFD /* Sources */ = { 493 | isa = PBXSourcesBuildPhase; 494 | buildActionMask = 2147483647; 495 | files = ( 496 | A38EF2CA1DECF97000637484 /* SideNavigationControllerTests.swift in Sources */, 497 | ); 498 | runOnlyForDeploymentPostprocessing = 0; 499 | }; 500 | A3169DEA1DE0718900BABAFD /* Sources */ = { 501 | isa = PBXSourcesBuildPhase; 502 | buildActionMask = 2147483647; 503 | files = ( 504 | A3A0AEBB1E6073AE00F2D9B6 /* SideNavigationController.swift in Sources */, 505 | A3ED885C1E76AF9E006438EF /* SideNavigationController+NestedTypes.swift in Sources */, 506 | A3ED88591E76AF80006438EF /* UIViewController+SideNavigationController.swift in Sources */, 507 | ); 508 | runOnlyForDeploymentPostprocessing = 0; 509 | }; 510 | A3169DF31DE0718900BABAFD /* Sources */ = { 511 | isa = PBXSourcesBuildPhase; 512 | buildActionMask = 2147483647; 513 | files = ( 514 | A38EF2CB1DECF97000637484 /* SideNavigationControllerTests.swift in Sources */, 515 | ); 516 | runOnlyForDeploymentPostprocessing = 0; 517 | }; 518 | /* End PBXSourcesBuildPhase section */ 519 | 520 | /* Begin PBXTargetDependency section */ 521 | A3169DBC1DE05E8300BABAFD /* PBXTargetDependency */ = { 522 | isa = PBXTargetDependency; 523 | target = A3169DAF1DE05E8300BABAFD /* SideNavigationController-iOS */; 524 | targetProxy = A3169DBB1DE05E8300BABAFD /* PBXContainerItemProxy */; 525 | }; 526 | A3169DFA1DE0718900BABAFD /* PBXTargetDependency */ = { 527 | isa = PBXTargetDependency; 528 | target = A3169DEE1DE0718900BABAFD /* SideNavigationController-tvOS */; 529 | targetProxy = A3169DF91DE0718900BABAFD /* PBXContainerItemProxy */; 530 | }; 531 | /* End PBXTargetDependency section */ 532 | 533 | /* Begin XCBuildConfiguration section */ 534 | A3169DC21DE05E8300BABAFD /* Debug */ = { 535 | isa = XCBuildConfiguration; 536 | buildSettings = { 537 | ALWAYS_SEARCH_USER_PATHS = NO; 538 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 539 | CLANG_ANALYZER_NONNULL = YES; 540 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 541 | CLANG_CXX_LIBRARY = "libc++"; 542 | CLANG_ENABLE_OBJC_ARC = YES; 543 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 544 | CLANG_WARN_BOOL_CONVERSION = YES; 545 | CLANG_WARN_COMMA = YES; 546 | CLANG_WARN_CONSTANT_CONVERSION = YES; 547 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 548 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 549 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 550 | CLANG_WARN_EMPTY_BODY = YES; 551 | CLANG_WARN_ENUM_CONVERSION = YES; 552 | CLANG_WARN_INFINITE_RECURSION = YES; 553 | CLANG_WARN_INT_CONVERSION = YES; 554 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 555 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 556 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 557 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 558 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 559 | CLANG_WARN_STRICT_PROTOTYPES = YES; 560 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 561 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 562 | CLANG_WARN_UNREACHABLE_CODE = YES; 563 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 564 | COPY_PHASE_STRIP = NO; 565 | CURRENT_PROJECT_VERSION = 1; 566 | DEBUG_INFORMATION_FORMAT = dwarf; 567 | ENABLE_STRICT_OBJC_MSGSEND = YES; 568 | ENABLE_TESTABILITY = YES; 569 | GCC_C_LANGUAGE_STANDARD = gnu99; 570 | GCC_DYNAMIC_NO_PIC = NO; 571 | GCC_NO_COMMON_BLOCKS = YES; 572 | GCC_OPTIMIZATION_LEVEL = 0; 573 | GCC_PREPROCESSOR_DEFINITIONS = ( 574 | "DEBUG=1", 575 | "$(inherited)", 576 | ); 577 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 578 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 579 | GCC_WARN_UNDECLARED_SELECTOR = YES; 580 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 581 | GCC_WARN_UNUSED_FUNCTION = YES; 582 | GCC_WARN_UNUSED_VARIABLE = YES; 583 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 584 | MTL_ENABLE_DEBUG_INFO = YES; 585 | ONLY_ACTIVE_ARCH = YES; 586 | SDKROOT = iphoneos; 587 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 588 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 589 | SWIFT_VERSION = 5.0; 590 | TARGETED_DEVICE_FAMILY = "1,2,3"; 591 | VERSIONING_SYSTEM = "apple-generic"; 592 | VERSION_INFO_PREFIX = ""; 593 | }; 594 | name = Debug; 595 | }; 596 | A3169DC31DE05E8300BABAFD /* Release */ = { 597 | isa = XCBuildConfiguration; 598 | buildSettings = { 599 | ALWAYS_SEARCH_USER_PATHS = NO; 600 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 601 | CLANG_ANALYZER_NONNULL = YES; 602 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 603 | CLANG_CXX_LIBRARY = "libc++"; 604 | CLANG_ENABLE_OBJC_ARC = YES; 605 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 606 | CLANG_WARN_BOOL_CONVERSION = YES; 607 | CLANG_WARN_COMMA = YES; 608 | CLANG_WARN_CONSTANT_CONVERSION = YES; 609 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 610 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 611 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 612 | CLANG_WARN_EMPTY_BODY = YES; 613 | CLANG_WARN_ENUM_CONVERSION = YES; 614 | CLANG_WARN_INFINITE_RECURSION = YES; 615 | CLANG_WARN_INT_CONVERSION = YES; 616 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 617 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 618 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 619 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 620 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 621 | CLANG_WARN_STRICT_PROTOTYPES = YES; 622 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 623 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 624 | CLANG_WARN_UNREACHABLE_CODE = YES; 625 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 626 | COPY_PHASE_STRIP = NO; 627 | CURRENT_PROJECT_VERSION = 1; 628 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 629 | ENABLE_NS_ASSERTIONS = NO; 630 | ENABLE_STRICT_OBJC_MSGSEND = YES; 631 | GCC_C_LANGUAGE_STANDARD = gnu99; 632 | GCC_NO_COMMON_BLOCKS = YES; 633 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 634 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 635 | GCC_WARN_UNDECLARED_SELECTOR = YES; 636 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 637 | GCC_WARN_UNUSED_FUNCTION = YES; 638 | GCC_WARN_UNUSED_VARIABLE = YES; 639 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 640 | MTL_ENABLE_DEBUG_INFO = NO; 641 | SDKROOT = iphoneos; 642 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 643 | SWIFT_VERSION = 5.0; 644 | TARGETED_DEVICE_FAMILY = "1,2,3"; 645 | VALIDATE_PRODUCT = YES; 646 | VERSIONING_SYSTEM = "apple-generic"; 647 | VERSION_INFO_PREFIX = ""; 648 | }; 649 | name = Release; 650 | }; 651 | A3169DC51DE05E8300BABAFD /* Debug */ = { 652 | isa = XCBuildConfiguration; 653 | baseConfigurationReference = 5EACA27D15F258AE6141E2B4 /* Pods-Frameworks-SideNavigationController-iOS.debug.xcconfig */; 654 | buildSettings = { 655 | CLANG_ENABLE_MODULES = YES; 656 | CODE_SIGN_IDENTITY = "iPhone Developer"; 657 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 658 | DEFINES_MODULE = YES; 659 | DEVELOPMENT_TEAM = 582762VK3P; 660 | DYLIB_COMPATIBILITY_VERSION = 1; 661 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 662 | INFOPLIST_FILE = Sources/Info.plist; 663 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 664 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 665 | PRODUCT_BUNDLE_IDENTIFIER = com.digipolitan.sidenavigation; 666 | PRODUCT_NAME = SideNavigationController; 667 | SKIP_INSTALL = YES; 668 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 669 | TARGETED_DEVICE_FAMILY = "1,2"; 670 | }; 671 | name = Debug; 672 | }; 673 | A3169DC61DE05E8300BABAFD /* Release */ = { 674 | isa = XCBuildConfiguration; 675 | baseConfigurationReference = FF3E7B399FB5E1559FF8E0B0 /* Pods-Frameworks-SideNavigationController-iOS.release.xcconfig */; 676 | buildSettings = { 677 | CLANG_ENABLE_MODULES = YES; 678 | CODE_SIGN_IDENTITY = "iPhone Developer"; 679 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 680 | DEFINES_MODULE = YES; 681 | DEVELOPMENT_TEAM = 582762VK3P; 682 | DYLIB_COMPATIBILITY_VERSION = 1; 683 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 684 | INFOPLIST_FILE = Sources/Info.plist; 685 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 686 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 687 | PRODUCT_BUNDLE_IDENTIFIER = com.digipolitan.sidenavigation; 688 | PRODUCT_NAME = SideNavigationController; 689 | SKIP_INSTALL = YES; 690 | TARGETED_DEVICE_FAMILY = "1,2"; 691 | }; 692 | name = Release; 693 | }; 694 | A3169DC81DE05E8300BABAFD /* Debug */ = { 695 | isa = XCBuildConfiguration; 696 | baseConfigurationReference = 75E26923B13FAD9F3851B41B /* Pods-Tests-SideNavigationControllerTests-iOS.debug.xcconfig */; 697 | buildSettings = { 698 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 699 | CURRENT_PROJECT_VERSION = 1; 700 | DEVELOPMENT_TEAM = 582762VK3P; 701 | INFOPLIST_FILE = Tests/Info.plist; 702 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 703 | PRODUCT_BUNDLE_IDENTIFIER = com.digipolitan.SideNavigationControllerTests; 704 | PRODUCT_NAME = "$(TARGET_NAME)"; 705 | }; 706 | name = Debug; 707 | }; 708 | A3169DC91DE05E8300BABAFD /* Release */ = { 709 | isa = XCBuildConfiguration; 710 | baseConfigurationReference = 7726579128038F991ECED9E9 /* Pods-Tests-SideNavigationControllerTests-iOS.release.xcconfig */; 711 | buildSettings = { 712 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 713 | CURRENT_PROJECT_VERSION = 1; 714 | DEVELOPMENT_TEAM = 582762VK3P; 715 | INFOPLIST_FILE = Tests/Info.plist; 716 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 717 | PRODUCT_BUNDLE_IDENTIFIER = com.digipolitan.SideNavigationControllerTests; 718 | PRODUCT_NAME = "$(TARGET_NAME)"; 719 | }; 720 | name = Release; 721 | }; 722 | A3169E011DE0718900BABAFD /* Debug */ = { 723 | isa = XCBuildConfiguration; 724 | baseConfigurationReference = F4809B5CE9A27D14E207959C /* Pods-Frameworks-SideNavigationController-tvOS.debug.xcconfig */; 725 | buildSettings = { 726 | CLANG_ENABLE_MODULES = YES; 727 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 728 | DEFINES_MODULE = YES; 729 | DEVELOPMENT_TEAM = 582762VK3P; 730 | DYLIB_COMPATIBILITY_VERSION = 1; 731 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 732 | INFOPLIST_FILE = Sources/Info.plist; 733 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 734 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 735 | PRODUCT_BUNDLE_IDENTIFIER = com.digipolitan.sidenavigation; 736 | PRODUCT_NAME = SideNavigationController; 737 | SDKROOT = appletvos; 738 | SKIP_INSTALL = YES; 739 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 740 | TARGETED_DEVICE_FAMILY = 3; 741 | TVOS_DEPLOYMENT_TARGET = 9.0; 742 | }; 743 | name = Debug; 744 | }; 745 | A3169E021DE0718900BABAFD /* Release */ = { 746 | isa = XCBuildConfiguration; 747 | baseConfigurationReference = 5348EBF207A6CF9116174BC1 /* Pods-Frameworks-SideNavigationController-tvOS.release.xcconfig */; 748 | buildSettings = { 749 | CLANG_ENABLE_MODULES = YES; 750 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 751 | DEFINES_MODULE = YES; 752 | DEVELOPMENT_TEAM = 582762VK3P; 753 | DYLIB_COMPATIBILITY_VERSION = 1; 754 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 755 | INFOPLIST_FILE = Sources/Info.plist; 756 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 757 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 758 | PRODUCT_BUNDLE_IDENTIFIER = com.digipolitan.sidenavigation; 759 | PRODUCT_NAME = SideNavigationController; 760 | SDKROOT = appletvos; 761 | SKIP_INSTALL = YES; 762 | TARGETED_DEVICE_FAMILY = 3; 763 | TVOS_DEPLOYMENT_TARGET = 9.0; 764 | }; 765 | name = Release; 766 | }; 767 | A3169E041DE0718900BABAFD /* Debug */ = { 768 | isa = XCBuildConfiguration; 769 | baseConfigurationReference = E3A356BAFDAD87A508B964EB /* Pods-Tests-SideNavigationControllerTests-tvOS.debug.xcconfig */; 770 | buildSettings = { 771 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 772 | CURRENT_PROJECT_VERSION = 1; 773 | DEVELOPMENT_TEAM = 582762VK3P; 774 | INFOPLIST_FILE = Tests/Info.plist; 775 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 776 | PRODUCT_BUNDLE_IDENTIFIER = com.digipolitan.SideNavigationControllerTests; 777 | PRODUCT_NAME = "$(TARGET_NAME)"; 778 | SDKROOT = appletvos; 779 | TVOS_DEPLOYMENT_TARGET = 10.0; 780 | }; 781 | name = Debug; 782 | }; 783 | A3169E051DE0718900BABAFD /* Release */ = { 784 | isa = XCBuildConfiguration; 785 | baseConfigurationReference = 34AE35334D57387D7B6D2F3A /* Pods-Tests-SideNavigationControllerTests-tvOS.release.xcconfig */; 786 | buildSettings = { 787 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 788 | CURRENT_PROJECT_VERSION = 1; 789 | DEVELOPMENT_TEAM = 582762VK3P; 790 | INFOPLIST_FILE = Tests/Info.plist; 791 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 792 | PRODUCT_BUNDLE_IDENTIFIER = com.digipolitan.SideNavigationControllerTests; 793 | PRODUCT_NAME = "$(TARGET_NAME)"; 794 | SDKROOT = appletvos; 795 | TVOS_DEPLOYMENT_TARGET = 10.0; 796 | }; 797 | name = Release; 798 | }; 799 | /* End XCBuildConfiguration section */ 800 | 801 | /* Begin XCConfigurationList section */ 802 | A3169DAA1DE05E8300BABAFD /* Build configuration list for PBXProject "SideNavigationController" */ = { 803 | isa = XCConfigurationList; 804 | buildConfigurations = ( 805 | A3169DC21DE05E8300BABAFD /* Debug */, 806 | A3169DC31DE05E8300BABAFD /* Release */, 807 | ); 808 | defaultConfigurationIsVisible = 0; 809 | defaultConfigurationName = Release; 810 | }; 811 | A3169DC41DE05E8300BABAFD /* Build configuration list for PBXNativeTarget "SideNavigationController-iOS" */ = { 812 | isa = XCConfigurationList; 813 | buildConfigurations = ( 814 | A3169DC51DE05E8300BABAFD /* Debug */, 815 | A3169DC61DE05E8300BABAFD /* Release */, 816 | ); 817 | defaultConfigurationIsVisible = 0; 818 | defaultConfigurationName = Release; 819 | }; 820 | A3169DC71DE05E8300BABAFD /* Build configuration list for PBXNativeTarget "SideNavigationControllerTests-iOS" */ = { 821 | isa = XCConfigurationList; 822 | buildConfigurations = ( 823 | A3169DC81DE05E8300BABAFD /* Debug */, 824 | A3169DC91DE05E8300BABAFD /* Release */, 825 | ); 826 | defaultConfigurationIsVisible = 0; 827 | defaultConfigurationName = Release; 828 | }; 829 | A3169E001DE0718900BABAFD /* Build configuration list for PBXNativeTarget "SideNavigationController-tvOS" */ = { 830 | isa = XCConfigurationList; 831 | buildConfigurations = ( 832 | A3169E011DE0718900BABAFD /* Debug */, 833 | A3169E021DE0718900BABAFD /* Release */, 834 | ); 835 | defaultConfigurationIsVisible = 0; 836 | defaultConfigurationName = Release; 837 | }; 838 | A3169E031DE0718900BABAFD /* Build configuration list for PBXNativeTarget "SideNavigationControllerTests-tvOS" */ = { 839 | isa = XCConfigurationList; 840 | buildConfigurations = ( 841 | A3169E041DE0718900BABAFD /* Debug */, 842 | A3169E051DE0718900BABAFD /* Release */, 843 | ); 844 | defaultConfigurationIsVisible = 0; 845 | defaultConfigurationName = Release; 846 | }; 847 | /* End XCConfigurationList section */ 848 | }; 849 | rootObject = A3169DA71DE05E8300BABAFD /* Project object */; 850 | } 851 | -------------------------------------------------------------------------------- /SideNavigationController.xcodeproj/xcshareddata/xcschemes/SideNavigationController-iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 34 | 40 | 41 | 42 | 43 | 44 | 50 | 51 | 52 | 53 | 54 | 55 | 65 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 84 | 90 | 91 | 92 | 93 | 95 | 96 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /SideNavigationController.xcodeproj/xcshareddata/xcschemes/SideNavigationController-tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /SideNavigationController.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /SideNavigationController.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | fr_FR 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.1 19 | CFBundleVersion 20 | 1 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Sources/SideNavigationController+NestedTypes.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SideNavigationController+NestedTypes.swift 3 | // SideNavigationController 4 | // 5 | // Created by Benoit BRIATTE on 13/03/2017. 6 | // Copyright © 2017 Digipolitan. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public extension SideNavigationController { 12 | 13 | enum Position { 14 | case front 15 | case back 16 | } 17 | 18 | struct Side { 19 | 20 | public let viewController: UIViewController 21 | public let options: Options 22 | 23 | public init(viewController: UIViewController, options: Options) { 24 | self.viewController = viewController 25 | self.options = options 26 | } 27 | } 28 | 29 | struct Options { 30 | 31 | public static var defaultTintColor = UIColor.white 32 | 33 | public var widthPercent: CGFloat 34 | public var animationDuration: TimeInterval 35 | public var overlayColor: UIColor 36 | public var overlayOpacity: CGFloat 37 | public var shadowOpacity: CGFloat 38 | public var alwaysInteractionEnabled: Bool 39 | public var panningEnabled: Bool 40 | public var scale: CGFloat 41 | public var position: Position 42 | public var shadowColor: UIColor { 43 | get { 44 | return UIColor(cgColor: self.shadowCGColor) 45 | } 46 | set(newValue) { 47 | self.shadowCGColor = newValue.cgColor 48 | } 49 | } 50 | public fileprivate(set) var shadowCGColor: CGColor! 51 | 52 | public init(widthPercent: CGFloat = 0.33, 53 | animationDuration: TimeInterval = 0.3, 54 | overlayColor: UIColor = Options.defaultTintColor, 55 | overlayOpacity: CGFloat = 0.5, 56 | shadowColor: UIColor = Options.defaultTintColor, 57 | shadowOpacity: CGFloat = 0.8, 58 | alwaysInteractionEnabled: Bool = false, 59 | panningEnabled: Bool = true, 60 | scale: CGFloat = 1, 61 | position: Position = .back) { 62 | self.widthPercent = widthPercent 63 | self.animationDuration = animationDuration 64 | self.overlayColor = overlayColor 65 | self.overlayOpacity = overlayOpacity 66 | self.shadowOpacity = shadowOpacity 67 | self.alwaysInteractionEnabled = alwaysInteractionEnabled 68 | self.panningEnabled = panningEnabled 69 | self.scale = scale 70 | self.position = position 71 | self.shadowColor = shadowColor 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /Sources/SideNavigationController.h: -------------------------------------------------------------------------------- 1 | #ifndef _SIDENAVIGATIONCONTROLLER_H 2 | #define _SIDENAVIGATIONCONTROLLER_H 3 | 4 | #import 5 | 6 | //! Project version number for SideNavigationController 7 | FOUNDATION_EXPORT double SideNavigationControllerVersionNumber; 8 | 9 | //! Project version string for SideNavigationController 10 | FOUNDATION_EXPORT const unsigned char SideNavigationControllerVersionString[]; 11 | 12 | #endif /* _SIDENAVIGATIONCONTROLLER_H */ 13 | -------------------------------------------------------------------------------- /Sources/SideNavigationController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SideNavigationController.swift 3 | // SideNavigationController 4 | // 5 | // Created by Benoit BRIATTE on 24/02/2017. 6 | // Copyright © 2019 Digipolitan. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class SideNavigationController: UIViewController { 12 | 13 | private lazy var gestures: Gestures = { 14 | return Gestures(sideNavigationController: self) 15 | }() 16 | fileprivate lazy var overlay: UIView = { 17 | let overlay = UIView() 18 | overlay.isUserInteractionEnabled = false 19 | overlay.autoresizingMask = UIView.AutoresizingMask(rawValue: 0b111111) 20 | overlay.alpha = 0 21 | return overlay 22 | }() 23 | fileprivate lazy var mainContainer: UIView = { 24 | let mainContainer = UIView() 25 | mainContainer.autoresizingMask = UIView.AutoresizingMask(rawValue: 0b111111) 26 | return mainContainer 27 | }() 28 | 29 | fileprivate var sideProgress: CGFloat = 0 30 | fileprivate var revertSideDirection: Bool = false 31 | 32 | public private(set) var left: Side? 33 | public private(set) var right: Side? 34 | 35 | public var mainViewController: UIViewController! { 36 | willSet(newValue) { 37 | self.unlink(viewController: self.mainViewController) 38 | } 39 | didSet { 40 | if let mainViewController = self.mainViewController { 41 | self.link(viewController: mainViewController, in: self.mainContainer, at: 0) 42 | if self.isViewLoaded { 43 | mainViewController.view.frame = self.mainContainer.bounds 44 | } 45 | } 46 | } 47 | } 48 | 49 | public var visibleViewController: UIViewController { 50 | if self.visibleSideViewController != nil { 51 | return self.visibleSideViewController! 52 | } 53 | return self.mainViewController 54 | } 55 | 56 | public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 57 | super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 58 | } 59 | 60 | public required init?(coder aDecoder: NSCoder) { 61 | super.init(coder: aDecoder) 62 | } 63 | 64 | public convenience init(mainViewController: UIViewController) { 65 | self.init() 66 | // swiftlint:disable inert_defer 67 | defer { 68 | self.mainViewController = mainViewController 69 | } 70 | // swiftlint:enable inert_defer 71 | } 72 | 73 | fileprivate var visibleSideViewController: UIViewController? { 74 | willSet(newValue) { 75 | if self.visibleSideViewController != newValue { 76 | self.visibleSideViewController?.view.isHidden = true 77 | } 78 | } 79 | didSet { 80 | if self.visibleSideViewController != oldValue { 81 | self.visibleSideViewController?.view.isHidden = false 82 | #if os(iOS) 83 | self.setNeedsStatusBarAppearanceUpdate() 84 | if #available(iOS 11.0, *) { 85 | self.setNeedsUpdateOfHomeIndicatorAutoHidden() 86 | self.setNeedsUpdateOfScreenEdgesDeferringSystemGestures() 87 | } 88 | #elseif os(tvOS) 89 | self.setNeedsFocusUpdate() 90 | if #available(tvOS 11.0, *) { 91 | self.setNeedsUserInterfaceAppearanceUpdate() 92 | } 93 | #endif 94 | } 95 | } 96 | } 97 | 98 | fileprivate func side(direction: Direction) -> Side? { 99 | return direction == .left ? self.left : self.right 100 | } 101 | 102 | fileprivate func setSide(_ side: Side, direction: Direction) { 103 | if let old = self.side(direction: direction) { 104 | if old.viewController == self.visibleSideViewController { 105 | self.close(direction: direction, animated: false) 106 | } 107 | self.unlink(viewController: old.viewController) 108 | } 109 | side.viewController.view.isHidden = true 110 | self.link(viewController: side.viewController, at: side.options.position == .back ? 0 : -1) 111 | if direction == .left { 112 | self.left = side 113 | } else { 114 | self.right = side 115 | } 116 | self.updateSide(with: direction, progress: 0) 117 | #if os(iOS) 118 | self.sideGestures(enabled: true) 119 | #endif 120 | } 121 | 122 | open override func viewDidLoad() { 123 | super.viewDidLoad() 124 | 125 | self.mainContainer.frame = self.view.bounds 126 | let mainBounds = self.mainContainer.bounds 127 | self.overlay.frame = mainBounds 128 | self.mainContainer.addSubview(self.overlay) 129 | if let mainViewController = self.mainViewController { 130 | mainViewController.view.frame = mainBounds 131 | } 132 | self.view.addSubview(self.mainContainer) 133 | 134 | #if os(iOS) 135 | self.mainContainer.addGestureRecognizer(self.gestures.mainPan) 136 | self.mainContainer.addGestureRecognizer(self.gestures.mainTap) 137 | self.view.addGestureRecognizer(self.gestures.leftScreenEdgePan) 138 | self.view.addGestureRecognizer(self.gestures.rightScreenEdgePan) 139 | self.sideGestures(enabled: true) 140 | #elseif os(tvOS) 141 | self.view.addGestureRecognizer(self.gestures.mainPan) 142 | self.view.addGestureRecognizer(self.gestures.mainTap) 143 | #endif 144 | self.mainGestures(enabled: false) 145 | } 146 | 147 | private func link(viewController: UIViewController, in view: UIView? = nil, at position: Int = -1) { 148 | viewController.view.autoresizingMask = UIView.AutoresizingMask(rawValue: 0b111111) 149 | let container: UIView = view != nil ? view! : self.view 150 | self.addChild(viewController) 151 | if position < 0 { 152 | container.addSubview(viewController.view) 153 | } else { 154 | container.insertSubview(viewController.view, at: position) 155 | } 156 | } 157 | 158 | private func unlink(viewController: UIViewController?) { 159 | if let viewController = viewController { 160 | viewController.view.removeFromSuperview() 161 | viewController.removeFromParent() 162 | } 163 | } 164 | 165 | #if os(iOS) 166 | open override var childForStatusBarStyle: UIViewController? { 167 | return self.visibleViewController 168 | } 169 | 170 | open override var childForStatusBarHidden: UIViewController? { 171 | return self.visibleViewController 172 | } 173 | 174 | @available(iOS 11.0, *) 175 | open override var childForHomeIndicatorAutoHidden: UIViewController? { 176 | return self.visibleViewController 177 | } 178 | 179 | @available(iOS 11.0, *) 180 | open override var childForScreenEdgesDeferringSystemGestures: UIViewController? { 181 | return self.visibleViewController 182 | } 183 | #elseif os(tvOS) 184 | @available(tvOS 11.0, *) 185 | open override var childViewControllerForUserInterfaceStyle: UIViewController? { 186 | return self.visibleViewController 187 | } 188 | 189 | open override var preferredFocusEnvironments: [UIFocusEnvironment] { 190 | return self.visibleViewController.preferredFocusEnvironments 191 | } 192 | #endif 193 | 194 | public func leftSide(viewController: UIViewController, options: Options = Options()) { 195 | self.setSide(Side(viewController: viewController, options: options), direction: .left) 196 | } 197 | 198 | public func rightSide(viewController: UIViewController, options: Options = Options()) { 199 | self.setSide(Side(viewController: viewController, options: options), direction: .right) 200 | } 201 | 202 | public func closeSide(animated: Bool = true) { 203 | guard let visibleSideViewController = self.visibleSideViewController else { 204 | return 205 | } 206 | if self.left?.viewController == visibleSideViewController { 207 | self.close(direction: .left, animated: animated) 208 | } else if self.right?.viewController == visibleSideViewController { 209 | self.close(direction: .right, animated: animated) 210 | } 211 | } 212 | 213 | private func close(direction: Direction, animated: Bool) { 214 | guard self.visibleSideViewController != nil else { 215 | return; // NO SIDE VISIBLE TO CLOSE 216 | } 217 | guard let side = self.side(direction: direction) else { 218 | // EXCEPTION 219 | return 220 | } 221 | side.viewController.view.endEditing(animated) 222 | UIView.animate(withDuration: animated ? side.options.animationDuration : 0, animations: { 223 | self.visibleSideViewController = nil 224 | side.viewController.view.isHidden = false 225 | self.updateSide(with: direction, progress: 0) 226 | }, completion: { _ in 227 | side.viewController.view.isHidden = true 228 | self.revertSideDirection = false 229 | self.mainGestures(enabled: false, direction: direction) 230 | #if os(iOS) 231 | self.sideGestures(enabled: true) 232 | #endif 233 | }) 234 | } 235 | 236 | public func showLeftSide(animated: Bool = true) { 237 | self.show(direction: .left, animated: animated) 238 | } 239 | 240 | public func showRightSide(animated: Bool = true) { 241 | self.show(direction: .right, animated: animated) 242 | } 243 | 244 | fileprivate func show(direction: Direction, animated: Bool) { 245 | guard let side = self.side(direction: direction) else { 246 | // EXCEPTION 247 | return 248 | } 249 | guard side.viewController == self.visibleSideViewController || self.visibleSideViewController == nil else { 250 | return 251 | } 252 | self.mainViewController.view.endEditing(animated) 253 | UIView.animate(withDuration: animated ? side.options.animationDuration : 0, animations: { 254 | self.visibleSideViewController = side.viewController 255 | self.updateSide(with: direction, progress: 1) 256 | }, completion: { _ in 257 | self.revertSideDirection = true 258 | self.mainGestures(enabled: true, direction: direction) 259 | #if os(iOS) 260 | self.sideGestures(enabled: false) 261 | #endif 262 | }) 263 | } 264 | 265 | fileprivate func updateSide(with direction: Direction, progress: CGFloat) { 266 | guard let side = self.side(direction: direction) else { 267 | // EXCEPTION 268 | return 269 | } 270 | self.sideProgress = progress 271 | if side.options.position == .back { 272 | self.updateBack(side: side, direction: direction, progress: progress) 273 | } else { 274 | self.updateFront(side: side, direction: direction, progress: progress) 275 | } 276 | } 277 | 278 | fileprivate func mainGestures(enabled: Bool, direction: Direction? = nil) { 279 | var overlayInteractionEnabled = enabled 280 | var panningEnabled = enabled 281 | if enabled && direction != nil { 282 | if let side = self.side(direction: direction!) { 283 | overlayInteractionEnabled = !side.options.alwaysInteractionEnabled 284 | panningEnabled = side.options.panningEnabled 285 | } 286 | } 287 | self.overlay.isUserInteractionEnabled = overlayInteractionEnabled 288 | self.gestures.mainPan.isEnabled = panningEnabled 289 | self.gestures.mainTap.isEnabled = enabled 290 | } 291 | 292 | #if os(iOS) 293 | fileprivate func sideGestures(enabled: Bool) { 294 | self.gestures.leftScreenEdgePan.isEnabled = enabled ? self.left?.options.panningEnabled ?? false : enabled 295 | self.gestures.rightScreenEdgePan.isEnabled = enabled ? self.right?.options.panningEnabled ?? false : enabled 296 | } 297 | #endif 298 | } 299 | 300 | // NESTED TYPES 301 | 302 | public extension SideNavigationController { 303 | 304 | fileprivate enum Direction { 305 | case left 306 | case right 307 | } 308 | 309 | fileprivate class Gestures { 310 | 311 | public static let velocityTolerance: CGFloat = 600 312 | 313 | private weak var sideNavigationController: SideNavigationController? 314 | #if os(iOS) 315 | public var leftScreenEdgePan: UIScreenEdgePanGestureRecognizer! 316 | public var rightScreenEdgePan: UIScreenEdgePanGestureRecognizer! 317 | #endif 318 | public var mainPan: UIPanGestureRecognizer! 319 | public var mainTap: UITapGestureRecognizer! 320 | 321 | init(sideNavigationController: SideNavigationController) { 322 | self.sideNavigationController = sideNavigationController 323 | 324 | #if os(iOS) 325 | let leftScreenEdgePan = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(handle(panGesture:))) 326 | leftScreenEdgePan.edges = .left 327 | leftScreenEdgePan.maximumNumberOfTouches = 1 328 | self.leftScreenEdgePan = leftScreenEdgePan 329 | 330 | let rightScreenEdgePan = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(handle(panGesture:))) 331 | rightScreenEdgePan.edges = .right 332 | rightScreenEdgePan.maximumNumberOfTouches = 1 333 | self.rightScreenEdgePan = rightScreenEdgePan 334 | 335 | self.leftScreenEdgePan.require(toFail: self.rightScreenEdgePan) 336 | self.rightScreenEdgePan.require(toFail: self.leftScreenEdgePan) 337 | #endif 338 | 339 | self.mainPan = UIPanGestureRecognizer(target: self, action: #selector(handle(panGesture:))) 340 | 341 | self.mainTap = UITapGestureRecognizer(target: self, action: #selector(handle(tapGesture:))) 342 | #if os(tvOS) 343 | self.mainTap.allowedPressTypes = [NSNumber(value: UIPress.PressType.menu.rawValue)] 344 | #endif 345 | self.mainTap.require(toFail: self.mainPan) 346 | } 347 | 348 | @objc 349 | private func handle(panGesture: UIPanGestureRecognizer) { 350 | guard let sideNavigationController = self.sideNavigationController else { 351 | return 352 | } 353 | if panGesture.state == .changed { 354 | let offset = panGesture.translation(in: sideNavigationController.view).x 355 | sideNavigationController.update(offset: offset) 356 | } else if panGesture.state != .began { 357 | let velocity = panGesture.velocity(in: sideNavigationController.view) 358 | let info = self.info(velocity: velocity.x) 359 | sideNavigationController.finish(direction: info.direction, swipe: info.swipe) 360 | } 361 | } 362 | 363 | @objc 364 | private func handle(tapGesture: UITapGestureRecognizer) { 365 | guard let sideNavigationController = self.sideNavigationController else { 366 | return 367 | } 368 | if sideNavigationController.visibleSideViewController == sideNavigationController.left?.viewController { 369 | sideNavigationController.finish(direction: .left, swipe: true) 370 | } else { 371 | sideNavigationController.finish(direction: .right, swipe: true) 372 | } 373 | } 374 | 375 | private func info(velocity: CGFloat) -> (direction: Direction, swipe: Bool) { 376 | if velocity >= 0 { 377 | if velocity > Gestures.velocityTolerance { 378 | return (direction: .right, swipe: true) 379 | } 380 | return (direction: .right, swipe: false) 381 | } 382 | if -velocity > Gestures.velocityTolerance { 383 | return (direction: .left, swipe: true) 384 | } 385 | return (direction: .left, swipe: false) 386 | } 387 | } 388 | } 389 | 390 | // DRAWING 391 | 392 | fileprivate extension SideNavigationController { 393 | 394 | func apply(options: Options, front: UIView!, back: UIView!, progress: CGFloat) { 395 | self.overlay.alpha = options.overlayOpacity * progress 396 | self.overlay.backgroundColor = options.overlayColor 397 | front.layer.shadowColor = options.shadowCGColor 398 | front.layer.shadowOpacity = Float(options.shadowOpacity) 399 | front.layer.shadowRadius = 10 400 | back.layer.shadowColor = nil 401 | back.layer.shadowOpacity = 0 402 | back.layer.shadowRadius = 3 403 | if options.scale != 1 { 404 | let scale = 1 - (1 - options.scale) * progress 405 | self.mainContainer.transform = CGAffineTransform.identity.scaledBy(x: scale, y: scale) 406 | } 407 | } 408 | 409 | func updateBack(side: Side, direction: Direction, progress: CGFloat) { 410 | let sideView: UIView! = side.viewController.view 411 | self.apply(options: side.options, front: self.mainContainer, back: sideView, progress: progress) 412 | var mainFrame = self.mainContainer.frame 413 | let viewBounds = self.view.bounds 414 | var sideFrame = sideView.frame 415 | sideFrame.size.width = viewBounds.width * side.options.widthPercent 416 | sideFrame.size.height = viewBounds.height 417 | let parallaxWidth = sideFrame.width / 3 418 | switch direction { 419 | case .left : 420 | mainFrame.origin.x = sideFrame.width * progress 421 | sideFrame.origin.x = parallaxWidth * progress - parallaxWidth 422 | case .right : 423 | mainFrame.origin.x = -sideFrame.width * progress 424 | sideFrame.origin.x = (viewBounds.width - sideFrame.width) + parallaxWidth * (1.0 - progress) 425 | } 426 | self.mainContainer.frame = mainFrame 427 | sideView.frame = sideFrame 428 | } 429 | 430 | func updateFront(side: Side, direction: Direction, progress: CGFloat) { 431 | let sideView: UIView! = side.viewController.view 432 | self.apply(options: side.options, front: sideView, back: self.mainContainer, progress: progress) 433 | let viewBounds = self.view.bounds 434 | var sideFrame = sideView.frame 435 | sideFrame.size.width = viewBounds.width * side.options.widthPercent 436 | sideFrame.size.height = viewBounds.height 437 | switch direction { 438 | case .left : 439 | sideFrame.origin.x = -sideFrame.width + sideFrame.width * progress 440 | case .right : 441 | sideFrame.origin.x = (viewBounds.width - sideFrame.width) + sideFrame.width * (1.0 - progress) 442 | } 443 | sideView.frame = sideFrame 444 | } 445 | } 446 | 447 | // GESTURES 448 | 449 | fileprivate extension SideNavigationController { 450 | 451 | func update(offset: CGFloat) { 452 | if let left = self.left { 453 | if self.visibleSideViewController == left.viewController || (offset > 0 && self.visibleSideViewController == nil) { 454 | UIView.animate(withDuration: left.options.animationDuration, animations: { 455 | self.visibleSideViewController = left.viewController 456 | }) 457 | let leftWidth = left.viewController.view.frame.width 458 | var progress = min(abs(offset), leftWidth) / leftWidth 459 | if self.revertSideDirection { 460 | progress = 1 - (offset <= 0 ? progress : 0) 461 | } else if offset <= 0 { 462 | progress = 0 463 | } 464 | self.updateSide(with: .left, progress: progress) 465 | return 466 | } 467 | } 468 | if let right = self.right { 469 | if self.visibleSideViewController == right.viewController || (offset < 0 && self.visibleSideViewController == nil) { 470 | UIView.animate(withDuration: right.options.animationDuration, animations: { 471 | self.visibleSideViewController = right.viewController 472 | }) 473 | let rightWidth = right.viewController.view.frame.width 474 | var progress = min(abs(offset), rightWidth) / rightWidth 475 | if self.revertSideDirection { 476 | progress = 1 - (offset >= 0 ? progress : 0) 477 | } else if offset >= 0 { 478 | progress = 0 479 | } 480 | self.updateSide(with: .right, progress: progress) 481 | return 482 | } 483 | } 484 | var mainFrame = self.mainContainer.frame 485 | mainFrame.origin.x = 0 486 | self.mainContainer.frame = mainFrame 487 | } 488 | 489 | func finish(direction: Direction, swipe: Bool) { 490 | if self.visibleSideViewController != nil { 491 | if self.visibleSideViewController == self.left?.viewController { 492 | if !(swipe && direction == .left) { 493 | if self.sideProgress > 0.5 || swipe { 494 | self.show(direction: .left, animated: true) 495 | return 496 | } 497 | } 498 | } else if !(swipe && direction == .right) { 499 | if self.sideProgress > 0.5 || swipe { 500 | self.show(direction: .right, animated: true) 501 | return 502 | } 503 | } 504 | } 505 | self.closeSide() 506 | } 507 | } 508 | -------------------------------------------------------------------------------- /Sources/UIViewController+SideNavigationController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+SideNavigationController.swift 3 | // SideNavigationController 4 | // 5 | // Created by Benoit BRIATTE on 13/03/2017. 6 | // Copyright © 2017 Digipolitan. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public extension UIViewController { 12 | 13 | var sideNavigationController: SideNavigationController? { 14 | var current = self 15 | while let parent = current.parent { 16 | if let side = parent as? SideNavigationController { 17 | return side 18 | } 19 | current = parent 20 | } 21 | return nil 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | fr_FR 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 2.0.1 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Tests/SideNavigationControllerTests/SideNavigationControllerTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import SideNavigationController 3 | 4 | class SideNavigationControllerTests: XCTestCase { 5 | 6 | override func setUp() { 7 | super.setUp() 8 | } 9 | 10 | override func tearDown() { 11 | super.tearDown() 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /fastlane/Appfile: -------------------------------------------------------------------------------- 1 | app_identifier "com.digipolitan.sidenavigation" # The bundle identifier of your app 2 | -------------------------------------------------------------------------------- /fastlane/Fastfile: -------------------------------------------------------------------------------- 1 | github_url = "https://github.com" 2 | import_from_git(url: "#{github_url}/Digipolitan/fastlane-common") 3 | import_from_git(url: "#{github_url}/Digipolitan/fastlane-ios") 4 | import_from_git(url: "#{github_url}/Digipolitan/fastlane-ios-framework") 5 | import_from_git(url: "#{github_url}/Digipolitan/fastlane-ios-ci-framework") 6 | -------------------------------------------------------------------------------- /fastlane/README.md: -------------------------------------------------------------------------------- 1 | fastlane documentation 2 | ================ 3 | # Installation 4 | 5 | Make sure you have the latest version of the Xcode command line tools installed: 6 | 7 | ``` 8 | xcode-select --install 9 | ``` 10 | 11 | Install _fastlane_ using 12 | ``` 13 | [sudo] gem install fastlane -NV 14 | ``` 15 | or alternatively using `brew cask install fastlane` 16 | 17 | # Available Actions 18 | ### multi_environment 19 | ``` 20 | fastlane multi_environment 21 | ``` 22 | Execute a lane using different environment variables 23 | 24 | #### Options 25 | 26 | * __**target_lane**__: The target lane to execute with different environment 27 | 28 | * **environment_variable**: TARGET_LANE 29 | 30 | * **type**: string 31 | 32 | * **optional**: false 33 | 34 | #### Environment variables 35 | 36 | * __**ENVIRONMENT_DIRECTORY_PATH**__: The directory path of the environment info 37 | 38 | * **type**: string 39 | 40 | * **optional**: true 41 | 42 | 43 | ### appfile_init 44 | ``` 45 | fastlane appfile_init 46 | ``` 47 | Init the Fastlane Appfile with a user interaction 48 | 49 | #### How to install ? 50 | 51 | This lane require actions define in [Digipolitan/fastlane-common](https://github.com/Digipolitan/fastlane-common) 52 | 53 | ``` 54 | import_from_git( 55 | url: 'https://github.com/Digipolitan/fastlane-common' 56 | ) 57 | ``` 58 | 59 | #### Example : Fetch only the app_identifier 60 | 61 | ``` 62 | fastlane appfile_init fetch_app_identifier:false 63 | ``` 64 | 65 | #### Options 66 | 67 | * __**xcodeproj**__: The Xcode project path, if the project isn't in your root directory 68 | 69 | * **environment_variable**: XCODEPROJ 70 | 71 | * **type**: string 72 | 73 | * **optional**: true 74 | 75 | * __**fetch_app_identifier**__: Ask the user about the app_identifier 76 | 77 | * **type**: boolean 78 | 79 | * **default_value**: true 80 | 81 | * __**fetch_apple_id**__: Ask the user about the apple account 82 | 83 | * **type**: boolean 84 | 85 | * **default_value**: true 86 | 87 | * __**fetch_team_name**__: Ask the user about the Dev Portal Team 88 | 89 | * **type**: boolean 90 | 91 | * **default_value**: true 92 | 93 | * __**fetch_itc_team_name**__: Ask the user about the iTunes Connect Team 94 | 95 | * **type**: boolean 96 | 97 | * **default_value**: true 98 | 99 | 100 | ### tests 101 | ``` 102 | fastlane tests 103 | ``` 104 | Build and run all Xcode tests 105 | 106 | #### Example: 107 | 108 | ``` 109 | fastlane tests workspace:NAME.xcworkspace 110 | ``` 111 | 112 | #### How to install ? 113 | 114 | This lane require actions define in [Digipolitan/fastlane-common](https://github.com/Digipolitan/fastlane-common) 115 | 116 | ``` 117 | import_from_git( 118 | url: 'https://github.com/Digipolitan/fastlane-common' 119 | ) 120 | ``` 121 | 122 | #### Options 123 | 124 | * __**target_scheme**__: The scheme into the Xcode project to execute, the scheme is required on the CI environement 125 | 126 | * **environment_variable**: TARGET_SCHEME 127 | 128 | * **type**: string 129 | 130 | * **optional**: true 131 | 132 | * __**xcworkspace**__: The workspace to use. 133 | 134 | * **environment_variable**: XCWORKSPACE 135 | 136 | * **type**: string 137 | 138 | * **optional**: true 139 | 140 | * __**xcodeproj**__: The Xcode project to select 141 | 142 | * **environment_variable**: XCODEPROJ 143 | 144 | * **type**: string 145 | 146 | * **optional**: true 147 | 148 | #### Environment variables 149 | 150 | * __**SLACK_URL**__: The slack Hook URL 151 | 152 | * **type**: string 153 | 154 | * **optional**: true 155 | 156 | 157 | ### framework_bootstrap 158 | ``` 159 | fastlane framework_bootstrap 160 | ``` 161 | Initialize the framework to be use with fastlane 162 | 163 | #### How to install ? 164 | 165 | This lane require actions define in [Digipolitan/fastlane-common](https://github.com/Digipolitan/fastlane-common) and lane define in [Digipolitan/fastlane-ios](https://github.com/Digipolitan/fastlane-ios) 166 | 167 | ``` 168 | import_from_git( 169 | url: 'https://github.com/Digipolitan/fastlane-common' 170 | ) 171 | import_from_git( 172 | url: 'https://github.com/Digipolitan/fastlane-ios' 173 | ) 174 | ``` 175 | 176 | #### Options 177 | 178 | * __**xcodeproj**__: The Xcode project path, if the project isn't in your root directory 179 | 180 | * **environment_variable**: XCODEPROJ 181 | 182 | * **type**: string 183 | 184 | * **optional**: true 185 | 186 | * __**xcworkspace**__: The Xcode workspace path, if the workspace isn't in your root directory 187 | 188 | * **environment_variable**: XCWORKSPACE 189 | 190 | * **type**: string 191 | 192 | * **optional**: true 193 | 194 | * __**podspec_path**__: The podspec path if specific 195 | 196 | * **environment_variable**: PODSPEC_PATH 197 | 198 | * **type**: string 199 | 200 | * **optional**: true 201 | 202 | * __**skip_cocoapods**__: Do not prepare the framework to CocoaPods 203 | 204 | * **environment_variable**: SKIP_COCOAPODS 205 | 206 | * **type**: boolean 207 | 208 | * **default_value**: false 209 | 210 | 211 | ### start_framework_release 212 | ``` 213 | fastlane start_framework_release 214 | ``` 215 | Start new framework release version on your git repository 216 | 217 | This lane require **git flow** installed in your framework directory check documentation [here](https://github.com/nvie/gitflow) 218 | 219 | You will automatically be switched to release/X.X.X branch after this lane and your xcodeproj / podsec version will be updated 220 | 221 | #### How to install ? 222 | 223 | This lane require actions define in [Digipolitan/fastlane-common](https://github.com/Digipolitan/fastlane-common) 224 | 225 | ``` 226 | import_from_git( 227 | url: 'https://github.com/Digipolitan/fastlane-common' 228 | ) 229 | ``` 230 | 231 | #### Example using specific version: 232 | 233 | ``` 234 | fastlane start_framework_release target_version:4.0.9 235 | ``` 236 | 237 | #### Options 238 | 239 | * __**xcodeproj**__: The Xcode project path, if the project isn't in your root directory 240 | 241 | * **environment_variable**: XCODEPROJ 242 | 243 | * **type**: string 244 | 245 | * **optional**: true 246 | 247 | * __**target_version**__: Change to a specific version. 248 | 249 | * **environment_variable**: TARGET_VERSION 250 | 251 | * **type**: string 252 | 253 | * **optional**: true 254 | 255 | * __**podspec_path**__: The podspec path if specific 256 | 257 | * **environment_variable**: PODSPEC_PATH 258 | 259 | * **type**: string 260 | 261 | * **optional**: true 262 | 263 | * __**skip_cocoapods**__: Do not prepare the framework to CocoaPods 264 | 265 | * **environment_variable**: SKIP_COCOAPODS 266 | 267 | * **type**: boolean 268 | 269 | * **default_value**: false 270 | 271 | * __**product_name**__: The framework name, by default retrieve the product name on the .git/config file 272 | 273 | * **environment_variable**: PRODUCT_NAME 274 | 275 | * **type**: string 276 | 277 | * **optional**: true 278 | 279 | * __**changelog_release_url**__: The release url use by the changelog 280 | 281 | * **environment_variable**: CHANGELOG_RELEASE_URL 282 | 283 | * **type**: string 284 | 285 | * **optional**: true 286 | 287 | * __**changelog_content**__: The changelog content, by default retrieves commits 288 | 289 | * **environment_variable**: CHANGELOG_CONTENT 290 | 291 | * **type**: string 292 | 293 | * **optional**: true 294 | 295 | 296 | ### publish_framework_release 297 | ``` 298 | fastlane publish_framework_release 299 | ``` 300 | Submit the framework release version on your git repository and close the branch 301 | 302 | This lane require **git flow** installed in your framework directory check documentation [here](https://github.com/nvie/gitflow) 303 | 304 | You will automatically be switched to your develop branch after this lane 305 | 306 | #### How to install ? 307 | 308 | This lane require actions define in [Digipolitan/fastlane-common](https://github.com/Digipolitan/fastlane-common) 309 | 310 | ``` 311 | import_from_git( 312 | url: 'https://github.com/Digipolitan/fastlane-common' 313 | ) 314 | ``` 315 | 316 | #### Options 317 | 318 | * __**git_flow_release_message**__: The commit message 319 | 320 | * **environment_variable**: GIT_FLOW_RELEASE_MESSAGE 321 | 322 | * **type**: string 323 | 324 | * **optional**: true 325 | 326 | * **default_value**: Release version **VERSION_NUMBER** 327 | 328 | * __**xcworkspace**__: The Xcode workspace to use. 329 | 330 | * **environment_variable**: XCWORKSPACE 331 | 332 | * **type**: string 333 | 334 | * **optional**: true 335 | 336 | * __**xcodeproj**__: The Xcode project path. 337 | 338 | * **environment_variable**: XCODEPROJ 339 | 340 | * **type**: string 341 | 342 | * **optional**: true 343 | 344 | * __**target_scheme**__: The scheme into the Xcode project to execute 345 | 346 | * **environment_variable**: TARGET_SCHEME 347 | 348 | * **type**: string 349 | 350 | * **optional**: true 351 | 352 | * __**podspec_path**__: The podspec path if specific 353 | 354 | * **environment_variable**: PODSPEC_PATH 355 | 356 | * **type**: string 357 | 358 | * **optional**: true 359 | 360 | * __**skip_cocoapods**__: Do not prepare the framework to CocoaPods 361 | 362 | * **environment_variable**: SKIP_COCOAPODS 363 | 364 | * **type**: boolean 365 | 366 | * **default_value**: false 367 | 368 | 369 | ### framework_deploy_cocoapods 370 | ``` 371 | fastlane framework_deploy_cocoapods 372 | ``` 373 | CocoaPods deployment lane 374 | 375 | This lane must be run only on the **master** branch 376 | 377 | #### How to install ? 378 | 379 | This lane require actions define in [Digipolitan/fastlane-common](https://github.com/Digipolitan/fastlane-common) 380 | 381 | ``` 382 | import_from_git( 383 | url: 'https://github.com/Digipolitan/fastlane-common' 384 | ) 385 | ``` 386 | 387 | #### Options 388 | 389 | * __**podspec_path**__: The podspec path 390 | 391 | * **environment_variable**: PODSPEC_PATH 392 | 393 | * **type**: string 394 | 395 | * **optional**: true 396 | 397 | #### CI Environment variables 398 | 399 | * __**COCOAPODS_TRUNK_TOKEN**__: The CocoaPods access token use to push the release to CocoaPods, check below how to retrieve CocoaPods token 400 | 401 | * **type**: string 402 | 403 | * **optional**: false 404 | 405 | #### Output context variables 406 | 407 | * __**:COCOAPODS_RELEASE_LINK**__: The CocoaPods release link 408 | 409 | * **type**: string 410 | 411 | #### How to retrieve CocoaPods Trunk Token ? 412 | 413 | First setup your CocoaPods trunk [as follow](https://guides.cocoapods.org/making/getting-setup-with-trunk.html) 414 | 415 | After that run this command : 416 | 417 | ``` 418 | grep -A2 'trunk.cocoapods.org' ~/.netrc 419 | ``` 420 | 421 | The output sould be something like this : 422 | 423 | ``` 424 | machine trunk.cocoapods.org 425 | login user@example.com 426 | password XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 427 | ``` 428 | 429 | The password `XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX` is your CocoaPods trunk token 430 | 431 | 432 | ### framework_deploy_github 433 | ``` 434 | fastlane framework_deploy_github 435 | ``` 436 | GitHub deployment lane 437 | 438 | This lane must be run only on the **master** branch 439 | 440 | #### How to install ? 441 | 442 | This lane require actions define in [Digipolitan/fastlane-common](https://github.com/Digipolitan/fastlane-common) 443 | 444 | ``` 445 | import_from_git( 446 | url: 'https://github.com/Digipolitan/fastlane-common' 447 | ) 448 | ``` 449 | 450 | #### Options 451 | 452 | * __**github_token**__: The GitHub access token use to push the release to GitHub, check how to generate access token [here](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) 453 | 454 | * **environment_variable**: GITHUB_TOKEN 455 | 456 | * **type**: string 457 | 458 | * **optional**: false 459 | 460 | * __**github_repository_name**__: The GitHub repository name such as 'company/project' 461 | 462 | * **environment_variable**: GITHUB_REPOSITORY_NAME 463 | 464 | * **type**: string 465 | 466 | * **optional**: false 467 | 468 | * __**target_scheme**__: The scheme into the Xcode project get version number 469 | 470 | * **environment_variable**: TARGET_SCHEME 471 | 472 | * **type**: string 473 | 474 | * **optional**: false on CI 475 | 476 | * __**xcodeproj**__: Your xcodeproj path 477 | 478 | * **environment_variable**: XCODEPROJ 479 | 480 | * **type**: string 481 | 482 | * **optional**: true 483 | 484 | * __**skip_carthage**__: Skip the carthage asset to the GitHub release 485 | 486 | * **environment_variable**: SKIP_CARTHAGE 487 | 488 | * **type**: boolean 489 | 490 | * **default_value**: false 491 | 492 | * __**skip_codecov**__: Skip the codecov.io link 493 | 494 | * **environment_variable**: SKIP_CODECOV 495 | 496 | * **type**: boolean 497 | 498 | * **default_value**: false 499 | 500 | 501 | ### ci_framework_deploy 502 | ``` 503 | fastlane ci_framework_deploy 504 | ``` 505 | Framework CI deployment lane, do something only on a master branch 506 | 507 | Deploy to **github**, **carthage** and **cocoapods** 508 | 509 | #### How to install ? 510 | 511 | This lane require actions or lanes define in [Digipolitan/fastlane-ios-framework](https://github.com/Digipolitan/fastlane-ios-framework) 512 | 513 | - `framework_deploy_github` lane **if github_repository_name != nil** 514 | 515 | - `framework_deploy_cocoapods` lane **if skip_cocoapods != true** 516 | 517 | ``` 518 | import_from_git( 519 | url: 'https://github.com/Digipolitan/fastlane-common' 520 | ) 521 | import_from_git( 522 | url: 'https://github.com/Digipolitan/fastlane-ios' 523 | ) 524 | import_from_git( 525 | url: 'https://github.com/Digipolitan/fastlane-ios-framework' 526 | ) 527 | ``` 528 | 529 | #### Options 530 | 531 | * __**target_scheme**__: The scheme into the Xcode project to execute, the scheme is required on the CI environement 532 | 533 | * **environment_variable**: TARGET_SCHEME 534 | 535 | * **type**: string 536 | 537 | * **optional**: false on CI 538 | 539 | * __**xcodeproj**__: The Xcode project to select. 540 | 541 | * **environment_variable**: XCODEPROJ 542 | 543 | * **type**: string 544 | 545 | * **optional**: true 546 | 547 | * __**product_name**__: The framework name. 548 | 549 | * **environment_variable**: PRODUCT_NAME 550 | 551 | * **type**: string 552 | 553 | * **optional**: true 554 | 555 | * __**github_token**__: The GitHub access token use to push the release to GitHub, check how to generate access token [here](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) 556 | 557 | * **environment_variable**: GITHUB_TOKEN 558 | 559 | * **type**: string 560 | 561 | * **optional**: true 562 | 563 | * __**github_repository_name**__: The GitHub repository name such as 'company/project' 564 | 565 | * **environment_variable**: GITHUB_REPOSITORY_NAME 566 | 567 | * **type**: string 568 | 569 | * **optional**: true 570 | 571 | * __**skip_cocoapods**__: Skip cocoapods deployment 572 | 573 | * **environment_variable**: SKIP_COCOAPODS 574 | 575 | * **type**: boolean 576 | 577 | * **default_value**: false 578 | 579 | * __**skip_carthage**__: Skip carthage deployment 580 | 581 | * **environment_variable**: SKIP_CARTHAGE 582 | 583 | * **type**: boolean 584 | 585 | * **default_value**: false 586 | 587 | * __**skip_codecov**__: Skip the codecov.io link 588 | 589 | * **environment_variable**: SKIP_CODECOV 590 | 591 | * **type**: boolean 592 | 593 | * **default_value**: false 594 | 595 | #### Environment variables 596 | 597 | * __**SLACK_URL**__: The Slack Hook URL 598 | 599 | * **type**: string 600 | 601 | * **optional**: true 602 | 603 | * __**COCOAPODS_TRUNK_TOKEN**__: The CocoaPods access token use to push the release to CocoaPods 604 | 605 | * **type**: string 606 | 607 | * **optional**: true 608 | 609 | 610 | 611 | ---- 612 | 613 | This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. 614 | More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). 615 | The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). 616 | --------------------------------------------------------------------------------