From c39b8a8e79b37295f50f5284506e7ac7f59255f3 Mon Sep 17 00:00:00 2001 From: awaisFayyaz786 Date: Wed, 25 Apr 2018 15:45:23 +0500 Subject: [PATCH] Added all files --- .DS_Store | Bin 0 -> 6148 bytes Podfile | 20 + Podfile.lock | 20 + Pods/FDTake/LICENSE | 19 + Pods/FDTake/README.md | 179 +++ Pods/FDTake/Source/FDTake.h | 19 + Pods/FDTake/Source/FDTakeController.swift | 357 +++++ Pods/FDTake/Source/Info.plist | 24 + .../Source/ar.lproj/Localizable.strings | 17 + .../Source/da.lproj/Localizable.strings | 18 + .../Source/de.lproj/Localizable.strings | 17 + .../Source/el.lproj/Localizable.strings | 17 + .../Source/en.lproj/Localizable.strings | 17 + .../Source/es.lproj/Localizable.strings | 17 + .../Source/fr.lproj/Localizable.strings | 17 + .../Source/he.lproj/Localizable.strings | 17 + .../Source/hu.lproj/Localizable.strings | 17 + .../Source/it.lproj/Localizable.strings | 17 + .../Source/nb.lproj/Localizable.strings | 17 + .../Source/nl.lproj/Localizable.strings | 17 + .../Source/pl.lproj/Localizable.strings | 17 + .../Source/pt-PT.lproj/Localizable.strings | 17 + .../Source/ru.lproj/Localizable.strings | 17 + .../Source/sv.lproj/Localizable.strings | 17 + .../Source/tr.lproj/Localizable.strings | 17 + .../Source/zh-Hans.lproj/Localizable.strings | 17 + .../Source/zh-Hant.lproj/Localizable.strings | 17 + Pods/Manifest.lock | 20 + Pods/Pods.xcodeproj/project.pbxproj | 1204 +++++++++++++++++ .../xcschemes/FDTake.xcscheme | 60 + .../xcschemes/Pods-testing.xcscheme | 73 + .../xcschemes/Pods-testingTests.xcscheme | 73 + .../xcschemes/Pods-testingUITests.xcscheme | 73 + .../xcschemes/PryntTrimmerView.xcscheme | 60 + .../xcschemes/xcschememanagement.plist | 46 + Pods/PryntTrimmerView/LICENSE | 21 + .../Classes/Cropper/CropMaskView.swift | 114 ++ .../Classes/Cropper/VideoCropView.swift | 123 ++ .../Classes/Cropper/VideoScrollView.swift | 103 ++ .../Classes/Parents/AVAssetTimeSelector.swift | 85 ++ .../Parents/AssetVideoScrollView.swift | 166 +++ .../Classes/ThumbSelectorView.swift | 178 +++ .../Classes/Trimmer/HandlerView.swift | 22 + .../Classes/Trimmer/PryntTrimmerView.swift | 352 +++++ Pods/PryntTrimmerView/README.md | 66 + .../FDTake/FDTake-dummy.m | 5 + .../FDTake/FDTake-prefix.pch | 12 + .../FDTake/FDTake-umbrella.h | 17 + .../FDTake/FDTake.modulemap | 6 + .../FDTake/FDTake.xcconfig | 9 + Pods/Target Support Files/FDTake/Info.plist | 26 + .../Pods-testing/Info.plist | 26 + .../Pods-testing-acknowledgements.markdown | 28 + .../Pods-testing-acknowledgements.plist | 60 + .../Pods-testing/Pods-testing-dummy.m | 5 + .../Pods-testing/Pods-testing-frameworks.sh | 153 +++ .../Pods-testing/Pods-testing-resources.sh | 118 ++ .../Pods-testing/Pods-testing-umbrella.h | 16 + .../Pods-testing/Pods-testing.debug.xcconfig | 11 + .../Pods-testing/Pods-testing.modulemap | 6 + .../Pods-testing.release.xcconfig | 11 + .../Pods-testingTests/Info.plist | 26 + ...ods-testingTests-acknowledgements.markdown | 25 + .../Pods-testingTests-acknowledgements.plist | 57 + .../Pods-testingTests-dummy.m | 5 + .../Pods-testingTests-frameworks.sh | 153 +++ .../Pods-testingTests-resources.sh | 118 ++ .../Pods-testingTests-umbrella.h | 16 + .../Pods-testingTests.debug.xcconfig | 11 + .../Pods-testingTests.modulemap | 6 + .../Pods-testingTests.release.xcconfig | 11 + .../Pods-testingUITests/Info.plist | 26 + ...s-testingUITests-acknowledgements.markdown | 3 + ...Pods-testingUITests-acknowledgements.plist | 29 + .../Pods-testingUITests-dummy.m | 5 + .../Pods-testingUITests-frameworks.sh | 146 ++ .../Pods-testingUITests-resources.sh | 118 ++ .../Pods-testingUITests-umbrella.h | 16 + .../Pods-testingUITests.debug.xcconfig | 8 + .../Pods-testingUITests.modulemap | 6 + .../Pods-testingUITests.release.xcconfig | 8 + .../PryntTrimmerView/Info.plist | 26 + .../PryntTrimmerView/PryntTrimmerView-dummy.m | 5 + .../PryntTrimmerView-prefix.pch | 12 + .../PryntTrimmerView-umbrella.h | 16 + .../PryntTrimmerView.modulemap | 6 + .../PryntTrimmerView.xcconfig | 9 + testing.xcodeproj/project.pbxproj | 746 ++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 33121 bytes .../xcschemes/xcschememanagement.plist | 14 + testing.xcworkspace/contents.xcworkspacedata | 10 + .../UserInterfaceState.xcuserstate | Bin 0 -> 44672 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + testing/AppDelegate.swift | 93 ++ .../AppIcon.appiconset/Contents.json | 93 ++ testing/Base.lproj/LaunchScreen.storyboard | 25 + testing/Base.lproj/Main.storyboard | 100 ++ testing/Info.plist | 47 + testing/ViewController.swift | 57 + testing/progressRingVC.swift | 87 ++ .../testing.xcdatamodeld/.xccurrentversion | 8 + .../testing.xcdatamodel/contents | 4 + .../AssetSelectionViewController.swift | 52 + testing/videoTrimming/VideoClippingVC.swift | 145 ++ testingTests/Info.plist | 22 + testingTests/testingTests.swift | 36 + testingUITests/Info.plist | 22 + testingUITests/testingUITests.swift | 36 + 109 files changed, 6786 insertions(+) create mode 100644 .DS_Store create mode 100644 Podfile create mode 100644 Podfile.lock create mode 100644 Pods/FDTake/LICENSE create mode 100644 Pods/FDTake/README.md create mode 100644 Pods/FDTake/Source/FDTake.h create mode 100644 Pods/FDTake/Source/FDTakeController.swift create mode 100644 Pods/FDTake/Source/Info.plist create mode 100644 Pods/FDTake/Source/ar.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/da.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/de.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/el.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/en.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/es.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/fr.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/he.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/hu.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/it.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/nb.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/nl.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/pl.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/pt-PT.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/ru.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/sv.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/tr.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/zh-Hans.lproj/Localizable.strings create mode 100644 Pods/FDTake/Source/zh-Hant.lproj/Localizable.strings create mode 100644 Pods/Manifest.lock create mode 100644 Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/FDTake.xcscheme create mode 100644 Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-testing.xcscheme create mode 100644 Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-testingTests.xcscheme create mode 100644 Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-testingUITests.xcscheme create mode 100644 Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/PryntTrimmerView.xcscheme create mode 100644 Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Pods/PryntTrimmerView/LICENSE create mode 100644 Pods/PryntTrimmerView/PryntTrimmerView/Classes/Cropper/CropMaskView.swift create mode 100644 Pods/PryntTrimmerView/PryntTrimmerView/Classes/Cropper/VideoCropView.swift create mode 100644 Pods/PryntTrimmerView/PryntTrimmerView/Classes/Cropper/VideoScrollView.swift create mode 100644 Pods/PryntTrimmerView/PryntTrimmerView/Classes/Parents/AVAssetTimeSelector.swift create mode 100644 Pods/PryntTrimmerView/PryntTrimmerView/Classes/Parents/AssetVideoScrollView.swift create mode 100644 Pods/PryntTrimmerView/PryntTrimmerView/Classes/ThumbSelectorView.swift create mode 100644 Pods/PryntTrimmerView/PryntTrimmerView/Classes/Trimmer/HandlerView.swift create mode 100644 Pods/PryntTrimmerView/PryntTrimmerView/Classes/Trimmer/PryntTrimmerView.swift create mode 100644 Pods/PryntTrimmerView/README.md create mode 100644 Pods/Target Support Files/FDTake/FDTake-dummy.m create mode 100644 Pods/Target Support Files/FDTake/FDTake-prefix.pch create mode 100644 Pods/Target Support Files/FDTake/FDTake-umbrella.h create mode 100644 Pods/Target Support Files/FDTake/FDTake.modulemap create mode 100644 Pods/Target Support Files/FDTake/FDTake.xcconfig create mode 100644 Pods/Target Support Files/FDTake/Info.plist create mode 100644 Pods/Target Support Files/Pods-testing/Info.plist create mode 100644 Pods/Target Support Files/Pods-testing/Pods-testing-acknowledgements.markdown create mode 100644 Pods/Target Support Files/Pods-testing/Pods-testing-acknowledgements.plist create mode 100644 Pods/Target Support Files/Pods-testing/Pods-testing-dummy.m create mode 100755 Pods/Target Support Files/Pods-testing/Pods-testing-frameworks.sh create mode 100755 Pods/Target Support Files/Pods-testing/Pods-testing-resources.sh create mode 100644 Pods/Target Support Files/Pods-testing/Pods-testing-umbrella.h create mode 100644 Pods/Target Support Files/Pods-testing/Pods-testing.debug.xcconfig create mode 100644 Pods/Target Support Files/Pods-testing/Pods-testing.modulemap create mode 100644 Pods/Target Support Files/Pods-testing/Pods-testing.release.xcconfig create mode 100644 Pods/Target Support Files/Pods-testingTests/Info.plist create mode 100644 Pods/Target Support Files/Pods-testingTests/Pods-testingTests-acknowledgements.markdown create mode 100644 Pods/Target Support Files/Pods-testingTests/Pods-testingTests-acknowledgements.plist create mode 100644 Pods/Target Support Files/Pods-testingTests/Pods-testingTests-dummy.m create mode 100755 Pods/Target Support Files/Pods-testingTests/Pods-testingTests-frameworks.sh create mode 100755 Pods/Target Support Files/Pods-testingTests/Pods-testingTests-resources.sh create mode 100644 Pods/Target Support Files/Pods-testingTests/Pods-testingTests-umbrella.h create mode 100644 Pods/Target Support Files/Pods-testingTests/Pods-testingTests.debug.xcconfig create mode 100644 Pods/Target Support Files/Pods-testingTests/Pods-testingTests.modulemap create mode 100644 Pods/Target Support Files/Pods-testingTests/Pods-testingTests.release.xcconfig create mode 100644 Pods/Target Support Files/Pods-testingUITests/Info.plist create mode 100644 Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-acknowledgements.markdown create mode 100644 Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-acknowledgements.plist create mode 100644 Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-dummy.m create mode 100755 Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-frameworks.sh create mode 100755 Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-resources.sh create mode 100644 Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-umbrella.h create mode 100644 Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.debug.xcconfig create mode 100644 Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.modulemap create mode 100644 Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.release.xcconfig create mode 100644 Pods/Target Support Files/PryntTrimmerView/Info.plist create mode 100644 Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView-dummy.m create mode 100644 Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView-prefix.pch create mode 100644 Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView-umbrella.h create mode 100644 Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView.modulemap create mode 100644 Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView.xcconfig create mode 100644 testing.xcodeproj/project.pbxproj create mode 100644 testing.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 testing.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 testing.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 testing.xcworkspace/contents.xcworkspacedata create mode 100644 testing.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 testing.xcworkspace/xcuserdata/admin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 testing/AppDelegate.swift create mode 100644 testing/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 testing/Base.lproj/LaunchScreen.storyboard create mode 100644 testing/Base.lproj/Main.storyboard create mode 100644 testing/Info.plist create mode 100644 testing/ViewController.swift create mode 100644 testing/progressRingVC.swift create mode 100644 testing/testing.xcdatamodeld/.xccurrentversion create mode 100644 testing/testing.xcdatamodeld/testing.xcdatamodel/contents create mode 100755 testing/videoTrimming/AssetSelectionViewController.swift create mode 100644 testing/videoTrimming/VideoClippingVC.swift create mode 100644 testingTests/Info.plist create mode 100644 testingTests/testingTests.swift create mode 100644 testingUITests/Info.plist create mode 100644 testingUITests/testingUITests.swift diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d4914006dfd895051d2e2f9aaa6022852f85f188 GIT binary patch literal 6148 zcmeHKOG*Pl5PhW)0=kH}5#00%gxsJB@dUYml7#r5Au76@i+C50=But!rg0WoiAWW6 zzv|EH>Ul8TT>xbEvYG-D0Am(KQD?xkdvIvaCy$6y*0{kVHaN!{mIDj@#V+0ZF`lu; z6YKu|8?4ydVv7d1_nYZr**vu66Xf7%H&%PyXJsXy490q8j4kfChZa}VZe7L0``PZy zDkeTOW>_c?3WNfoKq$~xfOodq_|P!wP#_ct1-=!~^C7V)X2;I3938Am3P99nbTRsx zODHEfX2;HuBQ!B8(Wv4nh8Ugw$>(Lq&d}%(Pd>yWeQi<-{s)S=O@9sz9VIdWPC cZ9J*ZdD*cu)K#><(24O7D1t;43jBfspC#WobN~PV literal 0 HcmV?d00001 diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..633d28b --- /dev/null +++ b/Podfile @@ -0,0 +1,20 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'testing' do + # Comment the next line if you're not using Swift and don't want to use dynamic frameworks + use_frameworks! + pod 'PryntTrimmerView' + # Pods for testing + + target 'testingTests' do + inherit! :search_paths + pod 'FDTake' + end + + target 'testingUITests' do + inherit! :search_paths + # Pods for testing + end + +end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..a6480d6 --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,20 @@ +PODS: + - FDTake (2.0.0) + - PryntTrimmerView (2.0.1) + +DEPENDENCIES: + - FDTake + - PryntTrimmerView + +SPEC REPOS: + https://github.com/CocoaPods/Specs.git: + - FDTake + - PryntTrimmerView + +SPEC CHECKSUMS: + FDTake: 21152c660ddf075a859f86af83f9d17dc4b5a539 + PryntTrimmerView: 4260ae497a2f3e1bbfc0b71247eb74ab92bf0490 + +PODFILE CHECKSUM: 2b8d33bd57a2ab3ba64f8ffdbf4ecd4cccf326e1 + +COCOAPODS: 1.5.0 diff --git a/Pods/FDTake/LICENSE b/Pods/FDTake/LICENSE new file mode 100644 index 0000000..352d909 --- /dev/null +++ b/Pods/FDTake/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2016 William Entriken + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/Pods/FDTake/README.md b/Pods/FDTake/README.md new file mode 100644 index 0000000..58d1ff1 --- /dev/null +++ b/Pods/FDTake/README.md @@ -0,0 +1,179 @@ +# FDTake + +[![CI Status](http://img.shields.io/travis/fulldecent/FDTake.svg?style=flat)](https://travis-ci.org/fulldecent/FDTake) +[![Version](https://img.shields.io/cocoapods/v/FDTake.svg?style=flat)](http://cocoapods.org/pods/FDTake) +[![License](https://img.shields.io/cocoapods/l/FDTake.svg?style=flat)](http://cocoapods.org/pods/FDTake) +[![Platform](https://img.shields.io/cocoapods/p/FDTake.svg?style=flat)](http://cocoapods.org/pods/FDTake) +[![Readme Score](http://readme-score-api.herokuapp.com/score.svg?url=fulldecent/FDTake)](http://clayallsopp.github.io/readme-score?url=fulldecent/FDTake) + + +## Usage + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +To use it in your project, add an `FDTakeController` to your view controller and implement: + + fdTakeController.didGetPhoto = { + (_ photo: UIImage, _ info: [AnyHashable : Any]) in + } + +then call: + + fdTakeController.present() + +The full API is: + +```swift +/// Public initializer +public override init() + +/// Convenience method for getting a photo +open class func getPhotoWithCallback(getPhotoWithCallback callback: @escaping (_ photo: UIImage, _ info: [AnyHashable : Any]) -> Void) -> <> + +/// Convenience method for getting a video +open class func getVideoWithCallback(getVideoWithCallback callback: @escaping (_ video: URL, _ info: [AnyHashable : Any]) -> Void) + +/// Whether to allow selecting a photo +open var allowsPhoto: Bool + +/// Whether to allow selecting a video +open var allowsVideo: Bool + +/// Whether to allow capturing a photo/video with the camera +open var allowsTake: Bool + +/// Whether to allow selecting existing media +open var allowsSelectFromLibrary: Bool + +/// Whether to allow editing the media after capturing/selection +open var allowsEditing: Bool + +/// Whether to use full screen camera preview on the iPad +open var iPadUsesFullScreenCamera: Bool + +/// Enable selfie mode by default +open var defaultsToFrontCamera: Bool + +/// The UIBarButtonItem to present from (may be replaced by a overloaded methods) +open var presentingBarButtonItem: UIBarButtonItem? + +/// The UIView to present from (may be replaced by a overloaded methods) +open var presentingView: UIView? + +/// The UIRect to present from (may be replaced by a overloaded methods) +open var presentingRect: CGRect? + +/// The UITabBar to present from (may be replaced by a overloaded methods) +open var presentingTabBar: UITabBar? + +/// The UIViewController to present from (may be replaced by a overloaded methods) +open lazy var presentingViewController: UIViewController { get set } + +/// A photo was selected +open var didGetPhoto: ((_ photo: UIImage, _ info: [AnyHashable : Any]) -> Void)? + +/// A video was selected +open var didGetVideo: ((_ video: URL, _ info: [AnyHashable : Any]) -> Void)? + +/// The user selected did not attempt to select a photo +open var didDeny: (() -> Void)? + +/// The user started selecting a photo or took a photo and then hit cancel +open var didCancel: (() -> Void)? + +/// A photo or video was selected but the ImagePicker had NIL for EditedImage and OriginalImage +open var didFail: (() -> Void)? + +/// Custom UI text (skips localization) +open var cancelText: String? + +/// Custom UI text (skips localization) +open var chooseFromLibraryText: String? + +/// Custom UI text (skips localization) +open var chooseFromPhotoRollText: String? + +/// Custom UI text (skips localization) +open var noSourcesText: String? + +/// Custom UI text (skips localization) +open var takePhotoText: String? + +/// Custom UI text (skips localization) +open var takeVideoText: String? + +/// Presents the user with an option to take a photo or choose a photo from the library +open func present() + +/// Dismisses the displayed view. Especially handy if the sheet is displayed while suspending the app, +open func dismiss() +``` + +Other available options are documented at CocoaDocs for FDTake. + + +## How it works + + 1. See if device has camera + 2. Create action sheet with appropriate options ("Take Photo" or "Choose from Library"), as available + 3. Localize "Take Photo" and "Choose from Library" into user's language + 4. Wait for response + 5. Bring up image picker with selected image picking method + 6. Default to selfie mode if so configured + 7. Get response, extract image from a dictionary + 8. Dismiss picker, send image to delegate + + +## Support + + * Supports iPhones, iPods, iPads and tvOS (but not tested) + * Supported languages: + - English + - Chinese Simplified + - Turkish (thanks Suleyman Melikoglu) + - French (thanks Guillaume Algis) + - Dutch (thanks Mathijs Kadijk) + - Chinese Traditional (thanks Qing Ao) + - German (thanks Lars Häuser) + - Russian (thanks Alexander Zubkov) + - Norwegian (thanks Sindre Sorhus) + - Arabic (thanks HadiIOS) + - Polish (thanks Jacek Kwiecień) + - Spanish (thanks David Jorge) + - Hebrew (thanks Asaf Siman-Tov) + - Danish (thanks kaspernissen) + - Sweedish (thanks Paul Peelen) + - Portugese (thanks Natan Rolnik) + - Greek (thanks Konstantinos) + - Italian (thanks Giuseppe Filograno) + - Hungarian (thanks Andras Kadar) + - Please help translate `FDTake.strings` to more languages + * Pure Swift support and iOS 8+ required + * Compile testing running on Travis CI + * In progress: functional test cases ([please help](https://github.com/fulldecent/FDTake/issues/72)) + * In progress: UI test cases ([please help](https://github.com/fulldecent/FDTake/issues/72)) + * In progress: select last photo used ([please help](https://github.com/fulldecent/FDTake/issues/22)) + + +## Installation + +FDTake is available through [CocoaPods](http://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod 'FDTake' +``` + + +## Author + +William Entriken, github.com@phor.net + + +## License + +FDTake is available under the MIT license. See the LICENSE file for more info. + +## Contributing + +This project's layout is based on https://github.com/fulldecent/swift3-module-template If you would like to change the layout, please change that project FIRST. Also you may appreciate that project has "recipes" -- you don't just change code you explain why you are doing things. As a maintainer this makes my job MUCH simpler. In a similar respect, if you are introducing non-minor changes, it will be VERY helpful if you could please reference to another project (like AlamoFire) that has seen and discussed the types of design challenges you are touching.) Thanks again and we all really do appreciate your contributions. diff --git a/Pods/FDTake/Source/FDTake.h b/Pods/FDTake/Source/FDTake.h new file mode 100644 index 0000000..43ee9e1 --- /dev/null +++ b/Pods/FDTake/Source/FDTake.h @@ -0,0 +1,19 @@ +// +// FDTake.h +// FDTake +// +// Created by William Entriken on Sep 17, 2016. +// Copyright © 2016 William Entriken. All rights reserved. +// + +#import + +//! Project version number for FDTake. +FOUNDATION_EXPORT double FDTakeVersionNumber; + +//! Project version string for FDTake. +FOUNDATION_EXPORT const unsigned char FDTakeVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Pods/FDTake/Source/FDTakeController.swift b/Pods/FDTake/Source/FDTakeController.swift new file mode 100644 index 0000000..3c712f8 --- /dev/null +++ b/Pods/FDTake/Source/FDTakeController.swift @@ -0,0 +1,357 @@ +// +// FDTakeController.swift +// FDTakeExample +// +// Copyright © 2015 William Entriken. All rights reserved. +// + +import Foundation +import MobileCoreServices +import UIKit + +/// User interface strings +fileprivate enum FDTakeControllerLocalizableStrings: String { + /// Decline to proceed with operation + case cancel = "cancel" + + /// Option to select photo from library + case chooseFromLibrary = "chooseFromLibrary" + + /// Option to select photo from photo roll + case chooseFromPhotoRoll = "chooseFromPhotoRoll" + + /// There are no sources available to select a photo + case noSources = "noSources" + + /// Option to take photo using camera + case takePhoto = "takePhoto" + + /// Option to take video using camera + case takeVideo = "takeVideo" + + public func comment() -> String { + switch self { + case .cancel: + return "Decline to proceed with operation" + case .chooseFromLibrary: + return "Option to select photo/video from library" + case .chooseFromPhotoRoll: + return "Option to select photo from photo roll" + case .noSources: + return "There are no sources available to select a photo" + case .takePhoto: + return "Option to take photo using camera" + case .takeVideo: + return "Option to take video using camera" + } + } +} + +/// A class for select and taking photos +open class FDTakeController: NSObject /* , UIImagePickerControllerDelegate, UINavigationControllerDelegate*/ { + + // MARK: - Initializers & Class Convenience Methods + + /// Public initializer + public override init() { + super.init() + } + + /// Convenience method for getting a photo + open class func getPhotoWithCallback(getPhotoWithCallback callback: @escaping (_ photo: UIImage, _ info: [AnyHashable: Any]) -> Void) { + let fdTake = FDTakeController() + fdTake.allowsVideo = false + fdTake.didGetPhoto = callback + fdTake.present() + } + + /// Convenience method for getting a video + open class func getVideoWithCallback(getVideoWithCallback callback: @escaping (_ video: URL, _ info: [AnyHashable: Any]) -> Void) { + let fdTake = FDTakeController() + fdTake.allowsPhoto = false + fdTake.didGetVideo = callback + fdTake.present() + } + + + // MARK: - Configuration options + + /// Whether to allow selecting a photo + open var allowsPhoto = true + + /// Whether to allow selecting a video + open var allowsVideo = true + + /// Whether to allow capturing a photo/video with the camera + open var allowsTake = true + + /// Whether to allow selecting existing media + open var allowsSelectFromLibrary = true + + /// Whether to allow editing the media after capturing/selection + open var allowsEditing = false + + /// Whether to use full screen camera preview on the iPad + open var iPadUsesFullScreenCamera = false + + /// Enable selfie mode by default + open var defaultsToFrontCamera = false + + /// The UIBarButtonItem to present from (may be replaced by a overloaded methods) + open var presentingBarButtonItem: UIBarButtonItem? = nil + + /// The UIView to present from (may be replaced by a overloaded methods) + open var presentingView: UIView? = nil + + /// The UIRect to present from (may be replaced by a overloaded methods) + open var presentingRect: CGRect? = nil + + /// The UITabBar to present from (may be replaced by a overloaded methods) + open var presentingTabBar: UITabBar? = nil + + /// The UIViewController to present from (may be replaced by a overloaded methods) + open lazy var presentingViewController: UIViewController = { + return UIApplication.shared.keyWindow!.rootViewController! + }() + + + // MARK: - Callbacks + + /// A photo was selected + open var didGetPhoto: ((_ photo: UIImage, _ info: [AnyHashable: Any]) -> Void)? + + /// A video was selected + open var didGetVideo: ((_ video: URL, _ info: [AnyHashable: Any]) -> Void)? + + /// The user selected did not attempt to select a photo + open var didDeny: (() -> Void)? + + /// The user started selecting a photo or took a photo and then hit cancel + open var didCancel: (() -> Void)? + + /// A photo or video was selected but the ImagePicker had NIL for EditedImage and OriginalImage + open var didFail: (() -> Void)? + + + // MARK: - Localization overrides + + /// Custom UI text (skips localization) + open var cancelText: String? = nil + + /// Custom UI text (skips localization) + open var chooseFromLibraryText: String? = nil + + /// Custom UI text (skips localization) + open var chooseFromPhotoRollText: String? = nil + + /// Custom UI text (skips localization) + open var noSourcesText: String? = nil + + /// Custom UI text (skips localization) + open var takePhotoText: String? = nil + + /// Custom UI text (skips localization) + open var takeVideoText: String? = nil + + + // MARK: - Private + + fileprivate lazy var imagePicker: UIImagePickerController = { + [unowned self] in + let retval = UIImagePickerController() + retval.delegate = self + retval.allowsEditing = true + return retval + }() + + fileprivate lazy var popover: UIPopoverController = { + [unowned self] in + return UIPopoverController(contentViewController: self.imagePicker) + }() + + fileprivate var alertController: UIAlertController? = nil + + // This is a hack required on iPad if you want to select a photo and you already have a popup on the screen + // see: http://stackoverflow.com/a/34392409/300224 + fileprivate func topViewController(_ rootViewController: UIViewController) -> UIViewController { + var rootViewController = UIApplication.shared.keyWindow!.rootViewController! + repeat { + guard let presentedViewController = rootViewController.presentedViewController else { + return rootViewController + } + + if let navigationController = rootViewController.presentedViewController as? UINavigationController { + rootViewController = navigationController.topViewController ?? navigationController + + } else { + rootViewController = presentedViewController + } + } while true + } + + // MARK: - Localization + + private func localizeString(_ string:FDTakeControllerLocalizableStrings) -> String { + let bundle = Bundle(for: type(of: self)) + //let stringsURL = bundle.resourceURL!.appendingPathComponent("Localizable.strings") + let bundleLocalization = bundle.localizedString(forKey: string.rawValue, value: nil, table: nil) + //let a = NSLocal + //let bundleLocalization = NSLocalizedString(string.rawValue, tableName: nil, bundle: bundle, value: string.rawValue, comment: string.comment()) + + + switch string { + case .cancel: + return self.cancelText ?? bundleLocalization + case .chooseFromLibrary: + return self.chooseFromLibraryText ?? bundleLocalization + case .chooseFromPhotoRoll: + return self.chooseFromPhotoRollText ?? bundleLocalization + case .noSources: + return self.noSourcesText ?? bundleLocalization + case .takePhoto: + return self.takePhotoText ?? bundleLocalization + case .takeVideo: + return self.takeVideoText ?? bundleLocalization + } + } + + + /// Presents the user with an option to take a photo or choose a photo from the library + open func present() { + //TODO: maybe encapsulate source selection? + var titleToSource = [(buttonTitle: FDTakeControllerLocalizableStrings, source: UIImagePickerControllerSourceType)]() + + if self.allowsTake && UIImagePickerController.isSourceTypeAvailable(.camera) { + if self.allowsPhoto { + titleToSource.append((buttonTitle: .takePhoto, source: .camera)) + } + if self.allowsVideo { + titleToSource.append((buttonTitle: .takeVideo, source: .camera)) + } + } + if self.allowsSelectFromLibrary { + if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { + titleToSource.append((buttonTitle: .chooseFromLibrary, source: .photoLibrary)) + } else if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum) { + titleToSource.append((buttonTitle: .chooseFromPhotoRoll, source: .savedPhotosAlbum)) + } + } + + guard titleToSource.count > 0 else { + let str = localizeString(.noSources) + + //TODO: Encapsulate this + //TODO: These has got to be a better way to do this + let alert = UIAlertController(title: nil, message: str, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: localizeString(.cancel), style: .default, handler: nil)) + + // http://stackoverflow.com/a/34487871/300224 + let alertWindow = UIWindow(frame: UIScreen.main.bounds) + alertWindow.rootViewController = UIViewController() + alertWindow.windowLevel = UIWindowLevelAlert + 1; + alertWindow.makeKeyAndVisible() + alertWindow.rootViewController?.present(alert, animated: true, completion: nil) + return + } + + var popOverPresentRect : CGRect = self.presentingRect ?? CGRect(x: 0, y: 0, width: 1, height: 1) + if popOverPresentRect.size.height == 0 || popOverPresentRect.size.width == 0 { + popOverPresentRect = CGRect(x: 0, y: 0, width: 1, height: 1) + } + + alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) + for (title, source) in titleToSource { + let action = UIAlertAction(title: localizeString(title), style: .default) { + (UIAlertAction) -> Void in + self.imagePicker.sourceType = source + if source == .camera && self.defaultsToFrontCamera && UIImagePickerController.isCameraDeviceAvailable(.front) { + self.imagePicker.cameraDevice = .front + } + // set the media type: photo or video + self.imagePicker.allowsEditing = self.allowsEditing + var mediaTypes = [String]() + if self.allowsPhoto { + mediaTypes.append(String(kUTTypeImage)) + } + if self.allowsVideo { + mediaTypes.append(String(kUTTypeMovie)) + } + self.imagePicker.mediaTypes = mediaTypes + + //TODO: Need to encapsulate popover code + var popOverPresentRect: CGRect = self.presentingRect ?? CGRect(x: 0, y: 0, width: 1, height: 1) + if popOverPresentRect.size.height == 0 || popOverPresentRect.size.width == 0 { + popOverPresentRect = CGRect(x: 0, y: 0, width: 1, height: 1) + } + let topVC = self.topViewController(self.presentingViewController) + + // + if UI_USER_INTERFACE_IDIOM() == .phone || (source == .camera && self.iPadUsesFullScreenCamera) { + topVC.present(self.imagePicker, animated: true, completion: nil) + } else { + // On iPad use pop-overs. + self.popover.present(from: popOverPresentRect, in: topVC.view!, permittedArrowDirections: .any, animated: true) + } + } + alertController!.addAction(action) + } + let cancelAction = UIAlertAction(title: localizeString(.cancel), style: .cancel) { + (UIAlertAction) -> Void in + self.didCancel?() + } + alertController!.addAction(cancelAction) + + let topVC = topViewController(presentingViewController) + + alertController?.modalPresentationStyle = .popover + if let presenter = alertController!.popoverPresentationController { + presenter.sourceView = presentingView; + if let presentingRect = self.presentingRect { + presenter.sourceRect = presentingRect + } + //WARNING: on ipad this fails if no SOURCEVIEW AND SOURCE RECT is provided + } + topVC.present(alertController!, animated: true, completion: nil) + } + + /// Dismisses the displayed view. Especially handy if the sheet is displayed while suspending the app, + open func dismiss() { + alertController?.dismiss(animated: true, completion: nil) + imagePicker.dismiss(animated: true, completion: nil) + } +} + +extension FDTakeController : UIImagePickerControllerDelegate, UINavigationControllerDelegate { + /// Conformance for ImagePicker delegate + public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { + UIApplication.shared.isStatusBarHidden = true + let mediaType: String = info[UIImagePickerControllerMediaType] as! String + var imageToSave: UIImage + // Handle a still image capture + if mediaType == kUTTypeImage as String { + if let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage { + imageToSave = editedImage + } else if let originalImage = info[UIImagePickerControllerOriginalImage] as? UIImage { + imageToSave = originalImage + } else { + self.didCancel?() + return + } + self.didGetPhoto?(imageToSave, info) + if UI_USER_INTERFACE_IDIOM() == .pad { + self.popover.dismiss(animated: true) + } + } else if mediaType == kUTTypeMovie as String { + self.didGetVideo?(info[UIImagePickerControllerMediaURL] as! URL, info) + } + + picker.dismiss(animated: true, completion: nil) + } + + /// Conformance for image picker delegate + public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { + UIApplication.shared.isStatusBarHidden = true + picker.dismiss(animated: true, completion: nil) + self.didDeny?() + } +} diff --git a/Pods/FDTake/Source/Info.plist b/Pods/FDTake/Source/Info.plist new file mode 100644 index 0000000..fbe1e6b --- /dev/null +++ b/Pods/FDTake/Source/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Pods/FDTake/Source/ar.lproj/Localizable.strings b/Pods/FDTake/Source/ar.lproj/Localizable.strings new file mode 100644 index 0000000..181a241 --- /dev/null +++ b/Pods/FDTake/Source/ar.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "إلغاء"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "إختر من المكتبة"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "إختر من معرض الصور"; + +/* There are no sources available to select a photo */ +"noSources" = "لا يوجد مصدر متاح لإختيار الصورة"; + +/* Option to take photo using camera */ +"takePhoto" = "التقط صورة"; + +/* Option to take video using camera */ +"takeVideo" = "التقط فيديو"; diff --git a/Pods/FDTake/Source/da.lproj/Localizable.strings b/Pods/FDTake/Source/da.lproj/Localizable.strings new file mode 100644 index 0000000..dfc956b --- /dev/null +++ b/Pods/FDTake/Source/da.lproj/Localizable.strings @@ -0,0 +1,18 @@ +/* Decline to proceed with operation */ +"cancel" = "Annuller"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Vælg fra bibliotek"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Vælg fra kamerarulle"; + +/* There are no sources available to select a photo */ +"noSources" = "Der er ikke muligt at vælge et billede"; + +/* Option to take photo using camera */ +"takePhoto" = "Tag billede"; + +/* Option to take video using camera */ +"takeVideo" = "Optag video"; + diff --git a/Pods/FDTake/Source/de.lproj/Localizable.strings b/Pods/FDTake/Source/de.lproj/Localizable.strings new file mode 100644 index 0000000..dc97c80 --- /dev/null +++ b/Pods/FDTake/Source/de.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Abbrechen"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Foto von Bibliothek auswählen"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Photo von Album auswählen"; + +/* There are no sources available to select a photo */ +"noSources" = "Keine Dateien vorhanden"; + +/* Option to take photo using camera */ +"takePhoto" = "Photo aufnehmen"; + +/* Option to take video using camera */ +"takeVideo" = "Video aufnehmen"; diff --git a/Pods/FDTake/Source/el.lproj/Localizable.strings b/Pods/FDTake/Source/el.lproj/Localizable.strings new file mode 100644 index 0000000..9d393d2 --- /dev/null +++ b/Pods/FDTake/Source/el.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Ακύρωση"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Επιλέξτε απο την βιβλιοθήκη"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Επιλέξτε απο το άλμπουμ της κάμερας"; + +/* There are no sources available to select a photo */ +"noSources" = "Δεν υπάρχουν διαθέσιμες πηγές για να επιλέξετε μια φωτογραφία"; + +/* Option to take photo using camera */ +"takePhoto" = "Τραβήξτε Φωτογραφία"; + +/* Option to take video using camera */ +"takeVideo" = "Τραβήξτε Βίντεο"; diff --git a/Pods/FDTake/Source/en.lproj/Localizable.strings b/Pods/FDTake/Source/en.lproj/Localizable.strings new file mode 100644 index 0000000..e43e9b1 --- /dev/null +++ b/Pods/FDTake/Source/en.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Cancel"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Choose from library"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Choose from photo roll"; + +/* There are no sources available to select a photo */ +"noSources" = "There are no sources available to select a photo"; + +/* Option to take photo using camera */ +"takePhoto" = "Take photo"; + +/* Option to take video using camera */ +"takeVideo" = "Take video"; diff --git a/Pods/FDTake/Source/es.lproj/Localizable.strings b/Pods/FDTake/Source/es.lproj/Localizable.strings new file mode 100644 index 0000000..f75d57a --- /dev/null +++ b/Pods/FDTake/Source/es.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Cancelar"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Elegir de la galería"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Elegir del carrete"; + +/* There are no sources available to select a photo */ +"noSources" = "No hay fuentes disponibles para elegir una foto"; + +/* Option to take photo using camera */ +"takePhoto" = "Hacer foto"; + +/* Option to take video using camera */ +"takeVideo" = "Grabar vídeo"; diff --git a/Pods/FDTake/Source/fr.lproj/Localizable.strings b/Pods/FDTake/Source/fr.lproj/Localizable.strings new file mode 100644 index 0000000..d5cc99f --- /dev/null +++ b/Pods/FDTake/Source/fr.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Annuler"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Choisir une photo de la bibliothèque"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Choisir une photo de la pellicule"; + +/* There are no sources available to select a photo */ +"noSources" = "Aucune source disponible pour le choix de la photo"; + +/* Option to take photo using camera */ +"takePhoto" = "Prendre une photo"; + +/* Option to take video using camera */ +"takeVideo" = "Prendre une vidéo"; diff --git a/Pods/FDTake/Source/he.lproj/Localizable.strings b/Pods/FDTake/Source/he.lproj/Localizable.strings new file mode 100644 index 0000000..ce963f2 --- /dev/null +++ b/Pods/FDTake/Source/he.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "ביטול"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "בחר מתיקייה"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "​בחר תמונה ​קיימת"; + +/* There are no sources available to select a photo */ +"noSources" = "חסרים משאבים כדי לבחור תמונה"; + +/* Option to take photo using camera */ +"takePhoto" = "צלם תמונה"; + +/* Option to take video using camera */ +"takeVideo" = "צלם וידאו"; diff --git a/Pods/FDTake/Source/hu.lproj/Localizable.strings b/Pods/FDTake/Source/hu.lproj/Localizable.strings new file mode 100644 index 0000000..d4df48f --- /dev/null +++ b/Pods/FDTake/Source/hu.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Mégsem"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Választás Fotótárból"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Választás a Fénykép Tekercsből"; + +/* There are no sources available to select a photo */ +"noSources" = "Nincs megfelelő forrás a fotó kiválasztásához."; + +/* Option to take photo using camera */ +"takePhoto" = "Fotó készítése"; + +/* Option to take video using camera */ +"takeVideo" = "Videó készítése"; diff --git a/Pods/FDTake/Source/it.lproj/Localizable.strings b/Pods/FDTake/Source/it.lproj/Localizable.strings new file mode 100644 index 0000000..f0f8fc6 --- /dev/null +++ b/Pods/FDTake/Source/it.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Annulla"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Scegli dalla libreria"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Scegli dal rullino foto"; + +/* There are no sources available to select a photo */ +"noSources" = "Non ci sono sorgenti disponibili per selezionare una foto"; + +/* Option to take photo using camera */ +"takePhoto" = "Scatta foto"; + +/* Option to take video using camera */ +"takeVideo" = "Registra video"; diff --git a/Pods/FDTake/Source/nb.lproj/Localizable.strings b/Pods/FDTake/Source/nb.lproj/Localizable.strings new file mode 100644 index 0000000..7e71476 --- /dev/null +++ b/Pods/FDTake/Source/nb.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Avbryt"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Velg eksisterende"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Velg fra kamerarull"; + +/* There are no sources available to select a photo */ +"noSources" = "Det er ingen tilgjengelige kilder for å velge et bilde"; + +/* Option to take photo using camera */ +"takePhoto" = "Ta bilde"; + +/* Option to take video using camera */ +"takeVideo" = "Ta video"; diff --git a/Pods/FDTake/Source/nl.lproj/Localizable.strings b/Pods/FDTake/Source/nl.lproj/Localizable.strings new file mode 100644 index 0000000..fe620ac --- /dev/null +++ b/Pods/FDTake/Source/nl.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Annuleer"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Kies bestaande"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Kies uit filmrol"; + +/* There are no sources available to select a photo */ +"noSources" = "There are no sources available to select a photo"; + +/* Option to take photo using camera */ +"takePhoto" = "Maak foto"; + +/* Option to take video using camera */ +"takeVideo" = "Maak video"; diff --git a/Pods/FDTake/Source/pl.lproj/Localizable.strings b/Pods/FDTake/Source/pl.lproj/Localizable.strings new file mode 100644 index 0000000..ca1908a --- /dev/null +++ b/Pods/FDTake/Source/pl.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Anuluj"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Wybierz z galerii"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Wybierz z rolki aparatu"; + +/* There are no sources available to select a photo */ +"noSources" = "Brak źródła, z którego można by wybrać zdjęcie"; + +/* Option to take photo using camera */ +"takePhoto" = "Zrób zdjęcie"; + +/* Option to take video using camera */ +"takeVideo" = "Nagraj film"; diff --git a/Pods/FDTake/Source/pt-PT.lproj/Localizable.strings b/Pods/FDTake/Source/pt-PT.lproj/Localizable.strings new file mode 100644 index 0000000..e904b0d --- /dev/null +++ b/Pods/FDTake/Source/pt-PT.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Cancelar"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Escolher existente"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Escolher do rolo da câmera"; + +/* There are no sources available to select a photo */ +"noSources" = "Não há fontes disponíveis para selecionar uma foto"; + +/* Option to take photo using camera */ +"takePhoto" = "Tirar foto"; + +/* Option to take video using camera */ +"takeVideo" = "Filmar vídeo"; diff --git a/Pods/FDTake/Source/ru.lproj/Localizable.strings b/Pods/FDTake/Source/ru.lproj/Localizable.strings new file mode 100644 index 0000000..52cc282 --- /dev/null +++ b/Pods/FDTake/Source/ru.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Отмена"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Выберите из библиотеки"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Выберите из фотопленки"; + +/* There are no sources available to select a photo */ +"noSources" = "Нет доступных источников для выбора фото"; + +/* Option to take photo using camera */ +"takePhoto" = "Сфотографировать"; + +/* Option to take video using camera */ +"takeVideo" = "Снять видео"; diff --git a/Pods/FDTake/Source/sv.lproj/Localizable.strings b/Pods/FDTake/Source/sv.lproj/Localizable.strings new file mode 100644 index 0000000..6f604aa --- /dev/null +++ b/Pods/FDTake/Source/sv.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "Avbryt"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Välj befintlig"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Ta bild eller video"; + +/* There are no sources available to select a photo */ +"noSources" = "Det finns inga tillgängliga källor för att välja ett foto"; + +/* Option to take photo using camera */ +"takePhoto" = "Ta bild"; + +/* Option to take video using camera */ +"takeVideo" = "Ta video"; diff --git a/Pods/FDTake/Source/tr.lproj/Localizable.strings b/Pods/FDTake/Source/tr.lproj/Localizable.strings new file mode 100644 index 0000000..4154f3e --- /dev/null +++ b/Pods/FDTake/Source/tr.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "İptal"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "Kütüphaneden seç"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "Kameradan seç"; + +/* There are no sources available to select a photo */ +"noSources" = "Resim seçimi için hiçbir kaynak bulunamadı."; + +/* Option to take photo using camera */ +"takePhoto" = "Fotoğraf çek."; + +/* Option to take video using camera */ +"takeVideo" = "Bir video çekin."; diff --git a/Pods/FDTake/Source/zh-Hans.lproj/Localizable.strings b/Pods/FDTake/Source/zh-Hans.lproj/Localizable.strings new file mode 100644 index 0000000..233592a --- /dev/null +++ b/Pods/FDTake/Source/zh-Hans.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "取消"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "从相册选择"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "从相册选择"; + +/* There are no sources available to select a photo */ +"noSources" = "没有照片可选"; + +/* Option to take photo using camera */ +"takePhoto" = "拍照"; + +/* Option to take video using camera */ +"takeVideo" = "拍视频"; diff --git a/Pods/FDTake/Source/zh-Hant.lproj/Localizable.strings b/Pods/FDTake/Source/zh-Hant.lproj/Localizable.strings new file mode 100644 index 0000000..44990f9 --- /dev/null +++ b/Pods/FDTake/Source/zh-Hant.lproj/Localizable.strings @@ -0,0 +1,17 @@ +/* Decline to proceed with operation */ +"cancel" = "取消"; + +/* Option to select photo from library */ +"chooseFromLibrary" = "從相冊選擇"; + +/* Option to select photo from photo roll */ +"chooseFromPhotoRoll" = "從相冊選擇"; + +/* There are no sources available to select a photo */ +"noSources" = "沒有照片可選"; + +/* Option to take photo using camera */ +"takePhoto" = "拍照"; + +/* Option to take video using camera */ +"takeVideo" = "拍視頻"; diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock new file mode 100644 index 0000000..a6480d6 --- /dev/null +++ b/Pods/Manifest.lock @@ -0,0 +1,20 @@ +PODS: + - FDTake (2.0.0) + - PryntTrimmerView (2.0.1) + +DEPENDENCIES: + - FDTake + - PryntTrimmerView + +SPEC REPOS: + https://github.com/CocoaPods/Specs.git: + - FDTake + - PryntTrimmerView + +SPEC CHECKSUMS: + FDTake: 21152c660ddf075a859f86af83f9d17dc4b5a539 + PryntTrimmerView: 4260ae497a2f3e1bbfc0b71247eb74ab92bf0490 + +PODFILE CHECKSUM: 2b8d33bd57a2ab3ba64f8ffdbf4ecd4cccf326e1 + +COCOAPODS: 1.5.0 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..1c68fb3 --- /dev/null +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1204 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 026FE915AD8D2818FA656AD643CDBDA0 /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 7136601BDCB39CDDBAD093E869E1EF71 /* Localizable.strings */; }; + 0A4F7F1139782166B26076ED2136647C /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 3BF89784B25F956888EA829364663475 /* Localizable.strings */; }; + 102A67929A494B567CB5909ED2A5A3C4 /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 4B82FC3D23E97C06E539EE609DDDF846 /* Localizable.strings */; }; + 1A61E1BB499964DC3ABBDDE159D35B61 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; + 1FEFAC01D8CCE09D1FB401A00ECB7CCE /* PryntTrimmerView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CA46BA2D1E21E0F3676BE626F0F1A85 /* PryntTrimmerView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2D9E61A0900DACA452D6E2C3059F6FED /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 32E54E050B67B5888AFABCE04E1FDF7D /* Localizable.strings */; }; + 30287309C19F78204080A84BAF0985E3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; + 3B81AD6C5A05BC0AFBD01FE30CF1F181 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; + 3C101CEDF2D1678CF899965AF4687351 /* PryntTrimmerView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E89318044790AC4C207A032D87C70A3 /* PryntTrimmerView-dummy.m */; }; + 40A84508B8D2D3A0BDAA4CAAFEAE3242 /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 5B47115BEF792A273C04407065A806FE /* Localizable.strings */; }; + 495711649DED7A0BC067AC2C81C36E1D /* CropMaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A015968E6C88EAFBB6D27516BEB96AA /* CropMaskView.swift */; }; + 502BA91E41FEADE1F345F8439AAE1B48 /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = C6F8F645C3BEE194C20F56F43B41772A /* Localizable.strings */; }; + 555856CB51012D5687D619FC2A5FC158 /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = A410E38DA3A7230C0AAEA242F1A49819 /* Localizable.strings */; }; + 575F81EEE63F7468CE65625E1ED6A325 /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 6C2582256EF269FB9F5C0F0BF0A41B84 /* Localizable.strings */; }; + 683CDD3125BC0FE9AA1E94BE30082521 /* Pods-testingUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9377639F425C6BDAB9B166D6AE51777D /* Pods-testingUITests-dummy.m */; }; + 73F284B4BDD7284CA448586215D019B5 /* Pods-testingUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 12FB342931C4CD5BB9EA2B41FE0D2F71 /* Pods-testingUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 74E8A1B2F4BD16B1869A5480BED16FED /* ThumbSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE50EE9ED708B81ABC82C720A39F8884 /* ThumbSelectorView.swift */; }; + 75DC3493D90DA707E02A926E9337013B /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 7408E6A2D8ED19B3FBB621FD7818903B /* Localizable.strings */; }; + 776DE97CF5D9AD584D2872369B4D89FB /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = EC41FE292E0D30A6B74B47F7D3034E5C /* Localizable.strings */; }; + 77942FB82FE4965AADA5FEB194191D8C /* Pods-testingTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 332AF3D8821AE58A9C64F55005BE0B8A /* Pods-testingTests-dummy.m */; }; + 7AB4095A166568E7843E8F19E4AF185A /* Pods-testing-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D0885E48D0BA2EFE975424F8ABB57DB /* Pods-testing-dummy.m */; }; + 8266744C26905124BFBB3AD70A9A606E /* Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 8985C62EE5575FA6F1FCC1EC3AD537DD /* Info.plist */; }; + 84555B6F0382C8649063D5E6052DAFA5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; + 89CF80735E1835357BD29AB02C829EBA /* AssetVideoScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E8276ACD973C10F422623FD9697132 /* AssetVideoScrollView.swift */; }; + 8D9A20D1101C3FF4B68B52E16ED19AC7 /* Pods-testing-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E6F5684818F562FDF395498F45D361B /* Pods-testing-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 935E6921156427B456DDCDE67CD38BDA /* Pods-testingTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 49EC4650302449A2A6A8A7E344A37EE6 /* Pods-testingTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9777237E6B5F9B0319BEE20B4447DBAA /* VideoScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C06CA9C48E12F43B3031B32DD73E92EA /* VideoScrollView.swift */; }; + 9886001E2360094E02A50472D95B8FEA /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 3E15B6B0926BDE079D1FF92C3B55CE17 /* Localizable.strings */; }; + A70BC074093E0921978709274D687FFB /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = ECD7AD6F63E3217550AEF0FA2A0A5711 /* Localizable.strings */; }; + AC1031D65D075DB09642D9757FEC4D27 /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 72C57C66CDD773A01F63E53F79E80DDF /* Localizable.strings */; }; + B0569695B7A16A926C839A6DDD23869B /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = A9E8031B1678CEC1AD3E0BA4AF2D6B45 /* Localizable.strings */; }; + B4EFF12F68E2B9D70124CD0CB3C97B0F /* PryntTrimmerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 708C5A6BF8663D38BC2AA97803DC0D7D /* PryntTrimmerView.swift */; }; + B7982E847C3F06D09808930ADE53D225 /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 68A8ABE8B0C54720B3EACD261F95DCB9 /* Localizable.strings */; }; + B84C090D2DDB55E4634FBD2AC48A299C /* FDTake-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 16EEE482C9BA75FDC1AB08084B395063 /* FDTake-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD4B44233D8A5CFA4C1885DC736B94CC /* VideoCropView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFF44DC45D050093D0B0A245A0E1FB3 /* VideoCropView.swift */; }; + D2D466DCE6393B4BC6A9E9DE5753FA48 /* FDTake-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B580392F9B7AD043C4C77A7FFA77611 /* FDTake-dummy.m */; }; + D6FDCD21177F2DF43C7661BD0E13B040 /* HandlerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90807A0E1F2BDD4965195180F323B0A0 /* HandlerView.swift */; }; + DF0C9690E4E3B068D728ACD53094A43E /* AVAssetTimeSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1274B0857194D206A45128B2124ADBFD /* AVAssetTimeSelector.swift */; }; + E5216D8C71C4E2409AD135ACD001C3ED /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 475358B21BEEDF5A2F71C259179ACE97 /* Localizable.strings */; }; + E9A18619BD0757DED90A284BC3770D4A /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = FCB576725448CC84880D131911F59067 /* Localizable.strings */; }; + EBCDC230259EB16B2665FA8C79B7328D /* FDTake.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0DE9042A5FD9209875A534761F3BCC /* FDTake.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F0E396AC6DC2D2B172452D28EB3E95D0 /* FDTakeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345A5048C08806814C0E55B0E5BE3B8 /* FDTakeController.swift */; }; + F792920BDE0AE9D60C60B78007A861E0 /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 5981E8224129325481C90A617758386E /* Localizable.strings */; }; + FDC3B287464DDB37CD43A04402588A16 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; + FE505D8FAF07168C42DDBD885A4D1E21 /* Localizable.strings in Sources */ = {isa = PBXBuildFile; fileRef = 41C84DD5F5A792270E3A477163B5DF94 /* Localizable.strings */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 6F7AE388A81F4DEBDD069C92F3405167 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5BDD18CFD25C9C8EB23F1B735E50AE2B; + remoteInfo = PryntTrimmerView; + }; + 8678033C425354C977938039893F71B2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = E25D1347A59BFC223372DC9BB39811DF; + remoteInfo = FDTake; + }; + C411EC629702070DA4A6A517E1B59634 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = E3C092A1482E6825F5F76AC2561B5806; + remoteInfo = "Pods-testing"; + }; + F552A0115CA6C990248CA8CA206D66DF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = E3C092A1482E6825F5F76AC2561B5806; + remoteInfo = "Pods-testing"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0345A5048C08806814C0E55B0E5BE3B8 /* FDTakeController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FDTakeController.swift; path = Source/FDTakeController.swift; sourceTree = ""; }; + 096667F824EF8F9453A9BF1799896D4F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1274B0857194D206A45128B2124ADBFD /* AVAssetTimeSelector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AVAssetTimeSelector.swift; path = PryntTrimmerView/Classes/Parents/AVAssetTimeSelector.swift; sourceTree = ""; }; + 12FB342931C4CD5BB9EA2B41FE0D2F71 /* Pods-testingUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-testingUITests-umbrella.h"; sourceTree = ""; }; + 16EEE482C9BA75FDC1AB08084B395063 /* FDTake-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FDTake-umbrella.h"; sourceTree = ""; }; + 17085A21A932E3C9632A185B09BA2A05 /* Pods-testingTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-testingTests-frameworks.sh"; sourceTree = ""; }; + 272360D750CF93E8D4B0084C8888B97B /* FDTake.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FDTake.modulemap; sourceTree = ""; }; + 2B88BB1BA60CC4D8E13B92A43F7A5CB4 /* Pods_testingTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_testingTests.framework; path = "Pods-testingTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2D0885E48D0BA2EFE975424F8ABB57DB /* Pods-testing-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-testing-dummy.m"; sourceTree = ""; }; + 2E5459C8B0E7B9B2A30E26D1ECB230B3 /* Pods-testingUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-testingUITests.debug.xcconfig"; sourceTree = ""; }; + 2E6F5684818F562FDF395498F45D361B /* Pods-testing-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-testing-umbrella.h"; sourceTree = ""; }; + 319BA5BB5D2BA0C925F26A996F103673 /* FDTake.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FDTake.framework; path = FDTake.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 32E54E050B67B5888AFABCE04E1FDF7D /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = sv.lproj/Localizable.strings; sourceTree = ""; }; + 332AF3D8821AE58A9C64F55005BE0B8A /* Pods-testingTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-testingTests-dummy.m"; sourceTree = ""; }; + 3A270EA56604F6FB806330F4884126D5 /* Pods-testing-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-testing-acknowledgements.plist"; sourceTree = ""; }; + 3A75CF3D61B35949AB24C6D1F9DF829C /* Pods-testingTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-testingTests.debug.xcconfig"; sourceTree = ""; }; + 3B580392F9B7AD043C4C77A7FFA77611 /* FDTake-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FDTake-dummy.m"; sourceTree = ""; }; + 3BF89784B25F956888EA829364663475 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + 3E15B6B0926BDE079D1FF92C3B55CE17 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + 4121E2C30798CFF283204E3EF3C2A0D8 /* Pods-testingTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-testingTests-acknowledgements.plist"; sourceTree = ""; }; + 41C84DD5F5A792270E3A477163B5DF94 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = nb.lproj/Localizable.strings; sourceTree = ""; }; + 475358B21BEEDF5A2F71C259179ACE97 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + 49EC4650302449A2A6A8A7E344A37EE6 /* Pods-testingTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-testingTests-umbrella.h"; sourceTree = ""; }; + 4B82FC3D23E97C06E539EE609DDDF846 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = tr.lproj/Localizable.strings; sourceTree = ""; }; + 5981E8224129325481C90A617758386E /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = pl.lproj/Localizable.strings; sourceTree = ""; }; + 5B47115BEF792A273C04407065A806FE /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = da.lproj/Localizable.strings; sourceTree = ""; }; + 5B88694C3FA4610CFF12473E725D3B8D /* Pods-testingTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-testingTests.release.xcconfig"; sourceTree = ""; }; + 5C3B4C256E15F0EE709690A27B83B290 /* Pods-testingTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-testingTests.modulemap"; sourceTree = ""; }; + 5CE5282D2FE2B996CE03C11F10E92312 /* Pods-testingUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-testingUITests-acknowledgements.markdown"; sourceTree = ""; }; + 60EDA3696DBF1CC264F125F6217D2554 /* FDTake-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FDTake-prefix.pch"; sourceTree = ""; }; + 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 68A8ABE8B0C54720B3EACD261F95DCB9 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = nl.lproj/Localizable.strings; sourceTree = ""; }; + 6C2582256EF269FB9F5C0F0BF0A41B84 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = en.lproj/Localizable.strings; sourceTree = ""; }; + 6CDCF2916A0DA298B1530B1DE724162A /* Pods-testing-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-testing-resources.sh"; sourceTree = ""; }; + 708C5A6BF8663D38BC2AA97803DC0D7D /* PryntTrimmerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PryntTrimmerView.swift; path = PryntTrimmerView/Classes/Trimmer/PryntTrimmerView.swift; sourceTree = ""; }; + 7136601BDCB39CDDBAD093E869E1EF71 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = el.lproj/Localizable.strings; sourceTree = ""; }; + 71AF641FFE3E5B4F7CE23E7135A6FDAB /* Pods_testingUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_testingUITests.framework; path = "Pods-testingUITests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 71D99B7D92F7391BF8528AFA32E311C0 /* Pods-testing.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-testing.release.xcconfig"; sourceTree = ""; }; + 72C57C66CDD773A01F63E53F79E80DDF /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + 7408E6A2D8ED19B3FBB621FD7818903B /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = ""; }; + 7940BBDB7A4399B763A96A1CF79AB7FD /* Pods_testing.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_testing.framework; path = "Pods-testing.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7A015968E6C88EAFBB6D27516BEB96AA /* CropMaskView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CropMaskView.swift; path = PryntTrimmerView/Classes/Cropper/CropMaskView.swift; sourceTree = ""; }; + 7B24FC141B5918339C6A7C1DED8FEC43 /* Pods-testingTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-testingTests-acknowledgements.markdown"; sourceTree = ""; }; + 7D509C95BD51079AE2279608C172A33D /* Pods-testingUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-testingUITests.release.xcconfig"; sourceTree = ""; }; + 7F2B71C10A5279C0BE3353AD8B3496E4 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 866078EED01EEB7275BB244E26837624 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8985C62EE5575FA6F1FCC1EC3AD537DD /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = Info.plist; path = Source/Info.plist; sourceTree = ""; }; + 8CA46BA2D1E21E0F3676BE626F0F1A85 /* PryntTrimmerView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PryntTrimmerView-umbrella.h"; sourceTree = ""; }; + 8E4D56A77F886ED0741BCE0702D15584 /* PryntTrimmerView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PryntTrimmerView.xcconfig; sourceTree = ""; }; + 8E972E0280521E27FBE0CF7E3CEA2281 /* PryntTrimmerView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PryntTrimmerView-prefix.pch"; sourceTree = ""; }; + 90807A0E1F2BDD4965195180F323B0A0 /* HandlerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HandlerView.swift; path = PryntTrimmerView/Classes/Trimmer/HandlerView.swift; sourceTree = ""; }; + 9377639F425C6BDAB9B166D6AE51777D /* Pods-testingUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-testingUITests-dummy.m"; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9D0DE9042A5FD9209875A534761F3BCC /* FDTake.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FDTake.h; path = Source/FDTake.h; sourceTree = ""; }; + 9E89318044790AC4C207A032D87C70A3 /* PryntTrimmerView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "PryntTrimmerView-dummy.m"; sourceTree = ""; }; + A07AD2CDBB705C84DC914E902228D52C /* Pods-testingUITests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-testingUITests-resources.sh"; sourceTree = ""; }; + A410E38DA3A7230C0AAEA242F1A49819 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = "pt-PT.lproj/Localizable.strings"; sourceTree = ""; }; + A4634B85D26355122A632BE383A70E7C /* Pods-testing.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-testing.debug.xcconfig"; sourceTree = ""; }; + A9E8031B1678CEC1AD3E0BA4AF2D6B45 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = it.lproj/Localizable.strings; sourceTree = ""; }; + AB21CA6DD150F1A059BEFC7B4D2658AD /* Pods-testingUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-testingUITests-acknowledgements.plist"; sourceTree = ""; }; + B3C1DAB57FB44B9850971B2AA533E19F /* Pods-testing.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-testing.modulemap"; sourceTree = ""; }; + B5E8276ACD973C10F422623FD9697132 /* AssetVideoScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssetVideoScrollView.swift; path = PryntTrimmerView/Classes/Parents/AssetVideoScrollView.swift; sourceTree = ""; }; + BE50EE9ED708B81ABC82C720A39F8884 /* ThumbSelectorView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThumbSelectorView.swift; path = PryntTrimmerView/Classes/ThumbSelectorView.swift; sourceTree = ""; }; + C06CA9C48E12F43B3031B32DD73E92EA /* VideoScrollView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoScrollView.swift; path = PryntTrimmerView/Classes/Cropper/VideoScrollView.swift; sourceTree = ""; }; + C1772DED9791949B463C956E6879F72E /* FDTake.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FDTake.xcconfig; sourceTree = ""; }; + C3648C72FB3B960F05EE2F742DE2ACD6 /* Pods-testingUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-testingUITests.modulemap"; sourceTree = ""; }; + C6F8F645C3BEE194C20F56F43B41772A /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = de.lproj/Localizable.strings; sourceTree = ""; }; + CAC5391662E45E39D0303F6268822085 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D1854469BA008A5ADD641E56EBCCFD31 /* PryntTrimmerView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = PryntTrimmerView.framework; path = PryntTrimmerView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DA17ED458D264BF4731546A01DAC6F41 /* PryntTrimmerView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = PryntTrimmerView.modulemap; sourceTree = ""; }; + DEFF44DC45D050093D0B0A245A0E1FB3 /* VideoCropView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoCropView.swift; path = PryntTrimmerView/Classes/Cropper/VideoCropView.swift; sourceTree = ""; }; + E201621BB401722649CAE11E21A9CC1A /* Pods-testingTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-testingTests-resources.sh"; sourceTree = ""; }; + E239BADA8FF1C3282D43AFE1E5471385 /* Pods-testing-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-testing-frameworks.sh"; sourceTree = ""; }; + EC41FE292E0D30A6B74B47F7D3034E5C /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = ar.lproj/Localizable.strings; sourceTree = ""; }; + ECD7AD6F63E3217550AEF0FA2A0A5711 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = he.lproj/Localizable.strings; sourceTree = ""; }; + EEC0626F92C20F18E74C12BDDCCD759B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F79AD9BB7066C25F6C446F9D5AF9B3D0 /* Pods-testingUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-testingUITests-frameworks.sh"; sourceTree = ""; }; + F8ACFE9CA669818C2E78CC6E8265F526 /* Pods-testing-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-testing-acknowledgements.markdown"; sourceTree = ""; }; + FCB576725448CC84880D131911F59067 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = es.lproj/Localizable.strings; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 03AF260CBA49E3E6AF99AEFAC2DDBF01 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 84555B6F0382C8649063D5E6052DAFA5 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3F233B7CEB69A6DEA1571C333B991692 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + FDC3B287464DDB37CD43A04402588A16 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4AB80DD5C32937ACE3B4D5D33EA48867 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 30287309C19F78204080A84BAF0985E3 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 78607FD166B80138914D4FB5C7A0C03D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3B81AD6C5A05BC0AFBD01FE30CF1F181 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 78CE9551D5EA358C30483E19CDA526E8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1A61E1BB499964DC3ABBDDE159D35B61 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 001CE547652AF2FF17E17B4B2B9BE910 /* Support Files */ = { + isa = PBXGroup; + children = ( + 096667F824EF8F9453A9BF1799896D4F /* Info.plist */, + DA17ED458D264BF4731546A01DAC6F41 /* PryntTrimmerView.modulemap */, + 8E4D56A77F886ED0741BCE0702D15584 /* PryntTrimmerView.xcconfig */, + 9E89318044790AC4C207A032D87C70A3 /* PryntTrimmerView-dummy.m */, + 8E972E0280521E27FBE0CF7E3CEA2281 /* PryntTrimmerView-prefix.pch */, + 8CA46BA2D1E21E0F3676BE626F0F1A85 /* PryntTrimmerView-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/PryntTrimmerView"; + sourceTree = ""; + }; + 0F7AEC2768463FCB1B8C4151E54106D3 /* Support Files */ = { + isa = PBXGroup; + children = ( + 272360D750CF93E8D4B0084C8888B97B /* FDTake.modulemap */, + C1772DED9791949B463C956E6879F72E /* FDTake.xcconfig */, + 3B580392F9B7AD043C4C77A7FFA77611 /* FDTake-dummy.m */, + 60EDA3696DBF1CC264F125F6217D2554 /* FDTake-prefix.pch */, + 16EEE482C9BA75FDC1AB08084B395063 /* FDTake-umbrella.h */, + CAC5391662E45E39D0303F6268822085 /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/FDTake"; + sourceTree = ""; + }; + 1711DAC413E82CBE08630900E68F2D52 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 93302BAE3AC23A2B6A49AFDAA91AD9B5 /* Pods-testing */, + 588D9936B868EA87FF6618E42769475B /* Pods-testingTests */, + 82FFBD0ED8DA84013DA98D9B74021E59 /* Pods-testingUITests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 37EC7835EDD981818AFA39ADE51D9715 /* FDTake */ = { + isa = PBXGroup; + children = ( + 9D0DE9042A5FD9209875A534761F3BCC /* FDTake.h */, + 0345A5048C08806814C0E55B0E5BE3B8 /* FDTakeController.swift */, + 8985C62EE5575FA6F1FCC1EC3AD537DD /* Info.plist */, + 1746E651A87F69E5A5E524124848C4C6 /* Localizable.strings */, + 0F7AEC2768463FCB1B8C4151E54106D3 /* Support Files */, + ); + name = FDTake; + path = FDTake; + sourceTree = ""; + }; + 4F3223DA21A86C0DCC80181AF2F55B3D /* Products */ = { + isa = PBXGroup; + children = ( + 319BA5BB5D2BA0C925F26A996F103673 /* FDTake.framework */, + 7940BBDB7A4399B763A96A1CF79AB7FD /* Pods_testing.framework */, + 2B88BB1BA60CC4D8E13B92A43F7A5CB4 /* Pods_testingTests.framework */, + 71AF641FFE3E5B4F7CE23E7135A6FDAB /* Pods_testingUITests.framework */, + D1854469BA008A5ADD641E56EBCCFD31 /* PryntTrimmerView.framework */, + ); + name = Products; + sourceTree = ""; + }; + 588D9936B868EA87FF6618E42769475B /* Pods-testingTests */ = { + isa = PBXGroup; + children = ( + 866078EED01EEB7275BB244E26837624 /* Info.plist */, + 5C3B4C256E15F0EE709690A27B83B290 /* Pods-testingTests.modulemap */, + 7B24FC141B5918339C6A7C1DED8FEC43 /* Pods-testingTests-acknowledgements.markdown */, + 4121E2C30798CFF283204E3EF3C2A0D8 /* Pods-testingTests-acknowledgements.plist */, + 332AF3D8821AE58A9C64F55005BE0B8A /* Pods-testingTests-dummy.m */, + 17085A21A932E3C9632A185B09BA2A05 /* Pods-testingTests-frameworks.sh */, + E201621BB401722649CAE11E21A9CC1A /* Pods-testingTests-resources.sh */, + 49EC4650302449A2A6A8A7E344A37EE6 /* Pods-testingTests-umbrella.h */, + 3A75CF3D61B35949AB24C6D1F9DF829C /* Pods-testingTests.debug.xcconfig */, + 5B88694C3FA4610CFF12473E725D3B8D /* Pods-testingTests.release.xcconfig */, + ); + name = "Pods-testingTests"; + path = "Target Support Files/Pods-testingTests"; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, + D86CC9DAA020F217BA860300AD098725 /* Pods */, + 4F3223DA21A86C0DCC80181AF2F55B3D /* Products */, + 1711DAC413E82CBE08630900E68F2D52 /* Targets Support Files */, + ); + sourceTree = ""; + }; + 82FFBD0ED8DA84013DA98D9B74021E59 /* Pods-testingUITests */ = { + isa = PBXGroup; + children = ( + EEC0626F92C20F18E74C12BDDCCD759B /* Info.plist */, + C3648C72FB3B960F05EE2F742DE2ACD6 /* Pods-testingUITests.modulemap */, + 5CE5282D2FE2B996CE03C11F10E92312 /* Pods-testingUITests-acknowledgements.markdown */, + AB21CA6DD150F1A059BEFC7B4D2658AD /* Pods-testingUITests-acknowledgements.plist */, + 9377639F425C6BDAB9B166D6AE51777D /* Pods-testingUITests-dummy.m */, + F79AD9BB7066C25F6C446F9D5AF9B3D0 /* Pods-testingUITests-frameworks.sh */, + A07AD2CDBB705C84DC914E902228D52C /* Pods-testingUITests-resources.sh */, + 12FB342931C4CD5BB9EA2B41FE0D2F71 /* Pods-testingUITests-umbrella.h */, + 2E5459C8B0E7B9B2A30E26D1ECB230B3 /* Pods-testingUITests.debug.xcconfig */, + 7D509C95BD51079AE2279608C172A33D /* Pods-testingUITests.release.xcconfig */, + ); + name = "Pods-testingUITests"; + path = "Target Support Files/Pods-testingUITests"; + sourceTree = ""; + }; + 93302BAE3AC23A2B6A49AFDAA91AD9B5 /* Pods-testing */ = { + isa = PBXGroup; + children = ( + 7F2B71C10A5279C0BE3353AD8B3496E4 /* Info.plist */, + B3C1DAB57FB44B9850971B2AA533E19F /* Pods-testing.modulemap */, + F8ACFE9CA669818C2E78CC6E8265F526 /* Pods-testing-acknowledgements.markdown */, + 3A270EA56604F6FB806330F4884126D5 /* Pods-testing-acknowledgements.plist */, + 2D0885E48D0BA2EFE975424F8ABB57DB /* Pods-testing-dummy.m */, + E239BADA8FF1C3282D43AFE1E5471385 /* Pods-testing-frameworks.sh */, + 6CDCF2916A0DA298B1530B1DE724162A /* Pods-testing-resources.sh */, + 2E6F5684818F562FDF395498F45D361B /* Pods-testing-umbrella.h */, + A4634B85D26355122A632BE383A70E7C /* Pods-testing.debug.xcconfig */, + 71D99B7D92F7391BF8528AFA32E311C0 /* Pods-testing.release.xcconfig */, + ); + name = "Pods-testing"; + path = "Target Support Files/Pods-testing"; + sourceTree = ""; + }; + 9AEF8C18B90D1D1AB078025E3CA2B046 /* PryntTrimmerView */ = { + isa = PBXGroup; + children = ( + B5E8276ACD973C10F422623FD9697132 /* AssetVideoScrollView.swift */, + 1274B0857194D206A45128B2124ADBFD /* AVAssetTimeSelector.swift */, + 7A015968E6C88EAFBB6D27516BEB96AA /* CropMaskView.swift */, + 90807A0E1F2BDD4965195180F323B0A0 /* HandlerView.swift */, + 708C5A6BF8663D38BC2AA97803DC0D7D /* PryntTrimmerView.swift */, + BE50EE9ED708B81ABC82C720A39F8884 /* ThumbSelectorView.swift */, + DEFF44DC45D050093D0B0A245A0E1FB3 /* VideoCropView.swift */, + C06CA9C48E12F43B3031B32DD73E92EA /* VideoScrollView.swift */, + 001CE547652AF2FF17E17B4B2B9BE910 /* Support Files */, + ); + name = PryntTrimmerView; + path = PryntTrimmerView; + sourceTree = ""; + }; + BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { + isa = PBXGroup; + children = ( + D35AF013A5F0BAD4F32504907A52519E /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + D35AF013A5F0BAD4F32504907A52519E /* iOS */ = { + isa = PBXGroup; + children = ( + 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + D86CC9DAA020F217BA860300AD098725 /* Pods */ = { + isa = PBXGroup; + children = ( + 37EC7835EDD981818AFA39ADE51D9715 /* FDTake */, + 9AEF8C18B90D1D1AB078025E3CA2B046 /* PryntTrimmerView */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 5FF35A548715E5AA33C195615A18838F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 73F284B4BDD7284CA448586215D019B5 /* Pods-testingUITests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6F89E0CB8928D38F247FC4B58F4E0CB2 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + B84C090D2DDB55E4634FBD2AC48A299C /* FDTake-umbrella.h in Headers */, + EBCDC230259EB16B2665FA8C79B7328D /* FDTake.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 863711AA42FD9955CA4E4A5AB46285F4 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 1FEFAC01D8CCE09D1FB401A00ECB7CCE /* PryntTrimmerView-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8B3CEE34590E507CFD8796C17E6FE7C3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D9A20D1101C3FF4B68B52E16ED19AC7 /* Pods-testing-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C120894978445BA5C6EF623B8F8DC267 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 935E6921156427B456DDCDE67CD38BDA /* Pods-testingTests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 13EC75FB8C4F8E86C1902F61532295B1 /* Pods-testingTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 81CB7AE2DB1370BD67FF9B667FECF86E /* Build configuration list for PBXNativeTarget "Pods-testingTests" */; + buildPhases = ( + 61E86897EEF88F97ED0FCB24ADA7B557 /* Sources */, + 78607FD166B80138914D4FB5C7A0C03D /* Frameworks */, + C120894978445BA5C6EF623B8F8DC267 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 00C51205C8089089D663FB70B9BA0F75 /* PBXTargetDependency */, + A5E492A58914ADD204F1B705FD973F57 /* PBXTargetDependency */, + ); + name = "Pods-testingTests"; + productName = "Pods-testingTests"; + productReference = 2B88BB1BA60CC4D8E13B92A43F7A5CB4 /* Pods_testingTests.framework */; + productType = "com.apple.product-type.framework"; + }; + 4177AD824684801C04322854F4313540 /* Pods-testingUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DD7D91480D6918B9235D125CE8337BE /* Build configuration list for PBXNativeTarget "Pods-testingUITests" */; + buildPhases = ( + 04DDCC676AC9DF5D7929BA421D2F92F2 /* Sources */, + 3F233B7CEB69A6DEA1571C333B991692 /* Frameworks */, + 5FF35A548715E5AA33C195615A18838F /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 2EC8A96E59FC810C825F0FBCA721352E /* PBXTargetDependency */, + ); + name = "Pods-testingUITests"; + productName = "Pods-testingUITests"; + productReference = 71AF641FFE3E5B4F7CE23E7135A6FDAB /* Pods_testingUITests.framework */; + productType = "com.apple.product-type.framework"; + }; + 5BDD18CFD25C9C8EB23F1B735E50AE2B /* PryntTrimmerView */ = { + isa = PBXNativeTarget; + buildConfigurationList = F43AF1DD09792CD97BF035BF86AD032D /* Build configuration list for PBXNativeTarget "PryntTrimmerView" */; + buildPhases = ( + EFAED8DF0BDC7569D354A9927054A40B /* Sources */, + 4AB80DD5C32937ACE3B4D5D33EA48867 /* Frameworks */, + 863711AA42FD9955CA4E4A5AB46285F4 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PryntTrimmerView; + productName = PryntTrimmerView; + productReference = D1854469BA008A5ADD641E56EBCCFD31 /* PryntTrimmerView.framework */; + productType = "com.apple.product-type.framework"; + }; + E25D1347A59BFC223372DC9BB39811DF /* FDTake */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0E3B3FE2704E405ECA11F49B00632B84 /* Build configuration list for PBXNativeTarget "FDTake" */; + buildPhases = ( + 95EFBA07F16C18D54854BF077BB1217E /* Sources */, + 03AF260CBA49E3E6AF99AEFAC2DDBF01 /* Frameworks */, + 6F89E0CB8928D38F247FC4B58F4E0CB2 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FDTake; + productName = FDTake; + productReference = 319BA5BB5D2BA0C925F26A996F103673 /* FDTake.framework */; + productType = "com.apple.product-type.framework"; + }; + E3C092A1482E6825F5F76AC2561B5806 /* Pods-testing */ = { + isa = PBXNativeTarget; + buildConfigurationList = E4C55E3D3FB19EBEB64043A7807DBB7D /* Build configuration list for PBXNativeTarget "Pods-testing" */; + buildPhases = ( + 5FF2F97E1D06C3678B518360874F811F /* Sources */, + 78CE9551D5EA358C30483E19CDA526E8 /* Frameworks */, + 8B3CEE34590E507CFD8796C17E6FE7C3 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + D4DE1F58A57274961697B257A7E037CB /* PBXTargetDependency */, + ); + name = "Pods-testing"; + productName = "Pods-testing"; + productReference = 7940BBDB7A4399B763A96A1CF79AB7FD /* Pods_testing.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0930; + LastUpgradeCheck = 0930; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = 4F3223DA21A86C0DCC80181AF2F55B3D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + E25D1347A59BFC223372DC9BB39811DF /* FDTake */, + E3C092A1482E6825F5F76AC2561B5806 /* Pods-testing */, + 13EC75FB8C4F8E86C1902F61532295B1 /* Pods-testingTests */, + 4177AD824684801C04322854F4313540 /* Pods-testingUITests */, + 5BDD18CFD25C9C8EB23F1B735E50AE2B /* PryntTrimmerView */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 04DDCC676AC9DF5D7929BA421D2F92F2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 683CDD3125BC0FE9AA1E94BE30082521 /* Pods-testingUITests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5FF2F97E1D06C3678B518360874F811F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7AB4095A166568E7843E8F19E4AF185A /* Pods-testing-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 61E86897EEF88F97ED0FCB24ADA7B557 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 77942FB82FE4965AADA5FEB194191D8C /* Pods-testingTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 95EFBA07F16C18D54854BF077BB1217E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D2D466DCE6393B4BC6A9E9DE5753FA48 /* FDTake-dummy.m in Sources */, + F0E396AC6DC2D2B172452D28EB3E95D0 /* FDTakeController.swift in Sources */, + 8266744C26905124BFBB3AD70A9A606E /* Info.plist in Sources */, + 502BA91E41FEADE1F345F8439AAE1B48 /* Localizable.strings in Sources */, + 026FE915AD8D2818FA656AD643CDBDA0 /* Localizable.strings in Sources */, + 575F81EEE63F7468CE65625E1ED6A325 /* Localizable.strings in Sources */, + E9A18619BD0757DED90A284BC3770D4A /* Localizable.strings in Sources */, + E5216D8C71C4E2409AD135ACD001C3ED /* Localizable.strings in Sources */, + A70BC074093E0921978709274D687FFB /* Localizable.strings in Sources */, + AC1031D65D075DB09642D9757FEC4D27 /* Localizable.strings in Sources */, + B0569695B7A16A926C839A6DDD23869B /* Localizable.strings in Sources */, + FE505D8FAF07168C42DDBD885A4D1E21 /* Localizable.strings in Sources */, + B7982E847C3F06D09808930ADE53D225 /* Localizable.strings in Sources */, + F792920BDE0AE9D60C60B78007A861E0 /* Localizable.strings in Sources */, + 555856CB51012D5687D619FC2A5FC158 /* Localizable.strings in Sources */, + 0A4F7F1139782166B26076ED2136647C /* Localizable.strings in Sources */, + 2D9E61A0900DACA452D6E2C3059F6FED /* Localizable.strings in Sources */, + 102A67929A494B567CB5909ED2A5A3C4 /* Localizable.strings in Sources */, + 9886001E2360094E02A50472D95B8FEA /* Localizable.strings in Sources */, + 75DC3493D90DA707E02A926E9337013B /* Localizable.strings in Sources */, + 40A84508B8D2D3A0BDAA4CAAFEAE3242 /* Localizable.strings in Sources */, + 776DE97CF5D9AD584D2872369B4D89FB /* Localizable.strings in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EFAED8DF0BDC7569D354A9927054A40B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 89CF80735E1835357BD29AB02C829EBA /* AssetVideoScrollView.swift in Sources */, + DF0C9690E4E3B068D728ACD53094A43E /* AVAssetTimeSelector.swift in Sources */, + 495711649DED7A0BC067AC2C81C36E1D /* CropMaskView.swift in Sources */, + D6FDCD21177F2DF43C7661BD0E13B040 /* HandlerView.swift in Sources */, + 3C101CEDF2D1678CF899965AF4687351 /* PryntTrimmerView-dummy.m in Sources */, + B4EFF12F68E2B9D70124CD0CB3C97B0F /* PryntTrimmerView.swift in Sources */, + 74E8A1B2F4BD16B1869A5480BED16FED /* ThumbSelectorView.swift in Sources */, + BD4B44233D8A5CFA4C1885DC736B94CC /* VideoCropView.swift in Sources */, + 9777237E6B5F9B0319BEE20B4447DBAA /* VideoScrollView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 00C51205C8089089D663FB70B9BA0F75 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FDTake; + target = E25D1347A59BFC223372DC9BB39811DF /* FDTake */; + targetProxy = 8678033C425354C977938039893F71B2 /* PBXContainerItemProxy */; + }; + 2EC8A96E59FC810C825F0FBCA721352E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-testing"; + target = E3C092A1482E6825F5F76AC2561B5806 /* Pods-testing */; + targetProxy = C411EC629702070DA4A6A517E1B59634 /* PBXContainerItemProxy */; + }; + A5E492A58914ADD204F1B705FD973F57 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-testing"; + target = E3C092A1482E6825F5F76AC2561B5806 /* Pods-testing */; + targetProxy = F552A0115CA6C990248CA8CA206D66DF /* PBXContainerItemProxy */; + }; + D4DE1F58A57274961697B257A7E037CB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = PryntTrimmerView; + target = 5BDD18CFD25C9C8EB23F1B735E50AE2B /* PryntTrimmerView */; + targetProxy = 6F7AE388A81F4DEBDD069C92F3405167 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 1746E651A87F69E5A5E524124848C4C6 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 7408E6A2D8ED19B3FBB621FD7818903B /* Localizable.strings */, + 5B47115BEF792A273C04407065A806FE /* Localizable.strings */, + C6F8F645C3BEE194C20F56F43B41772A /* Localizable.strings */, + 7136601BDCB39CDDBAD093E869E1EF71 /* Localizable.strings */, + 6C2582256EF269FB9F5C0F0BF0A41B84 /* Localizable.strings */, + FCB576725448CC84880D131911F59067 /* Localizable.strings */, + 475358B21BEEDF5A2F71C259179ACE97 /* Localizable.strings */, + ECD7AD6F63E3217550AEF0FA2A0A5711 /* Localizable.strings */, + 72C57C66CDD773A01F63E53F79E80DDF /* Localizable.strings */, + A9E8031B1678CEC1AD3E0BA4AF2D6B45 /* Localizable.strings */, + 41C84DD5F5A792270E3A477163B5DF94 /* Localizable.strings */, + 68A8ABE8B0C54720B3EACD261F95DCB9 /* Localizable.strings */, + 5981E8224129325481C90A617758386E /* Localizable.strings */, + A410E38DA3A7230C0AAEA242F1A49819 /* Localizable.strings */, + 3BF89784B25F956888EA829364663475 /* Localizable.strings */, + 32E54E050B67B5888AFABCE04E1FDF7D /* Localizable.strings */, + 4B82FC3D23E97C06E539EE609DDDF846 /* Localizable.strings */, + 3E15B6B0926BDE079D1FF92C3B55CE17 /* Localizable.strings */, + EC41FE292E0D30A6B74B47F7D3034E5C /* Localizable.strings */, + ); + name = Localizable.strings; + path = Source; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 08638A96A528B1EC32DE62F8A728389D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + 271432A61C0FAAF763C87C1AFFDE09FA /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2E5459C8B0E7B9B2A30E26D1ECB230B3 /* Pods-testingUITests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-testingUITests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-testingUITests/Pods-testingUITests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 33726F95F0889A25D3379EEBE6F10E5F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3A75CF3D61B35949AB24C6D1F9DF829C /* Pods-testingTests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-testingTests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-testingTests/Pods-testingTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 405FFF58886EA6FC709B506F17093BEE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C1772DED9791949B463C956E6879F72E /* FDTake.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/FDTake/FDTake-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FDTake/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/FDTake/FDTake.modulemap"; + PRODUCT_MODULE_NAME = FDTake; + PRODUCT_NAME = FDTake; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 5F63344A83649B94EF5DE5A27FEBA6F3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5B88694C3FA4610CFF12473E725D3B8D /* Pods-testingTests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-testingTests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-testingTests/Pods-testingTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 8057A8CDCF76E82E21B109C50A9B0404 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8E4D56A77F886ED0741BCE0702D15584 /* PryntTrimmerView.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/PryntTrimmerView/PryntTrimmerView-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/PryntTrimmerView/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/PryntTrimmerView/PryntTrimmerView.modulemap"; + PRODUCT_MODULE_NAME = PryntTrimmerView; + PRODUCT_NAME = PryntTrimmerView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9DAE5233986C01ADB6E67169C53A3FD2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + A1620E3E81DFA1D4052C30406603878D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8E4D56A77F886ED0741BCE0702D15584 /* PryntTrimmerView.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/PryntTrimmerView/PryntTrimmerView-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/PryntTrimmerView/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/PryntTrimmerView/PryntTrimmerView.modulemap"; + PRODUCT_MODULE_NAME = PryntTrimmerView; + PRODUCT_NAME = PryntTrimmerView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + B66F368B9E47D8785E5784D3A654A0CC /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C1772DED9791949B463C956E6879F72E /* FDTake.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/FDTake/FDTake-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FDTake/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/FDTake/FDTake.modulemap"; + PRODUCT_MODULE_NAME = FDTake; + PRODUCT_NAME = FDTake; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + E15C875F7C1393B2A3972F4F65F226BE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7D509C95BD51079AE2279608C172A33D /* Pods-testingUITests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-testingUITests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-testingUITests/Pods-testingUITests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + E3C213DE3360277D0E043F837DCB3173 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 71D99B7D92F7391BF8528AFA32E311C0 /* Pods-testing.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-testing/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-testing/Pods-testing.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + F830330E8608670EF01A543E80794D38 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A4634B85D26355122A632BE383A70E7C /* Pods-testing.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-testing/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-testing/Pods-testing.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0E3B3FE2704E405ECA11F49B00632B84 /* Build configuration list for PBXNativeTarget "FDTake" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B66F368B9E47D8785E5784D3A654A0CC /* Debug */, + 405FFF58886EA6FC709B506F17093BEE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DD7D91480D6918B9235D125CE8337BE /* Build configuration list for PBXNativeTarget "Pods-testingUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 271432A61C0FAAF763C87C1AFFDE09FA /* Debug */, + E15C875F7C1393B2A3972F4F65F226BE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9DAE5233986C01ADB6E67169C53A3FD2 /* Debug */, + 08638A96A528B1EC32DE62F8A728389D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 81CB7AE2DB1370BD67FF9B667FECF86E /* Build configuration list for PBXNativeTarget "Pods-testingTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33726F95F0889A25D3379EEBE6F10E5F /* Debug */, + 5F63344A83649B94EF5DE5A27FEBA6F3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E4C55E3D3FB19EBEB64043A7807DBB7D /* Build configuration list for PBXNativeTarget "Pods-testing" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F830330E8608670EF01A543E80794D38 /* Debug */, + E3C213DE3360277D0E043F837DCB3173 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F43AF1DD09792CD97BF035BF86AD032D /* Build configuration list for PBXNativeTarget "PryntTrimmerView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8057A8CDCF76E82E21B109C50A9B0404 /* Debug */, + A1620E3E81DFA1D4052C30406603878D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/FDTake.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/FDTake.xcscheme new file mode 100644 index 0000000..84465bb --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/FDTake.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-testing.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-testing.xcscheme new file mode 100644 index 0000000..c745b99 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-testing.xcscheme @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-testingTests.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-testingTests.xcscheme new file mode 100644 index 0000000..c19fc45 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-testingTests.xcscheme @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-testingUITests.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-testingUITests.xcscheme new file mode 100644 index 0000000..ffacb00 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-testingUITests.xcscheme @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/PryntTrimmerView.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/PryntTrimmerView.xcscheme new file mode 100644 index 0000000..aa6082e --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/PryntTrimmerView.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..dacdbe7 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,46 @@ + + + + + SchemeUserState + + FDTake.xcscheme + + isShown + + orderHint + 0 + + Pods-testing.xcscheme + + isShown + + orderHint + 1 + + Pods-testingTests.xcscheme + + isShown + + orderHint + 2 + + Pods-testingUITests.xcscheme + + isShown + + orderHint + 3 + + PryntTrimmerView.xcscheme + + isShown + + orderHint + 4 + + + SuppressBuildableAutocreation + + + diff --git a/Pods/PryntTrimmerView/LICENSE b/Pods/PryntTrimmerView/LICENSE new file mode 100644 index 0000000..0d593ec --- /dev/null +++ b/Pods/PryntTrimmerView/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Prynt + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Cropper/CropMaskView.swift b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Cropper/CropMaskView.swift new file mode 100644 index 0000000..15709c1 --- /dev/null +++ b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Cropper/CropMaskView.swift @@ -0,0 +1,114 @@ +// +// CropMaskView.swift +// PryntTrimmerView +// +// Created by Henry on 10/04/2017. +// Copyright © 2017 CocoaPods. All rights reserved. +// + +import UIKit + +class CropMaskView: UIView { + + let cropBoxView = UIView() + let frameView = UIView() + let maskLayer = CAShapeLayer() + let frameLayer = CAShapeLayer() + + private let lineWidth: CGFloat = 4.0 + private var cropFrame: CGRect = CGRect.zero + + override init(frame: CGRect) { + super.init(frame: frame) + setupSubviews() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setupSubviews() + } + + private func setupSubviews() { + + maskLayer.fillRule = kCAFillRuleEvenOdd + maskLayer.fillColor = UIColor.black.cgColor + maskLayer.opacity = 1.0 + + frameLayer.strokeColor = UIColor.white.cgColor + frameLayer.fillColor = UIColor.clear.cgColor + + frameView.layer.addSublayer(frameLayer) + cropBoxView.layer.mask = maskLayer + + cropBoxView.translatesAutoresizingMaskIntoConstraints = false + cropBoxView.backgroundColor = UIColor.white.withAlphaComponent(0.7) + addSubview(cropBoxView) + addSubview(frameView) + + cropBoxView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true + cropBoxView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true + cropBoxView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + cropBoxView.topAnchor.constraint(equalTo: topAnchor).isActive = true + } + + override func layoutSubviews() { + super.layoutSubviews() + + let path = UIBezierPath(rect: bounds) + let framePath = UIBezierPath(rect: cropFrame) + path.append(framePath) + path.usesEvenOddFillRule = true + maskLayer.path = path.cgPath + + framePath.lineWidth = lineWidth + frameLayer.path = framePath.cgPath + } + + func setCropFrame(_ frame: CGRect, animated: Bool) { + + cropFrame = frame + guard animated else { + setNeedsLayout() + return + } + + let (path, framePath) = getPaths(with: cropFrame) + + CATransaction.begin() + + let animation = getPathAnimation(with: path) + maskLayer.path = maskLayer.presentation()?.path + frameLayer.path = frameLayer.presentation()?.path + + maskLayer.removeAnimation(forKey: "maskPath") + maskLayer.add(animation, forKey: "maskPath") + + animation.toValue = framePath + frameLayer.removeAnimation(forKey: "framePath") + frameLayer.add(animation, forKey: "framePath") + CATransaction.commit() + } + + private func getPaths(with cropFrame: CGRect) -> (path: CGPath, framePath: CGPath) { + + let path = UIBezierPath(rect: bounds) + let framePath = UIBezierPath(rect: cropFrame) + framePath.lineWidth = lineWidth + path.append(framePath) + path.usesEvenOddFillRule = true + + return (path.cgPath, framePath.cgPath) + } + + private func getPathAnimation(with path: CGPath) -> CABasicAnimation { + + let animation = CABasicAnimation(keyPath: "path") + animation.toValue = path + animation.duration = 0.3 + animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) + animation.fillMode = kCAFillModeBoth + animation.isRemovedOnCompletion = false + + return animation + } +} diff --git a/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Cropper/VideoCropView.swift b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Cropper/VideoCropView.swift new file mode 100644 index 0000000..713cc77 --- /dev/null +++ b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Cropper/VideoCropView.swift @@ -0,0 +1,123 @@ +// +// VideoCropView.swift +// PryntTrimmerView +// +// Created by Henry on 07/04/2017. +// Copyright © 2017 CocoaPods. All rights reserved. +// + +import UIKit +import AVFoundation + +private let margin: CGFloat = 16 + +/// A view to preview a video inside an `AVPlayer`, with a scroll view to be able to select a specific area of the video. +/// Simply set the `asset` property to load you video inside the view, and use the `getImageCropFrame` method to retrieve the +/// selected frame of the video. +public class VideoCropView: UIView { + + let videoScrollView = VideoScrollView() + let cropMaskView = CropMaskView() + + /// The asset being cropped. Setting the property will load the asset in the `AVPlayer` contained in the scroll view. + public var asset: AVAsset? { + didSet { + if let asset = asset { + videoScrollView.setupVideo(with: asset) + } + } + } + + var cropFrame = CGRect.zero + + /// The current aspect ratio of the crop view. + public private(set) var aspectRatio = CGSize(width: 1, height: 1) + + /// The player used in the scroll view. Use it if you want to seek a specific time of your video. + public var player: AVPlayer? { + return videoScrollView.player + } + + override init(frame: CGRect) { + super.init(frame: frame) + setupSubviews() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setupSubviews() + } + + private func setupSubviews() { + + videoScrollView.translatesAutoresizingMaskIntoConstraints = false + addSubview(videoScrollView) + + videoScrollView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true + videoScrollView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true + videoScrollView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + videoScrollView.topAnchor.constraint(equalTo: topAnchor).isActive = true + + cropMaskView.isUserInteractionEnabled = false + cropMaskView.translatesAutoresizingMaskIntoConstraints = false + + addSubview(cropMaskView) + + cropMaskView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true + cropMaskView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true + cropMaskView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + cropMaskView.topAnchor.constraint(equalTo: topAnchor).isActive = true + + setAspectRatio(aspectRatio, animated: false) + } + + /// Set the aspect ratio for the cropping box. + /// + /// [Issue #3]: https://github.com/prynt/PryntTrimmerView/issues/3 + /// - Parameters: + /// - aspectRatio: The desired aspect ratio. + /// - animated: true if you want to animate the change. TODO: the animation glitches sometimes. See [Issue #3] + public func setAspectRatio(_ aspectRatio: CGSize, animated: Bool) { + + self.aspectRatio = aspectRatio + let ratio = aspectRatio.width / aspectRatio.height + let cropBoxWidth = ratio > 1 ? (bounds.width - 2 * margin) : (bounds.height - 2 * margin) * ratio + let cropBoxHeight = cropBoxWidth / ratio + let origin = CGPoint(x: (bounds.width - cropBoxWidth) / 2, y: (bounds.height - cropBoxHeight) / 2) + cropFrame = CGRect(origin: origin, size: CGSize(width: cropBoxWidth, height: cropBoxHeight)) + + let edgeInsets = UIEdgeInsets(top: origin.y, left: origin.x, bottom: origin.y, right: origin.x) + let duration: TimeInterval = animated ? 0.15 : 0.0 + + cropMaskView.setCropFrame(cropFrame, animated: animated) + UIView.animate(withDuration: duration, delay: 0, options: [.beginFromCurrentState, .curveEaseInOut], animations: { + self.videoScrollView.scrollView.contentInset = edgeInsets + }, completion: nil) + videoScrollView.setZoomScaleAndCenter(animated: animated) + } + + /// Get the currently selected frame of the asset. You can then use it to perform the actual cropping of the video or of an + /// isolated image + public func getImageCropFrame() -> CGRect { + + let imageSize = videoScrollView.assetSize + let contentSize = videoScrollView.scrollView.contentSize + let cropBoxFrame = cropFrame + let contentOffset = videoScrollView.scrollView.contentOffset + let edgeInsets = videoScrollView.scrollView.contentInset + + var frame = CGRect.zero + frame.origin.x = floor((contentOffset.x + edgeInsets.left) * (imageSize.width / contentSize.width)) + frame.origin.x = max(0, frame.origin.x) + + frame.origin.y = floor((contentOffset.y + edgeInsets.top) * (imageSize.height / contentSize.height)) + frame.origin.y = max(0, frame.origin.y) + + frame.size.width = ceil(cropBoxFrame.size.width * (imageSize.width / contentSize.width)) + frame.size.width = min(imageSize.width, frame.size.width) + + frame.size.height = ceil(cropBoxFrame.size.height * (imageSize.height / contentSize.height)) + frame.size.height = min(imageSize.height, frame.size.height) + return frame + } +} diff --git a/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Cropper/VideoScrollView.swift b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Cropper/VideoScrollView.swift new file mode 100644 index 0000000..572be42 --- /dev/null +++ b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Cropper/VideoScrollView.swift @@ -0,0 +1,103 @@ +// +// VideoScrollView.swift +// PryntTrimmerView +// +// Created by Henry on 10/04/2017. +// Copyright © 2017 CocoaPods. All rights reserved. +// + +import UIKit +import AVFoundation + +class VideoScrollView: UIView { + + let scrollView = UIScrollView() + var contentView = UIView() + var assetSize = CGSize.zero + + var playerItem: AVPlayerItem? + var player: AVPlayer? + var playerLayer: AVPlayerLayer? + + override init(frame: CGRect) { + super.init(frame: frame) + setupSubviews() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setupSubviews() + } + + private func setupSubviews() { + + scrollView.showsVerticalScrollIndicator = false + scrollView.showsHorizontalScrollIndicator = false + scrollView.translatesAutoresizingMaskIntoConstraints = false + scrollView.addSubview(contentView) + scrollView.delegate = self + addSubview(scrollView) + + scrollView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true + scrollView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true + scrollView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + scrollView.topAnchor.constraint(equalTo: topAnchor).isActive = true + } + + func setupVideo(with asset: AVAsset) { + + guard let track = asset.tracks(withMediaType: AVMediaType.video).first else { return } + let trackSize = track.naturalSize.applying(track.preferredTransform) + assetSize = CGSize(width: fabs(trackSize.width), height: fabs(trackSize.height)) + + scrollView.zoomScale = 1.0 // Reset zoom scale before changing the frame of the content view. + playerItem = AVPlayerItem(asset: asset) + let playerFrame = CGRect(x: 0, y: 0, width: assetSize.width, height: assetSize.height) + addVideoLayer(with: playerFrame) + + scrollView.contentSize = assetSize + setZoomScaleAndCenter(animated: false) + } + + private func addVideoLayer(with playerFrame: CGRect) { + + playerLayer?.removeFromSuperlayer() + player = AVPlayer(playerItem: playerItem) + playerLayer = AVPlayerLayer(player: player) + playerLayer?.frame = playerFrame + playerLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill + + contentView.frame = playerFrame + contentView.layer.addSublayer(playerLayer!) + } + + func setZoomScaleAndCenter(animated: Bool) { + + guard assetSize != CGSize.zero else { return } + + let scrollWidth = scrollView.bounds.width - scrollView.contentInset.left - scrollView.contentInset.right + let scrollHeight = scrollView.bounds.height - scrollView.contentInset.top - scrollView.contentInset.bottom + let scale = max(scrollWidth / assetSize.width, scrollHeight / assetSize.height) + scrollView.minimumZoomScale = scale + scrollView.maximumZoomScale = 3.0 + + var offset = scrollView.contentOffset + offset.x = -scrollView.contentInset.left - (scrollWidth - assetSize.width * scale) / 2 + offset.y = -scrollView.contentInset.top - (scrollHeight - assetSize.height * scale) / 2 + + scrollView.setZoomScale(scale, animated: animated) + scrollView.setContentOffset(offset, animated: animated) + } +} + +extension VideoScrollView: UIScrollViewDelegate { + + func viewForZooming(in scrollView: UIScrollView) -> UIView? { + return contentView + } + + func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) { + let scaledAssetSize = CGSize(width: assetSize.width * scale, height: assetSize.height * scale) + scrollView.contentSize = scaledAssetSize + } +} diff --git a/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Parents/AVAssetTimeSelector.swift b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Parents/AVAssetTimeSelector.swift new file mode 100644 index 0000000..d4673d4 --- /dev/null +++ b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Parents/AVAssetTimeSelector.swift @@ -0,0 +1,85 @@ +// +// AVAssetTimeSelector.swift +// Pods +// +// Created by Henry on 06/04/2017. +// +// + +import UIKit +import AVFoundation + +/// A generic class to display an asset into a scroll view with thumbnail images, and make the equivalence between a time in +// the asset and a position in the scroll view +public class AVAssetTimeSelector: UIView, UIScrollViewDelegate { + + let assetPreview = AssetVideoScrollView() + + /// The asset to be displayed in the underlying scroll view. Setting a new asset will automatically refresh the thumbnails. + public var asset: AVAsset? { + didSet { + assetDidChange(newAsset: asset) + } + } + + override init(frame: CGRect) { + super.init(frame: frame) + setupSubviews() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setupSubviews() + } + + func setupSubviews() { + setupAssetPreview() + constrainAssetPreview() + } + + // MARK: - Asset Preview + + func setupAssetPreview() { + + assetPreview.translatesAutoresizingMaskIntoConstraints = false + assetPreview.delegate = self + addSubview(assetPreview) + } + + func constrainAssetPreview() { + assetPreview.leftAnchor.constraint(equalTo: leftAnchor).isActive = true + assetPreview.rightAnchor.constraint(equalTo: rightAnchor).isActive = true + assetPreview.topAnchor.constraint(equalTo: topAnchor).isActive = true + assetPreview.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + } + + func assetDidChange(newAsset: AVAsset?) { + if let asset = newAsset { + assetPreview.regenerateThumbnails(for: asset) + } + } + + // MARK: - Time & Position Equivalence + + var durationSize: CGFloat { + return assetPreview.contentSize.width + } + + func getTime(from position: CGFloat) -> CMTime? { + guard let asset = asset else { + return nil + } + let normalizedRatio = max(min(1, position / durationSize), 0) + let positionTimeValue = Double(normalizedRatio) * Double(asset.duration.value) + return CMTime(value: Int64(positionTimeValue), timescale: asset.duration.timescale) + } + + func getPosition(from time: CMTime) -> CGFloat? { + guard let asset = asset else { + return nil + } + let timeRatio = CGFloat(time.value) * CGFloat(asset.duration.timescale) / + (CGFloat(time.timescale) * CGFloat(asset.duration.value)) + return timeRatio * durationSize + } +} diff --git a/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Parents/AssetVideoScrollView.swift b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Parents/AssetVideoScrollView.swift new file mode 100644 index 0000000..0a30267 --- /dev/null +++ b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Parents/AssetVideoScrollView.swift @@ -0,0 +1,166 @@ +// +// AssetVideoScrollView.swift +// PryntTrimmerView +// +// Created by HHK on 28/03/2017. +// Copyright © 2017 Prynt. All rights reserved. +// + +import AVFoundation +import UIKit + +class AssetVideoScrollView: UIScrollView { + + private var widthConstraint: NSLayoutConstraint? + + let contentView = UIView() + var maxDuration: Double = 15 + private var generator: AVAssetImageGenerator? + + override init(frame: CGRect) { + super.init(frame: frame) + setupSubviews() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setupSubviews() + } + + private func setupSubviews() { + + backgroundColor = .clear + showsVerticalScrollIndicator = false + showsHorizontalScrollIndicator = false + clipsToBounds = true + + contentView.backgroundColor = .clear + contentView.translatesAutoresizingMaskIntoConstraints = false + contentView.tag = -1 + addSubview(contentView) + + contentView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true + contentView.topAnchor.constraint(equalTo: topAnchor).isActive = true + contentView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + widthConstraint = contentView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 1.0) + widthConstraint?.isActive = true + } + + override func layoutSubviews() { + super.layoutSubviews() + contentSize = contentView.bounds.size + } + + internal func regenerateThumbnails(for asset: AVAsset) { + guard let thumbnailSize = getThumbnailFrameSize(from: asset), thumbnailSize.width != 0 else { + print("Could not calculate the thumbnail size.") + return + } + + generator?.cancelAllCGImageGeneration() + removeFormerThumbnails() + let newContentSize = setContentSize(for: asset) + let visibleThumbnailsCount = Int(ceil(frame.width / thumbnailSize.width)) + let thumbnailCount = Int(ceil(newContentSize.width / thumbnailSize.width)) + addThumbnailViews(thumbnailCount, size: thumbnailSize) + let timesForThumbnail = getThumbnailTimes(for: asset, numberOfThumbnails: thumbnailCount) + generateImages(for: asset, at: timesForThumbnail, with: thumbnailSize, visibleThumnails: visibleThumbnailsCount) + } + + private func getThumbnailFrameSize(from asset: AVAsset) -> CGSize? { + guard let track = asset.tracks(withMediaType: AVMediaType.video).first else { return nil} + + let assetSize = track.naturalSize.applying(track.preferredTransform) + + let height = frame.height + let ratio = assetSize.width / assetSize.height + let width = height * ratio + return CGSize(width: fabs(width), height: fabs(height)) + } + + private func removeFormerThumbnails() { + contentView.subviews.forEach({ $0.removeFromSuperview() }) + } + + private func setContentSize(for asset: AVAsset) -> CGSize { + + let contentWidthFactor = CGFloat(max(1, asset.duration.seconds / maxDuration)) + widthConstraint?.isActive = false + widthConstraint = contentView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: contentWidthFactor) + widthConstraint?.isActive = true + layoutIfNeeded() + return contentView.bounds.size + } + + private func addThumbnailViews(_ count: Int, size: CGSize) { + + for index in 0.. contentView.frame.width { + thumbnailView.frame.size = CGSize(width: size.width + (contentView.frame.width - viewEndX), height: size.height) + thumbnailView.contentMode = .scaleAspectFill + } else { + thumbnailView.frame.size = size + thumbnailView.contentMode = .scaleAspectFit + } + + thumbnailView.frame.origin = CGPoint(x: CGFloat(index) * size.width, y: 0) + thumbnailView.tag = index + contentView.addSubview(thumbnailView) + } + } + + private func getThumbnailTimes(for asset: AVAsset, numberOfThumbnails: Int) -> [NSValue] { + + let timeIncrement = (asset.duration.seconds * 1000) / Double(numberOfThumbnails) + var timesForThumbnails = [NSValue]() + for index in 0.. Void in + + if count == 0 { + self?.displayFirstImage(cgimage, visibleThumbnails: visibleThumnails) + } + self?.displayImage(cgimage, at: count) + count += 1 + }) + } + } + + generator?.generateCGImagesAsynchronously(forTimes: times, completionHandler: handler) + } + + private func displayFirstImage(_ cgImage: CGImage, visibleThumbnails: Int) { + for i in 0...visibleThumbnails { + displayImage(cgImage, at: i) + } + } + + private func displayImage(_ cgImage: CGImage, at index: Int) { + if let imageView = contentView.viewWithTag(index) as? UIImageView { + let uiimage = UIImage(cgImage: cgImage, scale: 1.0, orientation: UIImageOrientation.up) + imageView.image = uiimage + } + } +} diff --git a/Pods/PryntTrimmerView/PryntTrimmerView/Classes/ThumbSelectorView.swift b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/ThumbSelectorView.swift new file mode 100644 index 0000000..0b64831 --- /dev/null +++ b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/ThumbSelectorView.swift @@ -0,0 +1,178 @@ +// +// ThumbSelectorView.swift +// Pods +// +// Created by Henry on 06/04/2017. +// +// + +import UIKit +import AVFoundation + +/// A delegate to be notified of when the thumb position has changed. Useful to link an instance of the ThumbSelectorView to a +/// video preview like an `AVPlayer`. +public protocol ThumbSelectorViewDelegate: class { + func didChangeThumbPosition(_ imageTime: CMTime) +} + +/// A view to select a specific time of an `AVAsset`. It is composed of an asset preview within a scroll view, and a thumb view +/// to select a precise time of the video. Set the `asset` property to load the video, and use the `selectedTime` property to +// retrieve the exact frame of the asset that was selected. +public class ThumbSelectorView: AVAssetTimeSelector { + + public var thumbBorderColor: UIColor = .white { + didSet { + thumbView.layer.borderColor = thumbBorderColor.cgColor + } + } + + private let thumbView = UIImageView() + private let dimmingView = UIView() + + private var leftThumbConstraint: NSLayoutConstraint? + private var currentThumbConstraint: CGFloat = 0 + + private var generator: AVAssetImageGenerator? + + public weak var delegate: ThumbSelectorViewDelegate? + + // MARK: - View & constraints configurations + + override func setupSubviews() { + super.setupSubviews() + setupDimmingView() + setupThumbView() + } + + private func setupDimmingView() { + + dimmingView.translatesAutoresizingMaskIntoConstraints = false + dimmingView.isUserInteractionEnabled = false + dimmingView.backgroundColor = UIColor.white.withAlphaComponent(0.7) + addSubview(dimmingView) + dimmingView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true + dimmingView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true + dimmingView.topAnchor.constraint(equalTo: topAnchor).isActive = true + dimmingView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + } + + private func setupThumbView() { + + thumbView.translatesAutoresizingMaskIntoConstraints = false + thumbView.layer.borderWidth = 2.0 + thumbView.layer.borderColor = thumbBorderColor.cgColor + thumbView.isUserInteractionEnabled = true + thumbView.contentMode = .scaleAspectFill + thumbView.clipsToBounds = true + addSubview(thumbView) + + leftThumbConstraint = thumbView.leftAnchor.constraint(equalTo: leftAnchor) + leftThumbConstraint?.isActive = true + thumbView.widthAnchor.constraint(equalTo: thumbView.heightAnchor).isActive = true + thumbView.heightAnchor.constraint(equalTo: heightAnchor).isActive = true + thumbView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true + + let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(ThumbSelectorView.handlePanGesture(_:))) + thumbView.addGestureRecognizer(panGestureRecognizer) + } + + // MARK: - Gesture handling + + @objc func handlePanGesture(_ gestureRecognizer: UIPanGestureRecognizer) { + guard let superView = gestureRecognizer.view?.superview else { return } + + switch gestureRecognizer.state { + + case .began: + currentThumbConstraint = leftThumbConstraint!.constant + updateSelectedTime() + case .changed: + + let translation = gestureRecognizer.translation(in: superView) + updateThumbConstraint(with: translation) + layoutIfNeeded() + updateSelectedTime() + + case .cancelled, .ended, .failed: + updateSelectedTime() + default: break + } + } + + private func updateThumbConstraint(with translation: CGPoint) { + let maxConstraint = frame.width - thumbView.frame.width + let newConstraint = min(max(0, currentThumbConstraint + translation.x), maxConstraint) + leftThumbConstraint?.constant = newConstraint + } + + // MARK: - Thumbnail Generation + + override func assetDidChange(newAsset: AVAsset?) { + if let asset = newAsset { + setupThumbnailGenerator(with: asset) + leftThumbConstraint?.constant = 0 + updateSelectedTime() + } + super.assetDidChange(newAsset: newAsset) + } + + private func setupThumbnailGenerator(with asset: AVAsset) { + generator = AVAssetImageGenerator(asset: asset) + generator?.appliesPreferredTrackTransform = true + generator?.requestedTimeToleranceAfter = kCMTimeZero + generator?.requestedTimeToleranceBefore = kCMTimeZero + generator?.maximumSize = getThumbnailFrameSize(from: asset) ?? CGSize.zero + } + + private func getThumbnailFrameSize(from asset: AVAsset) -> CGSize? { + guard let track = asset.tracks(withMediaType: AVMediaType.video).first else { return nil} + + let assetSize = track.naturalSize.applying(track.preferredTransform) + + let maxDimension = max(assetSize.width, assetSize.height) + let minDimension = min(assetSize.width, assetSize.height) + let ratio = maxDimension / minDimension + let side = thumbView.frame.height * ratio * UIScreen.main.scale + return CGSize(width: side, height: side) + } + + private func generateThumbnailImage(for time: CMTime) { + + generator?.generateCGImagesAsynchronously(forTimes: [time as NSValue], + completionHandler: { (_, image, _, _, _) in + guard let image = image else { + return + } + DispatchQueue.main.async { + self.generator?.cancelAllCGImageGeneration() + let uiimage = UIImage(cgImage: image) + self.thumbView.image = uiimage + } + }) + } + + // MARK: - Time & Position Equivalence + + override var durationSize: CGFloat { + return assetPreview.contentSize.width - thumbView.frame.width + } + + /// The currently selected time of the asset. + public var selectedTime: CMTime? { + let thumbPosition = thumbView.center.x + assetPreview.contentOffset.x - (thumbView.frame.width / 2) + return getTime(from: thumbPosition) + } + + private func updateSelectedTime() { + if let selectedTime = selectedTime { + delegate?.didChangeThumbPosition(selectedTime) + generateThumbnailImage(for: selectedTime) + } + } + + // MARK: - UIScrollViewDelegate + + public func scrollViewDidScroll(_ scrollView: UIScrollView) { + updateSelectedTime() + } +} diff --git a/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Trimmer/HandlerView.swift b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Trimmer/HandlerView.swift new file mode 100644 index 0000000..ce3b70d --- /dev/null +++ b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Trimmer/HandlerView.swift @@ -0,0 +1,22 @@ +// +// HandlerView.swift +// PryntTrimmerView +// +// Created by HHK on 27/03/2017. +// Copyright © 2017 Prynt. All rights reserved. +// + +import Foundation +import UIKit + +class HandlerView: UIView { + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + let hitFrame = bounds.insetBy(dx: -20, dy: -20) + return hitFrame.contains(point) ? self : nil + } + override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + let hitFrame = bounds.insetBy(dx: -20, dy: -20) + return hitFrame.contains(point) + } +} diff --git a/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Trimmer/PryntTrimmerView.swift b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Trimmer/PryntTrimmerView.swift new file mode 100644 index 0000000..ac97d6a --- /dev/null +++ b/Pods/PryntTrimmerView/PryntTrimmerView/Classes/Trimmer/PryntTrimmerView.swift @@ -0,0 +1,352 @@ +// +// PryntTrimmerView.swift +// PryntTrimmerView +// +// Created by HHK on 27/03/2017. +// Copyright © 2017 Prynt. All rights reserved. +// + +import AVFoundation +import UIKit + +public protocol TrimmerViewDelegate: class { + func didChangePositionBar(_ playerTime: CMTime) + func positionBarStoppedMoving(_ playerTime: CMTime) +} + +/// A view to select a specific time range of a video. It consists of an asset preview with thumbnails inside a scroll view, two +/// handles on the side to select the beginning and the end of the range, and a position bar to synchronize the control with a +/// video preview, typically with an `AVPlayer`. +/// Load the video by setting the `asset` property. Access the `startTime` and `endTime` of the view to get the selected time +// range +@IBDesignable public class TrimmerView: AVAssetTimeSelector { + + // MARK: - Properties + + // MARK: Color Customization + + /// The color of the main border of the view + @IBInspectable public var mainColor: UIColor = UIColor.orange { + didSet { + updateMainColor() + } + } + + /// The color of the handles on the side of the view + @IBInspectable public var handleColor: UIColor = UIColor.gray { + didSet { + updateHandleColor() + } + } + + /// The color of the position indicator + @IBInspectable public var positionBarColor: UIColor = UIColor.white { + didSet { + positionBar.backgroundColor = positionBarColor + } + } + + // MARK: Interface + + public weak var delegate: TrimmerViewDelegate? + + // MARK: Subviews + + private let trimView = UIView() + private let leftHandleView = HandlerView() + private let rightHandleView = HandlerView() + private let positionBar = UIView() + private let leftHandleKnob = UIView() + private let rightHandleKnob = UIView() + private let leftMaskView = UIView() + private let rightMaskView = UIView() + + // MARK: Constraints + + private var currentLeftConstraint: CGFloat = 0 + private var currentRightConstraint: CGFloat = 0 + private var leftConstraint: NSLayoutConstraint? + private var rightConstraint: NSLayoutConstraint? + private var positionConstraint: NSLayoutConstraint? + + private let handleWidth: CGFloat = 15 + + /// The maximum duration allowed for the trimming. Change it before setting the asset, as the asset preview + public var maxDuration: Double = 15 { + didSet { + assetPreview.maxDuration = maxDuration + } + } + + /// The minimum duration allowed for the trimming. The handles won't pan further if the minimum duration is attained. + public var minDuration: Double = 2 + + // MARK: - View & constraints configurations + + override func setupSubviews() { + + super.setupSubviews() + backgroundColor = UIColor.clear + layer.zPosition = 1 + setupTrimmerView() + setupHandleView() + setupMaskView() + setupPositionBar() + setupGestures() + updateMainColor() + updateHandleColor() + } + + override func constrainAssetPreview() { + assetPreview.leftAnchor.constraint(equalTo: leftAnchor, constant: handleWidth).isActive = true + assetPreview.rightAnchor.constraint(equalTo: rightAnchor, constant: -handleWidth).isActive = true + assetPreview.topAnchor.constraint(equalTo: topAnchor).isActive = true + assetPreview.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + } + + private func setupTrimmerView() { + + trimView.layer.borderWidth = 2.0 + trimView.layer.cornerRadius = 2.0 + trimView.translatesAutoresizingMaskIntoConstraints = false + trimView.isUserInteractionEnabled = false + addSubview(trimView) + + trimView.topAnchor.constraint(equalTo: topAnchor).isActive = true + trimView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + leftConstraint = trimView.leftAnchor.constraint(equalTo: leftAnchor) + rightConstraint = trimView.rightAnchor.constraint(equalTo: rightAnchor) + leftConstraint?.isActive = true + rightConstraint?.isActive = true + } + + private func setupHandleView() { + + leftHandleView.isUserInteractionEnabled = true + leftHandleView.layer.cornerRadius = 2.0 + leftHandleView.translatesAutoresizingMaskIntoConstraints = false + addSubview(leftHandleView) + + leftHandleView.heightAnchor.constraint(equalTo: heightAnchor).isActive = true + leftHandleView.widthAnchor.constraint(equalToConstant: handleWidth).isActive = true + leftHandleView.leftAnchor.constraint(equalTo: trimView.leftAnchor).isActive = true + leftHandleView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true + + leftHandleKnob.translatesAutoresizingMaskIntoConstraints = false + leftHandleView.addSubview(leftHandleKnob) + + leftHandleKnob.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 0.5).isActive = true + leftHandleKnob.widthAnchor.constraint(equalToConstant: 2).isActive = true + leftHandleKnob.centerYAnchor.constraint(equalTo: leftHandleView.centerYAnchor).isActive = true + leftHandleKnob.centerXAnchor.constraint(equalTo: leftHandleView.centerXAnchor).isActive = true + + rightHandleView.isUserInteractionEnabled = true + rightHandleView.layer.cornerRadius = 2.0 + rightHandleView.translatesAutoresizingMaskIntoConstraints = false + addSubview(rightHandleView) + + rightHandleView.heightAnchor.constraint(equalTo: heightAnchor).isActive = true + rightHandleView.widthAnchor.constraint(equalToConstant: handleWidth).isActive = true + rightHandleView.rightAnchor.constraint(equalTo: trimView.rightAnchor).isActive = true + rightHandleView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true + + rightHandleKnob.translatesAutoresizingMaskIntoConstraints = false + rightHandleView.addSubview(rightHandleKnob) + + rightHandleKnob.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 0.5).isActive = true + rightHandleKnob.widthAnchor.constraint(equalToConstant: 2).isActive = true + rightHandleKnob.centerYAnchor.constraint(equalTo: rightHandleView.centerYAnchor).isActive = true + rightHandleKnob.centerXAnchor.constraint(equalTo: rightHandleView.centerXAnchor).isActive = true + } + + private func setupMaskView() { + + leftMaskView.isUserInteractionEnabled = false + leftMaskView.backgroundColor = .white + leftMaskView.alpha = 0.7 + leftMaskView.translatesAutoresizingMaskIntoConstraints = false + insertSubview(leftMaskView, belowSubview: leftHandleView) + + leftMaskView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true + leftMaskView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + leftMaskView.topAnchor.constraint(equalTo: topAnchor).isActive = true + leftMaskView.rightAnchor.constraint(equalTo: leftHandleView.centerXAnchor).isActive = true + + rightMaskView.isUserInteractionEnabled = false + rightMaskView.backgroundColor = .white + rightMaskView.alpha = 0.7 + rightMaskView.translatesAutoresizingMaskIntoConstraints = false + insertSubview(rightMaskView, belowSubview: rightHandleView) + + rightMaskView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true + rightMaskView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + rightMaskView.topAnchor.constraint(equalTo: topAnchor).isActive = true + rightMaskView.leftAnchor.constraint(equalTo: rightHandleView.centerXAnchor).isActive = true + } + + private func setupPositionBar() { + + positionBar.frame = CGRect(x: 0, y: 0, width: 3, height: frame.height) + positionBar.backgroundColor = positionBarColor + positionBar.center = CGPoint(x: leftHandleView.frame.maxX, y: center.y) + positionBar.layer.cornerRadius = 1 + positionBar.translatesAutoresizingMaskIntoConstraints = false + positionBar.isUserInteractionEnabled = false + addSubview(positionBar) + + positionBar.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true + positionBar.widthAnchor.constraint(equalToConstant: 3).isActive = true + positionBar.heightAnchor.constraint(equalTo: heightAnchor).isActive = true + positionConstraint = positionBar.leftAnchor.constraint(equalTo: leftHandleView.rightAnchor, constant: 0) + positionConstraint?.isActive = true + } + + private func setupGestures() { + + let leftPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(TrimmerView.handlePanGesture)) + leftHandleView.addGestureRecognizer(leftPanGestureRecognizer) + let rightPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(TrimmerView.handlePanGesture)) + rightHandleView.addGestureRecognizer(rightPanGestureRecognizer) + } + + private func updateMainColor() { + trimView.layer.borderColor = mainColor.cgColor + leftHandleView.backgroundColor = mainColor + rightHandleView.backgroundColor = mainColor + } + + private func updateHandleColor() { + leftHandleKnob.backgroundColor = handleColor + rightHandleKnob.backgroundColor = handleColor + } + + // MARK: - Trim Gestures + + @objc func handlePanGesture(_ gestureRecognizer: UIPanGestureRecognizer) { + guard let view = gestureRecognizer.view, let superView = gestureRecognizer.view?.superview else { return } + let isLeftGesture = view == leftHandleView + switch gestureRecognizer.state { + + case .began: + print("gestureRecognizer.state : began") + if isLeftGesture { + print("isLeftGesture") + currentLeftConstraint = leftConstraint!.constant + } else { + print("! isLeftGesture") + currentRightConstraint = rightConstraint!.constant + } + updateSelectedTime(stoppedMoving: false) + case .changed: + print("gestureRecognizer.state : changed") + let translation = gestureRecognizer.translation(in: superView) + if isLeftGesture { + updateLeftConstraint(with: translation) + } else { + updateRightConstraint(with: translation) + } + layoutIfNeeded() + if let startTime = startTime, isLeftGesture { + seek(to: startTime) + } else if let endTime = endTime { + seek(to: endTime) + } + updateSelectedTime(stoppedMoving: false) + + case .cancelled, .ended, .failed: + updateSelectedTime(stoppedMoving: true) + default: break + } + } + + private func updateLeftConstraint(with translation: CGPoint) { + let maxConstraint = max(rightHandleView.frame.origin.x - handleWidth - minimumDistanceBetweenHandle, 0) + let newConstraint = min(max(0, currentLeftConstraint + translation.x), maxConstraint) + leftConstraint?.constant = newConstraint + } + + private func updateRightConstraint(with translation: CGPoint) { + let maxConstraint = min(2 * handleWidth - frame.width + leftHandleView.frame.origin.x + minimumDistanceBetweenHandle, 0) + let newConstraint = max(min(0, currentRightConstraint + translation.x), maxConstraint) + rightConstraint?.constant = newConstraint + } + + // MARK: - Asset loading + + override func assetDidChange(newAsset: AVAsset?) { + super.assetDidChange(newAsset: newAsset) + resetHandleViewPosition() + } + + private func resetHandleViewPosition() { + leftConstraint?.constant = 0 + rightConstraint?.constant = 0 + layoutIfNeeded() + } + + // MARK: - Time Equivalence + + /// Move the position bar to the given time. + public func seek(to time: CMTime) { + if let newPosition = getPosition(from: time) { + + let offsetPosition = newPosition - assetPreview.contentOffset.x - leftHandleView.frame.origin.x + let maxPosition = rightHandleView.frame.origin.x - (leftHandleView.frame.origin.x + handleWidth) + - positionBar.frame.width + let normalizedPosition = min(max(0, offsetPosition), maxPosition) + positionConstraint?.constant = normalizedPosition + layoutIfNeeded() + } + } + + /// The selected start time for the current asset. + public var startTime: CMTime? { + let startPosition = leftHandleView.frame.origin.x + assetPreview.contentOffset.x + return getTime(from: startPosition) + } + + /// The selected end time for the current asset. + public var endTime: CMTime? { + let endPosition = rightHandleView.frame.origin.x + assetPreview.contentOffset.x - handleWidth + return getTime(from: endPosition) + } + + private func updateSelectedTime(stoppedMoving: Bool) { + + guard let playerTime = positionBarTime else { + return + } + if stoppedMoving { + delegate?.positionBarStoppedMoving(playerTime) + } else { + delegate?.didChangePositionBar(playerTime) + } + } + + private var positionBarTime: CMTime? { + let barPosition = positionBar.frame.origin.x + assetPreview.contentOffset.x - handleWidth + return getTime(from: barPosition) + } + + private var minimumDistanceBetweenHandle: CGFloat { + guard let asset = asset else { return 0 } + let distance = CGFloat(minDuration) * assetPreview.contentView.frame.width / CGFloat(asset.duration.seconds) + print("minimum distance: \(distance)") + return distance + } + + // MARK: - Scroll View Delegate + + public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + updateSelectedTime(stoppedMoving: true) + } + + public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + if !decelerate { + updateSelectedTime(stoppedMoving: true) + } + } + public func scrollViewDidScroll(_ scrollView: UIScrollView) { + updateSelectedTime(stoppedMoving: false) + } +} diff --git a/Pods/PryntTrimmerView/README.md b/Pods/PryntTrimmerView/README.md new file mode 100644 index 0000000..1d11607 --- /dev/null +++ b/Pods/PryntTrimmerView/README.md @@ -0,0 +1,66 @@ +# PryntTrimmerView + +[![codebeat badge](https://codebeat.co/badges/ac008534-7f30-4b04-8434-0c6d69251e4b)](https://codebeat.co/projects/github-com-prynt-prynttrimmerview-master) +[![Platform](https://img.shields.io/cocoapods/p/PryntTrimmerView.svg?style=flat)](http://cocoapods.org/pods/PryntTrimmerView) +[![License](https://img.shields.io/cocoapods/l/PryntTrimmerView.svg?style=flat)](http://cocoapods.org/pods/PryntTrimmerView) +[![Version](https://img.shields.io/cocoapods/v/PryntTrimmerView.svg?style=flat)](http://cocoapods.org/pods/PryntTrimmerView) + +A set of tools written in swift to crop and trim videos. + + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +### Trimming + +![](https://media.giphy.com/media/GwZGkLiKxZcTm/giphy.gif) + +### Cropping + +![](https://media.giphy.com/media/10FsDfHS7616XC/giphy.gif) + +## Requirements + +PryntTrimmerView requires iOS9: It uses Layout Anchors to define the constraints. + +## Installation + +PryntTrimmerView is available through [CocoaPods](http://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod "PryntTrimmerView" +``` + +For swift 3 compatibility, you can use version 1.0.1 or below. + +## Usage + +### Trimming + +Create a `TrimmerView` instance (in interface builder or through code), and add it to your view hierarchy. + +``` +trimmerView.asset = asset +trimmerView.delegate = self +``` + +Access the `startTime` and `endTime` property to know where to trim your asset. You can use the `TrimmerViewDelegate` to link the trimmer with an `AVPlayer` and provide the end user with a preview. See the `VideoTrimmerViewController` inside the project to see an example. + +You can also customize the trimmer view by changing its colors: +``` +trimmerView.handleColor = UIColor.white +trimmerView.mainColor = UIColor.orange +trimmerView.positionBarColor = UIColor.white +``` + +### Cropping + +Create an instance of the `VideoCropView` and add it to your view hierarchy, then load your video into the crop view: `videoCropView.asset = asset`. + +You can set the aspect ratio you want using the `setAspectRatio` method. Once you are satisfied with the portion of the asset you want to crop, call `getImageCropFrame` to retrieve the select frame. See the `VideoCropperViewController` in the example app for an actual example of how to crop the video for export. + +## License + +PryntTrimmerView is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/Target Support Files/FDTake/FDTake-dummy.m b/Pods/Target Support Files/FDTake/FDTake-dummy.m new file mode 100644 index 0000000..ce35789 --- /dev/null +++ b/Pods/Target Support Files/FDTake/FDTake-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FDTake : NSObject +@end +@implementation PodsDummy_FDTake +@end diff --git a/Pods/Target Support Files/FDTake/FDTake-prefix.pch b/Pods/Target Support Files/FDTake/FDTake-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/FDTake/FDTake-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/FDTake/FDTake-umbrella.h b/Pods/Target Support Files/FDTake/FDTake-umbrella.h new file mode 100644 index 0000000..1f2bf95 --- /dev/null +++ b/Pods/Target Support Files/FDTake/FDTake-umbrella.h @@ -0,0 +1,17 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "FDTake.h" + +FOUNDATION_EXPORT double FDTakeVersionNumber; +FOUNDATION_EXPORT const unsigned char FDTakeVersionString[]; + diff --git a/Pods/Target Support Files/FDTake/FDTake.modulemap b/Pods/Target Support Files/FDTake/FDTake.modulemap new file mode 100644 index 0000000..914f0a9 --- /dev/null +++ b/Pods/Target Support Files/FDTake/FDTake.modulemap @@ -0,0 +1,6 @@ +framework module FDTake { + umbrella header "FDTake-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/FDTake/FDTake.xcconfig b/Pods/Target Support Files/FDTake/FDTake.xcconfig new file mode 100644 index 0000000..66acbd3 --- /dev/null +++ b/Pods/Target Support Files/FDTake/FDTake.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FDTake +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FDTake +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/FDTake/Info.plist b/Pods/Target Support Files/FDTake/Info.plist new file mode 100644 index 0000000..0a12077 --- /dev/null +++ b/Pods/Target Support Files/FDTake/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-testing/Info.plist b/Pods/Target Support Files/Pods-testing/Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Pods/Target Support Files/Pods-testing/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-testing/Pods-testing-acknowledgements.markdown b/Pods/Target Support Files/Pods-testing/Pods-testing-acknowledgements.markdown new file mode 100644 index 0000000..a83ad01 --- /dev/null +++ b/Pods/Target Support Files/Pods-testing/Pods-testing-acknowledgements.markdown @@ -0,0 +1,28 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## PryntTrimmerView + +MIT License + +Copyright (c) 2017 Prynt + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-testing/Pods-testing-acknowledgements.plist b/Pods/Target Support Files/Pods-testing/Pods-testing-acknowledgements.plist new file mode 100644 index 0000000..638a571 --- /dev/null +++ b/Pods/Target Support Files/Pods-testing/Pods-testing-acknowledgements.plist @@ -0,0 +1,60 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + MIT License + +Copyright (c) 2017 Prynt + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + PryntTrimmerView + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-testing/Pods-testing-dummy.m b/Pods/Target Support Files/Pods-testing/Pods-testing-dummy.m new file mode 100644 index 0000000..43cc05e --- /dev/null +++ b/Pods/Target Support Files/Pods-testing/Pods-testing-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_testing : NSObject +@end +@implementation PodsDummy_Pods_testing +@end diff --git a/Pods/Target Support Files/Pods-testing/Pods-testing-frameworks.sh b/Pods/Target Support Files/Pods-testing/Pods-testing-frameworks.sh new file mode 100755 index 0000000..b79df09 --- /dev/null +++ b/Pods/Target Support Files/Pods-testing/Pods-testing-frameworks.sh @@ -0,0 +1,153 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=1 +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/PryntTrimmerView/PryntTrimmerView.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/PryntTrimmerView/PryntTrimmerView.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-testing/Pods-testing-resources.sh b/Pods/Target Support Files/Pods-testing/Pods-testing-resources.sh new file mode 100755 index 0000000..fe3f9c7 --- /dev/null +++ b/Pods/Target Support Files/Pods-testing/Pods-testing-resources.sh @@ -0,0 +1,118 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_BUILD_DIR}/assetcatalog_generated_info.plist" + fi +fi diff --git a/Pods/Target Support Files/Pods-testing/Pods-testing-umbrella.h b/Pods/Target Support Files/Pods-testing/Pods-testing-umbrella.h new file mode 100644 index 0000000..14368e6 --- /dev/null +++ b/Pods/Target Support Files/Pods-testing/Pods-testing-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_testingVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_testingVersionString[]; + diff --git a/Pods/Target Support Files/Pods-testing/Pods-testing.debug.xcconfig b/Pods/Target Support Files/Pods-testing/Pods-testing.debug.xcconfig new file mode 100644 index 0000000..533cced --- /dev/null +++ b/Pods/Target Support Files/Pods-testing/Pods-testing.debug.xcconfig @@ -0,0 +1,11 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView/PryntTrimmerView.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "PryntTrimmerView" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-testing/Pods-testing.modulemap b/Pods/Target Support Files/Pods-testing/Pods-testing.modulemap new file mode 100644 index 0000000..348f007 --- /dev/null +++ b/Pods/Target Support Files/Pods-testing/Pods-testing.modulemap @@ -0,0 +1,6 @@ +framework module Pods_testing { + umbrella header "Pods-testing-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-testing/Pods-testing.release.xcconfig b/Pods/Target Support Files/Pods-testing/Pods-testing.release.xcconfig new file mode 100644 index 0000000..533cced --- /dev/null +++ b/Pods/Target Support Files/Pods-testing/Pods-testing.release.xcconfig @@ -0,0 +1,11 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView/PryntTrimmerView.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "PryntTrimmerView" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-testingTests/Info.plist b/Pods/Target Support Files/Pods-testingTests/Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingTests/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-acknowledgements.markdown b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-acknowledgements.markdown new file mode 100644 index 0000000..b3cc271 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-acknowledgements.markdown @@ -0,0 +1,25 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## FDTake + +Copyright (c) 2016 William Entriken + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-acknowledgements.plist b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-acknowledgements.plist new file mode 100644 index 0000000..4e31cf6 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-acknowledgements.plist @@ -0,0 +1,57 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2016 William Entriken + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + License + MIT + Title + FDTake + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-dummy.m b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-dummy.m new file mode 100644 index 0000000..0490bd6 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_testingTests : NSObject +@end +@implementation PodsDummy_Pods_testingTests +@end diff --git a/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-frameworks.sh b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-frameworks.sh new file mode 100755 index 0000000..db05d37 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-frameworks.sh @@ -0,0 +1,153 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=1 +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/FDTake/FDTake.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/FDTake/FDTake.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-resources.sh b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-resources.sh new file mode 100755 index 0000000..fe3f9c7 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-resources.sh @@ -0,0 +1,118 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_BUILD_DIR}/assetcatalog_generated_info.plist" + fi +fi diff --git a/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-umbrella.h b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-umbrella.h new file mode 100644 index 0000000..244e4df --- /dev/null +++ b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_testingTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_testingTestsVersionString[]; + diff --git a/Pods/Target Support Files/Pods-testingTests/Pods-testingTests.debug.xcconfig b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests.debug.xcconfig new file mode 100644 index 0000000..d59f2ee --- /dev/null +++ b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests.debug.xcconfig @@ -0,0 +1,11 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FDTake" "${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FDTake/FDTake.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView/PryntTrimmerView.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "FDTake" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-testingTests/Pods-testingTests.modulemap b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests.modulemap new file mode 100644 index 0000000..2ac788f --- /dev/null +++ b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_testingTests { + umbrella header "Pods-testingTests-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-testingTests/Pods-testingTests.release.xcconfig b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests.release.xcconfig new file mode 100644 index 0000000..d59f2ee --- /dev/null +++ b/Pods/Target Support Files/Pods-testingTests/Pods-testingTests.release.xcconfig @@ -0,0 +1,11 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FDTake" "${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FDTake/FDTake.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView/PryntTrimmerView.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "FDTake" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-testingUITests/Info.plist b/Pods/Target Support Files/Pods-testingUITests/Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingUITests/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-acknowledgements.markdown b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-acknowledgements.markdown new file mode 100644 index 0000000..102af75 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-acknowledgements.plist b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-acknowledgements.plist new file mode 100644 index 0000000..7acbad1 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-dummy.m b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-dummy.m new file mode 100644 index 0000000..98acb57 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_testingUITests : NSObject +@end +@implementation PodsDummy_Pods_testingUITests +@end diff --git a/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-frameworks.sh b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-frameworks.sh new file mode 100755 index 0000000..08e3eaa --- /dev/null +++ b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-frameworks.sh @@ -0,0 +1,146 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=1 +} + +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-resources.sh b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-resources.sh new file mode 100755 index 0000000..fe3f9c7 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-resources.sh @@ -0,0 +1,118 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_BUILD_DIR}/assetcatalog_generated_info.plist" + fi +fi diff --git a/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-umbrella.h b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-umbrella.h new file mode 100644 index 0000000..1cb2777 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_testingUITestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_testingUITestsVersionString[]; + diff --git a/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.debug.xcconfig b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.debug.xcconfig new file mode 100644 index 0000000..510ccbd --- /dev/null +++ b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.debug.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView/PryntTrimmerView.framework/Headers" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.modulemap b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.modulemap new file mode 100644 index 0000000..c9ff1f2 --- /dev/null +++ b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_testingUITests { + umbrella header "Pods-testingUITests-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.release.xcconfig b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.release.xcconfig new file mode 100644 index 0000000..510ccbd --- /dev/null +++ b/Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.release.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView/PryntTrimmerView.framework/Headers" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/PryntTrimmerView/Info.plist b/Pods/Target Support Files/PryntTrimmerView/Info.plist new file mode 100644 index 0000000..bdac57c --- /dev/null +++ b/Pods/Target Support Files/PryntTrimmerView/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.0.1 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView-dummy.m b/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView-dummy.m new file mode 100644 index 0000000..be8848d --- /dev/null +++ b/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_PryntTrimmerView : NSObject +@end +@implementation PodsDummy_PryntTrimmerView +@end diff --git a/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView-prefix.pch b/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView-umbrella.h b/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView-umbrella.h new file mode 100644 index 0000000..eaf5b4c --- /dev/null +++ b/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double PryntTrimmerViewVersionNumber; +FOUNDATION_EXPORT const unsigned char PryntTrimmerViewVersionString[]; + diff --git a/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView.modulemap b/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView.modulemap new file mode 100644 index 0000000..a166777 --- /dev/null +++ b/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView.modulemap @@ -0,0 +1,6 @@ +framework module PryntTrimmerView { + umbrella header "PryntTrimmerView-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView.xcconfig b/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView.xcconfig new file mode 100644 index 0000000..fa71881 --- /dev/null +++ b/Pods/Target Support Files/PryntTrimmerView/PryntTrimmerView.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/PryntTrimmerView +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/PryntTrimmerView +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/testing.xcodeproj/project.pbxproj b/testing.xcodeproj/project.pbxproj new file mode 100644 index 0000000..97a627a --- /dev/null +++ b/testing.xcodeproj/project.pbxproj @@ -0,0 +1,746 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 841B0FD62085BA6A008E6573 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841B0FD52085BA6A008E6573 /* AppDelegate.swift */; }; + 841B0FD82085BA6A008E6573 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841B0FD72085BA6A008E6573 /* ViewController.swift */; }; + 841B0FDB2085BA6A008E6573 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 841B0FD92085BA6A008E6573 /* Main.storyboard */; }; + 841B0FDE2085BA6A008E6573 /* testing.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 841B0FDC2085BA6A008E6573 /* testing.xcdatamodeld */; }; + 841B0FE02085BA6A008E6573 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 841B0FDF2085BA6A008E6573 /* Assets.xcassets */; }; + 841B0FE32085BA6A008E6573 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 841B0FE12085BA6A008E6573 /* LaunchScreen.storyboard */; }; + 841B0FEE2085BA6B008E6573 /* testingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841B0FED2085BA6B008E6573 /* testingTests.swift */; }; + 841B0FF92085BA6B008E6573 /* testingUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841B0FF82085BA6B008E6573 /* testingUITests.swift */; }; + 842EFDDE20906BBA00C18542 /* VideoClippingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842EFDDD20906BBA00C18542 /* VideoClippingVC.swift */; }; + 842F6C1B209082DA004860AC /* AssetSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842F6C1A209082DA004860AC /* AssetSelectionViewController.swift */; }; + 84392CAB20889FAC00FB94D4 /* progressRingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84392CAA20889FAC00FB94D4 /* progressRingVC.swift */; }; + 860944A0FF89E0CBEEB885C7 /* Pods_testing.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2DA372636C45CF1BFF92B4AE /* Pods_testing.framework */; }; + DC9CA930689B7671478E7688 /* Pods_testingUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0E3581CCF1909A91F1A53A2 /* Pods_testingUITests.framework */; }; + E3194AEAC8D1463C764CCCD5 /* Pods_testingTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88CF623F5AC287AC3EA617CA /* Pods_testingTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 841B0FEA2085BA6B008E6573 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 841B0FCA2085BA6A008E6573 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 841B0FD12085BA6A008E6573; + remoteInfo = testing; + }; + 841B0FF52085BA6B008E6573 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 841B0FCA2085BA6A008E6573 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 841B0FD12085BA6A008E6573; + remoteInfo = testing; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 2DA372636C45CF1BFF92B4AE /* Pods_testing.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_testing.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3059F3AE41F807AE5DA6DE14 /* Pods-testing.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-testing.release.xcconfig"; path = "Pods/Target Support Files/Pods-testing/Pods-testing.release.xcconfig"; sourceTree = ""; }; + 4AC154524ACF130C1AB7041C /* Pods-testing.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-testing.debug.xcconfig"; path = "Pods/Target Support Files/Pods-testing/Pods-testing.debug.xcconfig"; sourceTree = ""; }; + 68FD495B01AAF4BC117F0AFD /* Pods-testingTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-testingTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-testingTests/Pods-testingTests.debug.xcconfig"; sourceTree = ""; }; + 6D58C41EE54096AD8058FAC1 /* Pods-testingUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-testingUITests.release.xcconfig"; path = "Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.release.xcconfig"; sourceTree = ""; }; + 841B0FD22085BA6A008E6573 /* testing.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = testing.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 841B0FD52085BA6A008E6573 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 841B0FD72085BA6A008E6573 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 841B0FDA2085BA6A008E6573 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 841B0FDD2085BA6A008E6573 /* testing.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = testing.xcdatamodel; sourceTree = ""; }; + 841B0FDF2085BA6A008E6573 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 841B0FE22085BA6A008E6573 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 841B0FE42085BA6A008E6573 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 841B0FE92085BA6B008E6573 /* testingTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = testingTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 841B0FED2085BA6B008E6573 /* testingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = testingTests.swift; sourceTree = ""; }; + 841B0FEF2085BA6B008E6573 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 841B0FF42085BA6B008E6573 /* testingUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = testingUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 841B0FF82085BA6B008E6573 /* testingUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = testingUITests.swift; sourceTree = ""; }; + 841B0FFA2085BA6B008E6573 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 842EFDDD20906BBA00C18542 /* VideoClippingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoClippingVC.swift; sourceTree = ""; }; + 842F6C1A209082DA004860AC /* AssetSelectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssetSelectionViewController.swift; sourceTree = ""; }; + 84392CAA20889FAC00FB94D4 /* progressRingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = progressRingVC.swift; sourceTree = ""; }; + 88CF623F5AC287AC3EA617CA /* Pods_testingTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_testingTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CEAAFA48316C82FC99FC6FAD /* Pods-testingTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-testingTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-testingTests/Pods-testingTests.release.xcconfig"; sourceTree = ""; }; + EF667326652297FA1236B8F8 /* Pods-testingUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-testingUITests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-testingUITests/Pods-testingUITests.debug.xcconfig"; sourceTree = ""; }; + F0E3581CCF1909A91F1A53A2 /* Pods_testingUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_testingUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 841B0FCF2085BA6A008E6573 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 860944A0FF89E0CBEEB885C7 /* Pods_testing.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 841B0FE62085BA6B008E6573 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E3194AEAC8D1463C764CCCD5 /* Pods_testingTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 841B0FF12085BA6B008E6573 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DC9CA930689B7671478E7688 /* Pods_testingUITests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 40796927586142E3C7FE1BA4 /* Pods */ = { + isa = PBXGroup; + children = ( + 4AC154524ACF130C1AB7041C /* Pods-testing.debug.xcconfig */, + 3059F3AE41F807AE5DA6DE14 /* Pods-testing.release.xcconfig */, + 68FD495B01AAF4BC117F0AFD /* Pods-testingTests.debug.xcconfig */, + CEAAFA48316C82FC99FC6FAD /* Pods-testingTests.release.xcconfig */, + EF667326652297FA1236B8F8 /* Pods-testingUITests.debug.xcconfig */, + 6D58C41EE54096AD8058FAC1 /* Pods-testingUITests.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + 841B0FC92085BA6A008E6573 = { + isa = PBXGroup; + children = ( + 841B0FD42085BA6A008E6573 /* testing */, + 841B0FEC2085BA6B008E6573 /* testingTests */, + 841B0FF72085BA6B008E6573 /* testingUITests */, + 841B0FD32085BA6A008E6573 /* Products */, + 40796927586142E3C7FE1BA4 /* Pods */, + D738AADE74FB8E775E776F4C /* Frameworks */, + ); + sourceTree = ""; + }; + 841B0FD32085BA6A008E6573 /* Products */ = { + isa = PBXGroup; + children = ( + 841B0FD22085BA6A008E6573 /* testing.app */, + 841B0FE92085BA6B008E6573 /* testingTests.xctest */, + 841B0FF42085BA6B008E6573 /* testingUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 841B0FD42085BA6A008E6573 /* testing */ = { + isa = PBXGroup; + children = ( + 842F6C19209082CB004860AC /* videoTrimming */, + 841B0FD52085BA6A008E6573 /* AppDelegate.swift */, + 841B0FD72085BA6A008E6573 /* ViewController.swift */, + 841B0FD92085BA6A008E6573 /* Main.storyboard */, + 841B0FDF2085BA6A008E6573 /* Assets.xcassets */, + 841B0FE12085BA6A008E6573 /* LaunchScreen.storyboard */, + 841B0FE42085BA6A008E6573 /* Info.plist */, + 841B0FDC2085BA6A008E6573 /* testing.xcdatamodeld */, + 84392CAA20889FAC00FB94D4 /* progressRingVC.swift */, + ); + path = testing; + sourceTree = ""; + }; + 841B0FEC2085BA6B008E6573 /* testingTests */ = { + isa = PBXGroup; + children = ( + 841B0FED2085BA6B008E6573 /* testingTests.swift */, + 841B0FEF2085BA6B008E6573 /* Info.plist */, + ); + path = testingTests; + sourceTree = ""; + }; + 841B0FF72085BA6B008E6573 /* testingUITests */ = { + isa = PBXGroup; + children = ( + 841B0FF82085BA6B008E6573 /* testingUITests.swift */, + 841B0FFA2085BA6B008E6573 /* Info.plist */, + ); + path = testingUITests; + sourceTree = ""; + }; + 842F6C19209082CB004860AC /* videoTrimming */ = { + isa = PBXGroup; + children = ( + 842F6C1A209082DA004860AC /* AssetSelectionViewController.swift */, + 842EFDDD20906BBA00C18542 /* VideoClippingVC.swift */, + ); + path = videoTrimming; + sourceTree = ""; + }; + D738AADE74FB8E775E776F4C /* Frameworks */ = { + isa = PBXGroup; + children = ( + 2DA372636C45CF1BFF92B4AE /* Pods_testing.framework */, + 88CF623F5AC287AC3EA617CA /* Pods_testingTests.framework */, + F0E3581CCF1909A91F1A53A2 /* Pods_testingUITests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 841B0FD12085BA6A008E6573 /* testing */ = { + isa = PBXNativeTarget; + buildConfigurationList = 841B0FFD2085BA6B008E6573 /* Build configuration list for PBXNativeTarget "testing" */; + buildPhases = ( + CEDFF8BB3CA4156CD61A51C9 /* [CP] Check Pods Manifest.lock */, + 841B0FCE2085BA6A008E6573 /* Sources */, + 841B0FCF2085BA6A008E6573 /* Frameworks */, + 841B0FD02085BA6A008E6573 /* Resources */, + 8FEEE31F3022B72E3904306D /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = testing; + productName = testing; + productReference = 841B0FD22085BA6A008E6573 /* testing.app */; + productType = "com.apple.product-type.application"; + }; + 841B0FE82085BA6B008E6573 /* testingTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 841B10002085BA6B008E6573 /* Build configuration list for PBXNativeTarget "testingTests" */; + buildPhases = ( + 768BF32DBE99DE733C65C782 /* [CP] Check Pods Manifest.lock */, + 841B0FE52085BA6B008E6573 /* Sources */, + 841B0FE62085BA6B008E6573 /* Frameworks */, + 841B0FE72085BA6B008E6573 /* Resources */, + 54A53805B147638C30CE278B /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 841B0FEB2085BA6B008E6573 /* PBXTargetDependency */, + ); + name = testingTests; + productName = testingTests; + productReference = 841B0FE92085BA6B008E6573 /* testingTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 841B0FF32085BA6B008E6573 /* testingUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 841B10032085BA6B008E6573 /* Build configuration list for PBXNativeTarget "testingUITests" */; + buildPhases = ( + 462CFB089885010F51E58781 /* [CP] Check Pods Manifest.lock */, + 841B0FF02085BA6B008E6573 /* Sources */, + 841B0FF12085BA6B008E6573 /* Frameworks */, + 841B0FF22085BA6B008E6573 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 841B0FF62085BA6B008E6573 /* PBXTargetDependency */, + ); + name = testingUITests; + productName = testingUITests; + productReference = 841B0FF42085BA6B008E6573 /* testingUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 841B0FCA2085BA6A008E6573 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 0920; + ORGANIZATIONNAME = admin; + TargetAttributes = { + 841B0FD12085BA6A008E6573 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Automatic; + }; + 841B0FE82085BA6B008E6573 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Automatic; + TestTargetID = 841B0FD12085BA6A008E6573; + }; + 841B0FF32085BA6B008E6573 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Automatic; + TestTargetID = 841B0FD12085BA6A008E6573; + }; + }; + }; + buildConfigurationList = 841B0FCD2085BA6A008E6573 /* Build configuration list for PBXProject "testing" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 841B0FC92085BA6A008E6573; + productRefGroup = 841B0FD32085BA6A008E6573 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 841B0FD12085BA6A008E6573 /* testing */, + 841B0FE82085BA6B008E6573 /* testingTests */, + 841B0FF32085BA6B008E6573 /* testingUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 841B0FD02085BA6A008E6573 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 841B0FE32085BA6A008E6573 /* LaunchScreen.storyboard in Resources */, + 841B0FE02085BA6A008E6573 /* Assets.xcassets in Resources */, + 841B0FDB2085BA6A008E6573 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 841B0FE72085BA6B008E6573 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 841B0FF22085BA6B008E6573 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 462CFB089885010F51E58781 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-testingUITests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + 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"; + showEnvVarsInLog = 0; + }; + 54A53805B147638C30CE278B /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/FDTake/FDTake.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FDTake.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-testingTests/Pods-testingTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 768BF32DBE99DE733C65C782 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-testingTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + 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"; + showEnvVarsInLog = 0; + }; + 8FEEE31F3022B72E3904306D /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-testing/Pods-testing-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/PryntTrimmerView/PryntTrimmerView.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PryntTrimmerView.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-testing/Pods-testing-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + CEDFF8BB3CA4156CD61A51C9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-testing-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + 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"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 841B0FCE2085BA6A008E6573 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 842F6C1B209082DA004860AC /* AssetSelectionViewController.swift in Sources */, + 842EFDDE20906BBA00C18542 /* VideoClippingVC.swift in Sources */, + 841B0FD82085BA6A008E6573 /* ViewController.swift in Sources */, + 84392CAB20889FAC00FB94D4 /* progressRingVC.swift in Sources */, + 841B0FD62085BA6A008E6573 /* AppDelegate.swift in Sources */, + 841B0FDE2085BA6A008E6573 /* testing.xcdatamodeld in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 841B0FE52085BA6B008E6573 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 841B0FEE2085BA6B008E6573 /* testingTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 841B0FF02085BA6B008E6573 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 841B0FF92085BA6B008E6573 /* testingUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 841B0FEB2085BA6B008E6573 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 841B0FD12085BA6A008E6573 /* testing */; + targetProxy = 841B0FEA2085BA6B008E6573 /* PBXContainerItemProxy */; + }; + 841B0FF62085BA6B008E6573 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 841B0FD12085BA6A008E6573 /* testing */; + targetProxy = 841B0FF52085BA6B008E6573 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 841B0FD92085BA6A008E6573 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 841B0FDA2085BA6A008E6573 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 841B0FE12085BA6A008E6573 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 841B0FE22085BA6A008E6573 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 841B0FFB2085BA6B008E6573 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 841B0FFC2085BA6B008E6573 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 841B0FFE2085BA6B008E6573 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4AC154524ACF130C1AB7041C /* Pods-testing.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 7X6AR44722; + INFOPLIST_FILE = testing/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.brainplow.testing; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 841B0FFF2085BA6B008E6573 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3059F3AE41F807AE5DA6DE14 /* Pods-testing.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 7X6AR44722; + INFOPLIST_FILE = testing/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.brainplow.testing; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 841B10012085BA6B008E6573 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 68FD495B01AAF4BC117F0AFD /* Pods-testingTests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 7X6AR44722; + INFOPLIST_FILE = testingTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.brainplow.testingTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/testing.app/testing"; + }; + name = Debug; + }; + 841B10022085BA6B008E6573 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CEAAFA48316C82FC99FC6FAD /* Pods-testingTests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 7X6AR44722; + INFOPLIST_FILE = testingTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.brainplow.testingTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/testing.app/testing"; + }; + name = Release; + }; + 841B10042085BA6B008E6573 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EF667326652297FA1236B8F8 /* Pods-testingUITests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 7X6AR44722; + INFOPLIST_FILE = testingUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.brainplow.testingUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = testing; + }; + name = Debug; + }; + 841B10052085BA6B008E6573 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6D58C41EE54096AD8058FAC1 /* Pods-testingUITests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 7X6AR44722; + INFOPLIST_FILE = testingUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.brainplow.testingUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = testing; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 841B0FCD2085BA6A008E6573 /* Build configuration list for PBXProject "testing" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 841B0FFB2085BA6B008E6573 /* Debug */, + 841B0FFC2085BA6B008E6573 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 841B0FFD2085BA6B008E6573 /* Build configuration list for PBXNativeTarget "testing" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 841B0FFE2085BA6B008E6573 /* Debug */, + 841B0FFF2085BA6B008E6573 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 841B10002085BA6B008E6573 /* Build configuration list for PBXNativeTarget "testingTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 841B10012085BA6B008E6573 /* Debug */, + 841B10022085BA6B008E6573 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 841B10032085BA6B008E6573 /* Build configuration list for PBXNativeTarget "testingUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 841B10042085BA6B008E6573 /* Debug */, + 841B10052085BA6B008E6573 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + 841B0FDC2085BA6A008E6573 /* testing.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 841B0FDD2085BA6A008E6573 /* testing.xcdatamodel */, + ); + currentVersion = 841B0FDD2085BA6A008E6573 /* testing.xcdatamodel */; + path = testing.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = 841B0FCA2085BA6A008E6573 /* Project object */; +} diff --git a/testing.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/testing.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0c0559c --- /dev/null +++ b/testing.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/testing.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate b/testing.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..9e0123ad6fdbbf3d6dc668bdc6665e4a11519cd9 GIT binary patch literal 33121 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 G&i@B|`>T=w literal 0 HcmV?d00001 diff --git a/testing.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist b/testing.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..be3f0a9 --- /dev/null +++ b/testing.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + testing.xcscheme + + orderHint + 5 + + + + diff --git a/testing.xcworkspace/contents.xcworkspacedata b/testing.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..e90ac63 --- /dev/null +++ b/testing.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/testing.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate b/testing.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..85dc892c7f376930efd76f2d8f103fb9f0f746ab GIT binary patch literal 44672 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�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
    19cpJfwJNDqJ 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 literal 0 HcmV?d00001 diff --git a/testing.xcworkspace/xcuserdata/admin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/testing.xcworkspace/xcuserdata/admin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..ed9a9b4 --- /dev/null +++ b/testing.xcworkspace/xcuserdata/admin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/testing/AppDelegate.swift b/testing/AppDelegate.swift new file mode 100644 index 0000000..5de2970 --- /dev/null +++ b/testing/AppDelegate.swift @@ -0,0 +1,93 @@ +// +// AppDelegate.swift +// testing +// +// Created by admin on 4/17/18. +// Copyright © 2018 admin. All rights reserved. +// + +import UIKit +import CoreData + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (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. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // 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. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // 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. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + // Saves changes in the application's managed object context before the application terminates. + self.saveContext() + } + + // MARK: - Core Data stack + + lazy var persistentContainer: NSPersistentContainer = { + /* + The persistent container for the application. This implementation + creates and returns a container, having loaded the store for the + application to it. This property is optional since there are legitimate + error conditions that could cause the creation of the store to fail. + */ + let container = NSPersistentContainer(name: "testing") + container.loadPersistentStores(completionHandler: { (storeDescription, error) in + if let error = error as NSError? { + // Replace this implementation with code to handle the error appropriately. + // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. + + /* + Typical reasons for an error here include: + * The parent directory does not exist, cannot be created, or disallows writing. + * The persistent store is not accessible, due to permissions or data protection when the device is locked. + * The device is out of space. + * The store could not be migrated to the current model version. + Check the error message to determine what the actual problem was. + */ + fatalError("Unresolved error \(error), \(error.userInfo)") + } + }) + return container + }() + + // MARK: - Core Data Saving support + + func saveContext () { + let context = persistentContainer.viewContext + if context.hasChanges { + do { + try context.save() + } catch { + // Replace this implementation with code to handle the error appropriately. + // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. + let nserror = error as NSError + fatalError("Unresolved error \(nserror), \(nserror.userInfo)") + } + } + } + +} + diff --git a/testing/Assets.xcassets/AppIcon.appiconset/Contents.json b/testing/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1d060ed --- /dev/null +++ b/testing/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/testing/Base.lproj/LaunchScreen.storyboard b/testing/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f83f6fd --- /dev/null +++ b/testing/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testing/Base.lproj/Main.storyboard b/testing/Base.lproj/Main.storyboard new file mode 100644 index 0000000..457ddfc --- /dev/null +++ b/testing/Base.lproj/Main.storyboard @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testing/Info.plist b/testing/Info.plist new file mode 100644 index 0000000..284e68e --- /dev/null +++ b/testing/Info.plist @@ -0,0 +1,47 @@ + + + + + NSPhotoLibraryUsageDescription + For testing + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/testing/ViewController.swift b/testing/ViewController.swift new file mode 100644 index 0000000..74ee78a --- /dev/null +++ b/testing/ViewController.swift @@ -0,0 +1,57 @@ +// +// ViewController.swift +// testing +// +// Created by admin on 4/17/18. +// Copyright © 2018 admin. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController { + + var tableDataSource = ["Row 1", "Row 2", "Row 3", "Row 4", "Row 5"] + + override func viewDidLoad() { + super.viewDidLoad() + clearBackButtonText(vc: self) + + } + + func clearBackButtonText(vc : UIViewController) { + let backItem = UIBarButtonItem() + backItem.title = "" + vc.navigationItem.backBarButtonItem = backItem + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + @objc func labelSwipedLeft(sender: UITapGestureRecognizer) { + print("labelSwipedLeft called for row \(sender.view!.tag)") + } + +} + +extension ViewController : UITableViewDataSource, UITableViewDelegate { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 5 + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) + cell.textLabel?.text = tableDataSource[indexPath.row] + cell.textLabel?.tag = indexPath.row + //cell.textLabel?.isUserInteractionEnabled = true + //let swipeLeft = UITapGestureRecognizer(target: self, action:#selector(self.labelSwipedLeft(sender:))) + + //cell.textLabel?.addGestureRecognizer(swipeLeft) + return cell + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + + performSegue(withIdentifier: "test", sender: self) + } +} diff --git a/testing/progressRingVC.swift b/testing/progressRingVC.swift new file mode 100644 index 0000000..9080f40 --- /dev/null +++ b/testing/progressRingVC.swift @@ -0,0 +1,87 @@ +// +// progressRingVC.swift +// testing +// +// Created by admin on 4/19/18. +// Copyright © 2018 admin. All rights reserved. +// + +import UIKit + +class progressRingVC: UIViewController { + + + let percentageLabel : UILabel = { + let label = UILabel() + label.text = "0%" + label.textAlignment = .center + label.font = UIFont.boldSystemFont(ofSize: 30) + return label + }() + override func viewDidLoad() { + super.viewDidLoad() + + let shapeLayer = CAShapeLayer() + + let center = view.center + //create my track lyer + let trackLayer = CAShapeLayer() + let ninety = CGFloat.pi / 2 + let cicularPath = UIBezierPath.init(arcCenter: center, radius: 100, startAngle: ( -CGFloat.pi/2 ), endAngle: (2 * CGFloat.pi) - ninety , clockwise: true) + trackLayer.path = cicularPath.cgPath + trackLayer.strokeColor = UIColor.lightGray.cgColor + trackLayer.lineWidth = 10 + trackLayer.fillColor = UIColor.white.cgColor + trackLayer.lineCap = kCALineCapRound + view.layer.addSublayer(trackLayer) + + + shapeLayer.path = cicularPath.cgPath + shapeLayer.strokeColor = #colorLiteral(red: 0.8566855788, green: 0.1049235985, blue: 0.136507839, alpha: 1) + shapeLayer.lineWidth = 10 + shapeLayer.fillColor = UIColor.white.cgColor + shapeLayer.lineCap = kCALineCapRound + + + shapeLayer.strokeEnd = 0 + view.layer.addSublayer(shapeLayer) + + + animateCircle(shapeLayer) + + percentageLabel.frame = CGRect(x: 0, y: 0 , width: 100, height: 100) + percentageLabel.center = view.center + view.addSubview(percentageLabel) + + //adding label + + } + + fileprivate func animateCircle(_ shapeLayer: CAShapeLayer) { + //keypath is the thing that we want animation on + let basicAnimation = CABasicAnimation(keyPath: "strokeEnd") + basicAnimation.toValue = 0.5 + basicAnimation.duration = 2 + basicAnimation.fillMode = kCAFillModeForwards + basicAnimation.isRemovedOnCompletion = false + + shapeLayer.add(basicAnimation, forKey: "urSoBasic") + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/testing/testing.xcdatamodeld/.xccurrentversion b/testing/testing.xcdatamodeld/.xccurrentversion new file mode 100644 index 0000000..e41add6 --- /dev/null +++ b/testing/testing.xcdatamodeld/.xccurrentversion @@ -0,0 +1,8 @@ + + + + + _XCCurrentVersionName + testing.xcdatamodel + + diff --git a/testing/testing.xcdatamodeld/testing.xcdatamodel/contents b/testing/testing.xcdatamodeld/testing.xcdatamodel/contents new file mode 100644 index 0000000..476e5b6 --- /dev/null +++ b/testing/testing.xcdatamodeld/testing.xcdatamodel/contents @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/testing/videoTrimming/AssetSelectionViewController.swift b/testing/videoTrimming/AssetSelectionViewController.swift new file mode 100755 index 0000000..9939046 --- /dev/null +++ b/testing/videoTrimming/AssetSelectionViewController.swift @@ -0,0 +1,52 @@ +// +// AssetSelectionViewController.swift +// PryntTrimmerView +// +// Created by Henry on 25/06/2017. +// Copyright © 2017 CocoaPods. All rights reserved. +// + +import UIKit +import Photos + +class AssetSelectionViewController: UIViewController { + + var fetchResult: PHFetchResult? + + override func viewDidLoad() { + super.viewDidLoad() + loadLibrary() + } + + func loadLibrary() { + PHPhotoLibrary.requestAuthorization { (status) in + if status == .authorized { + self.fetchResult = PHAsset.fetchAssets(with: .video, options: nil) + } + } + } + + func loadAssetRandomly() { + guard let fetchResult = fetchResult, fetchResult.count > 0 else { + let alert = UIAlertController(title: "No Video Found", message: "No Video Found on your device.", preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.destructive, handler: nil)) + self.present(alert, animated: true, completion: nil) + print("Error loading assets.") + return + } + + let randomAssetIndex = Int(arc4random_uniform(UInt32(fetchResult.count - 1))) + let asset = fetchResult.object(at: randomAssetIndex) + PHCachingImageManager().requestAVAsset(forVideo: asset, options: nil) { (avAsset, _, _) in + DispatchQueue.main.async { + if let avAsset = avAsset { + self.loadAsset(avAsset) + } + } + } + } + + func loadAsset(_ asset: AVAsset) { + // override in subclass + } +} diff --git a/testing/videoTrimming/VideoClippingVC.swift b/testing/videoTrimming/VideoClippingVC.swift new file mode 100644 index 0000000..d6cd752 --- /dev/null +++ b/testing/videoTrimming/VideoClippingVC.swift @@ -0,0 +1,145 @@ +// +// VideoClippingVC.swift +// testing +// +// Created by admin on 4/25/18. +// Copyright © 2018 admin. All rights reserved. +// + +import UIKit +import PryntTrimmerView +import AVKit + +/// A view controller to demonstrate the trimming of a video. Make sure the scene is selected as the initial +// view controller in the storyboard + +class VideoClippingVC: AssetSelectionViewController { + + @IBOutlet weak var trimmerView: TrimmerView! + @IBOutlet weak var playerView: UIView! + + @IBOutlet weak var btnPlay: UIButton! + var player: AVPlayer? + var playbackTimeCheckerTimer: Timer? + var trimmerPositionChangedTimer: Timer? + + + override func viewDidLoad() { + super.viewDidLoad() + //trimmerView.delegate = self + trimmerView.handleColor = UIColor.white + trimmerView.mainColor = UIColor.darkGray + //trimmerView.ass + + + // Do any additional setup after loading the view. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + + private func addVideoPlayer(with asset: AVAsset, playerView: UIView) { + let playerItem = AVPlayerItem(asset: asset) + player = AVPlayer(playerItem: playerItem) + + NotificationCenter.default.addObserver(self, selector: #selector(VideoClippingVC.itemDidFinishPlaying(_:)), + name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem) + + let layer: AVPlayerLayer = AVPlayerLayer(player: player) + layer.backgroundColor = UIColor.white.cgColor + layer.frame = CGRect(x: 0, y: 0, width: playerView.frame.width, height: playerView.frame.height) + layer.videoGravity = AVLayerVideoGravity.resizeAspectFill + playerView.layer.sublayers?.forEach({$0.removeFromSuperlayer()}) + playerView.layer.addSublayer(layer) + } + + @objc func itemDidFinishPlaying(_ notification: Notification) { + if let startTime = trimmerView.startTime { + player?.seek(to: startTime) + + } + } + + func startPlaybackTimeChecker() { + + stopPlaybackTimeChecker() + playbackTimeCheckerTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, + selector: + #selector(VideoClippingVC.onPlaybackTimeChecker), userInfo: nil, repeats: true) + } + + func stopPlaybackTimeChecker() { + + playbackTimeCheckerTimer?.invalidate() + playbackTimeCheckerTimer = nil + } + + @objc func onPlaybackTimeChecker() { + + guard let startTime = trimmerView.startTime, let endTime = trimmerView.endTime, let player = player else { + return + } + + let playBackTime = player.currentTime() + trimmerView.seek(to: playBackTime) + + if playBackTime >= endTime { + player.seek(to: startTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) + trimmerView.seek(to: startTime) + } + } + + //MARK:- Actions + @IBAction func play(_ sender: Any) { + + guard let player = player else { return } + + if !player.isPlaying { + player.play() + startPlaybackTimeChecker() + } else { + player.pause() + + stopPlaybackTimeChecker() + } + } + + @IBAction func selectAsset(_ sender: Any) { + loadAssetRandomly() + + } + + override func loadAsset(_ asset: AVAsset) { + + trimmerView.asset = asset + trimmerView.delegate = self + addVideoPlayer(with: asset, playerView: playerView) + } + +} + +extension VideoClippingVC: TrimmerViewDelegate { + func positionBarStoppedMoving(_ playerTime: CMTime) { + player?.seek(to: playerTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) + player?.play() + startPlaybackTimeChecker() + } + + func didChangePositionBar(_ playerTime: CMTime) { + stopPlaybackTimeChecker() + player?.pause() + player?.seek(to: playerTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) + let duration = (trimmerView.endTime! - trimmerView.startTime!).seconds + print(duration) + } +} + +extension AVPlayer { + + var isPlaying: Bool { + return self.rate != 0 && self.error == nil + } +} diff --git a/testingTests/Info.plist b/testingTests/Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/testingTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/testingTests/testingTests.swift b/testingTests/testingTests.swift new file mode 100644 index 0000000..117b458 --- /dev/null +++ b/testingTests/testingTests.swift @@ -0,0 +1,36 @@ +// +// testingTests.swift +// testingTests +// +// Created by admin on 4/17/18. +// Copyright © 2018 admin. All rights reserved. +// + +import XCTest +@testable import testing + +class testingTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/testingUITests/Info.plist b/testingUITests/Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/testingUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/testingUITests/testingUITests.swift b/testingUITests/testingUITests.swift new file mode 100644 index 0000000..cfe7b1b --- /dev/null +++ b/testingUITests/testingUITests.swift @@ -0,0 +1,36 @@ +// +// testingUITests.swift +// testingUITests +// +// Created by admin on 4/17/18. +// Copyright © 2018 admin. All rights reserved. +// + +import XCTest + +class testingUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +}