diff --git a/.DS_Store b/.DS_Store index 5f07804f262af356ef417d73e26aebb21e8b73a3..e1fcced5fcaf1911be78ad5f61788a441f9cb554 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/MiniScanner.xcodeproj/project.pbxproj b/MiniScanner.xcodeproj/project.pbxproj index 97246278b364a2ed80e2d739ffeeee15beb9ad07..e932361834e162abc7754356cfef10ce8fee75e9 100644 --- a/MiniScanner.xcodeproj/project.pbxproj +++ b/MiniScanner.xcodeproj/project.pbxproj @@ -84,7 +84,18 @@ 53CD5F5E2C1505EC0010424B /* UIWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53CD5F5D2C1505EC0010424B /* UIWindow.swift */; }; 53CD5F612C15A6210010424B /* SettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53CD5F5F2C15A6210010424B /* SettingViewController.swift */; }; 53CD5F622C15A6210010424B /* SettingViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 53CD5F602C15A6210010424B /* SettingViewController.xib */; }; + 53D9D1C22C1AF521004D1C1C /* StickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D9D1BE2C1AF521004D1C1C /* StickerView.swift */; }; + 53D9D1C42C1AF521004D1C1C /* UIView+Constraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D9D1C02C1AF521004D1C1C /* UIView+Constraints.swift */; }; + 53D9D1C52C1AF521004D1C1C /* MyExtention.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D9D1C12C1AF521004D1C1C /* MyExtention.swift */; }; 53E3A2092C19D17100C9B95E /* PreviewImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E3A2082C19D17100C9B95E /* PreviewImageViewController.swift */; }; + 53E7D3352C1B00880025A1D3 /* FSPagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E7D32C2C1B00880025A1D3 /* FSPagerView.swift */; }; + 53E7D3362C1B00880025A1D3 /* FSPageViewTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E7D32D2C1B00880025A1D3 /* FSPageViewTransformer.swift */; }; + 53E7D3372C1B00880025A1D3 /* FSPagerViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E7D32F2C1B00880025A1D3 /* FSPagerViewCell.swift */; }; + 53E7D3382C1B00880025A1D3 /* FSPagerViewLayoutAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E7D3302C1B00880025A1D3 /* FSPagerViewLayoutAttributes.swift */; }; + 53E7D3392C1B00880025A1D3 /* FSPageViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E7D3312C1B00880025A1D3 /* FSPageViewLayout.swift */; }; + 53E7D33A2C1B00880025A1D3 /* FSPageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E7D3322C1B00880025A1D3 /* FSPageControl.swift */; }; + 53E7D33B2C1B00880025A1D3 /* FSPagerViewObjcCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 53E7D3332C1B00880025A1D3 /* FSPagerViewObjcCompat.m */; }; + 53E7D33C2C1B00880025A1D3 /* FSPagerCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E7D3342C1B00880025A1D3 /* FSPagerCollectionView.swift */; }; 53EDED962C18387E00DB8DF9 /* TYPageControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDED922C18387E00DB8DF9 /* TYPageControl.m */; }; 53EDED972C18387E00DB8DF9 /* TYCyclePagerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDED932C18387E00DB8DF9 /* TYCyclePagerView.m */; }; 53EDED982C18387E00DB8DF9 /* TYCyclePagerTransformLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDED942C18387E00DB8DF9 /* TYCyclePagerTransformLayout.m */; }; @@ -235,7 +246,19 @@ 53CD5F5D2C1505EC0010424B /* UIWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIWindow.swift; sourceTree = "<group>"; }; 53CD5F5F2C15A6210010424B /* SettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingViewController.swift; sourceTree = "<group>"; }; 53CD5F602C15A6210010424B /* SettingViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SettingViewController.xib; sourceTree = "<group>"; }; + 53D9D1BE2C1AF521004D1C1C /* StickerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerView.swift; sourceTree = "<group>"; }; + 53D9D1C02C1AF521004D1C1C /* UIView+Constraints.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Constraints.swift"; sourceTree = "<group>"; }; + 53D9D1C12C1AF521004D1C1C /* MyExtention.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyExtention.swift; sourceTree = "<group>"; }; 53E3A2082C19D17100C9B95E /* PreviewImageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewImageViewController.swift; sourceTree = "<group>"; }; + 53E7D32C2C1B00880025A1D3 /* FSPagerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSPagerView.swift; sourceTree = "<group>"; }; + 53E7D32D2C1B00880025A1D3 /* FSPageViewTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSPageViewTransformer.swift; sourceTree = "<group>"; }; + 53E7D32E2C1B00880025A1D3 /* FSPagerViewObjcCompat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FSPagerViewObjcCompat.h; sourceTree = "<group>"; }; + 53E7D32F2C1B00880025A1D3 /* FSPagerViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSPagerViewCell.swift; sourceTree = "<group>"; }; + 53E7D3302C1B00880025A1D3 /* FSPagerViewLayoutAttributes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSPagerViewLayoutAttributes.swift; sourceTree = "<group>"; }; + 53E7D3312C1B00880025A1D3 /* FSPageViewLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSPageViewLayout.swift; sourceTree = "<group>"; }; + 53E7D3322C1B00880025A1D3 /* FSPageControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSPageControl.swift; sourceTree = "<group>"; }; + 53E7D3332C1B00880025A1D3 /* FSPagerViewObjcCompat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FSPagerViewObjcCompat.m; sourceTree = "<group>"; }; + 53E7D3342C1B00880025A1D3 /* FSPagerCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSPagerCollectionView.swift; sourceTree = "<group>"; }; 53EDED902C18387E00DB8DF9 /* TYCyclePagerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TYCyclePagerView.h; sourceTree = "<group>"; }; 53EDED912C18387E00DB8DF9 /* TYCyclePagerTransformLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TYCyclePagerTransformLayout.h; sourceTree = "<group>"; }; 53EDED922C18387E00DB8DF9 /* TYPageControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TYPageControl.m; sourceTree = "<group>"; }; @@ -540,6 +563,31 @@ path = KNAlert; sourceTree = "<group>"; }; + 53D9D1BD2C1AF521004D1C1C /* LogoAnimationView */ = { + isa = PBXGroup; + children = ( + 53D9D1BE2C1AF521004D1C1C /* StickerView.swift */, + 53D9D1C02C1AF521004D1C1C /* UIView+Constraints.swift */, + ); + path = LogoAnimationView; + sourceTree = "<group>"; + }; + 53E7D32B2C1B00880025A1D3 /* Sources */ = { + isa = PBXGroup; + children = ( + 53E7D32C2C1B00880025A1D3 /* FSPagerView.swift */, + 53E7D32D2C1B00880025A1D3 /* FSPageViewTransformer.swift */, + 53E7D32E2C1B00880025A1D3 /* FSPagerViewObjcCompat.h */, + 53E7D32F2C1B00880025A1D3 /* FSPagerViewCell.swift */, + 53E7D3302C1B00880025A1D3 /* FSPagerViewLayoutAttributes.swift */, + 53E7D3312C1B00880025A1D3 /* FSPageViewLayout.swift */, + 53E7D3322C1B00880025A1D3 /* FSPageControl.swift */, + 53E7D3332C1B00880025A1D3 /* FSPagerViewObjcCompat.m */, + 53E7D3342C1B00880025A1D3 /* FSPagerCollectionView.swift */, + ); + path = Sources; + sourceTree = "<group>"; + }; 53EDED8F2C18387E00DB8DF9 /* CyclePagerView */ = { isa = PBXGroup; children = ( @@ -724,6 +772,9 @@ EC8A9B0C254DC30800F9AF99 /* Supporting Files */ = { isa = PBXGroup; children = ( + 53E7D32B2C1B00880025A1D3 /* Sources */, + 53D9D1BD2C1AF521004D1C1C /* LogoAnimationView */, + 53D9D1C12C1AF521004D1C1C /* MyExtention.swift */, 53EDED8F2C18387E00DB8DF9 /* CyclePagerView */, 53F21F932C1377B900172BFC /* Fonts */, 53014F4B2C11A8E80071CE39 /* CustomWeScan */, @@ -941,8 +992,10 @@ 5359841E2C14B835003EB6ED /* SearchFilesView.swift in Sources */, 53014FA02C11A8E80071CE39 /* MultiPageScanSession.swift in Sources */, 53014F9A2C11A8E80071CE39 /* CIImage+Utils.swift in Sources */, + 53D9D1C42C1AF521004D1C1C /* UIView+Constraints.swift in Sources */, 53CD5F5E2C1505EC0010424B /* UIWindow.swift in Sources */, EC8A9B17254DCC2900F9AF99 /* URL+Extensions.swift in Sources */, + 53D9D1C52C1AF521004D1C1C /* MyExtention.swift in Sources */, 535983F22C144E87003EB6ED /* Keys.swift in Sources */, EC70252C254E066400BE1958 /* SettingsViewController.swift in Sources */, EC0CF21D254D8F3900888722 /* String+Extensions.swift in Sources */, @@ -954,16 +1007,19 @@ 53014FAA2C11A8E80071CE39 /* Quadrilateral.swift in Sources */, 53EDED982C18387E00DB8DF9 /* TYCyclePagerTransformLayout.m in Sources */, 53014FA42C11A8E80071CE39 /* EditScanViewController.swift in Sources */, + 53E7D33C2C1B00880025A1D3 /* FSPagerCollectionView.swift in Sources */, EC8A9B1A254DCE3E00F9AF99 /* UIImage+Extensions.swift in Sources */, 53014FB72C11A8E80071CE39 /* CaptureDevice.swift in Sources */, 53014F8F2C11A8E80071CE39 /* RectangleFeaturesFunnel.swift in Sources */, 53014F932C11A8E80071CE39 /* PDFCreator.swift in Sources */, 539D1C852C164F85009DB24A /* CustomTabBarView.swift in Sources */, + 53E7D33B2C1B00880025A1D3 /* FSPagerViewObjcCompat.m in Sources */, EC702537254E1DE000BE1958 /* UIViewController+Extensions.swift in Sources */, 535983E92C1428D4003EB6ED /* UIColor+Extensions.swift in Sources */, 53014F972C11A8E80071CE39 /* AVCaptureVideoOrientation+Utils.swift in Sources */, 535983EF2C142C9F003EB6ED /* Localization.swift in Sources */, 53014F992C11A8E80071CE39 /* CGPoint+Utils.swift in Sources */, + 53E7D3392C1B00880025A1D3 /* FSPageViewLayout.swift in Sources */, 53014FA62C11A8E80071CE39 /* Error.swift in Sources */, 53014FA72C11A8E80071CE39 /* VisionRectangleDetector.swift in Sources */, 53BAE0ED2C15E0890072189E /* EditViewController.swift in Sources */, @@ -976,6 +1032,8 @@ 53014FA92C11A8E80071CE39 /* QuadrilateralView.swift in Sources */, 53CD5F562C1503150010424B /* BMViewController.swift in Sources */, EC702546254E1E9E00BE1958 /* WalkthroughModel.swift in Sources */, + 53D9D1C22C1AF521004D1C1C /* StickerView.swift in Sources */, + 53E7D3352C1B00880025A1D3 /* FSPagerView.swift in Sources */, 53014F912C11A8E80071CE39 /* ShutterButton.swift in Sources */, 53F21F8B2C1246AF00172BFC /* AllFolderTableViewCell.swift in Sources */, 53014FBD2C11A8E80071CE39 /* CaptureSession+Focus.swift in Sources */, @@ -991,7 +1049,9 @@ 53014FA32C11A8E80071CE39 /* ZoomGestureController.swift in Sources */, 53EDED962C18387E00DB8DF9 /* TYPageControl.m in Sources */, 53E3A2092C19D17100C9B95E /* PreviewImageViewController.swift in Sources */, + 53E7D3362C1B00880025A1D3 /* FSPageViewTransformer.swift in Sources */, EC70252A254E066400BE1958 /* SettingsViewController+Safari.swift in Sources */, + 53E7D3372C1B00880025A1D3 /* FSPagerViewCell.swift in Sources */, 53014F9B2C11A8E80071CE39 /* CGAffineTransform+Utils.swift in Sources */, 53014FBC2C11A8E80071CE39 /* CaptureSession.swift in Sources */, EC702542254E1E7500BE1958 /* ClassicWalkthroughViewController.swift in Sources */, @@ -1004,6 +1064,7 @@ 53014FB82C11A8E80071CE39 /* Transformable.swift in Sources */, 53014FA22C11A8E80071CE39 /* ScannedPageViewController.swift in Sources */, EC8A9B1D254DCEC600F9AF99 /* File.swift in Sources */, + 53E7D33A2C1B00880025A1D3 /* FSPageControl.swift in Sources */, EC8A9B24254DE72F00F9AF99 /* UIView+Extensions.swift in Sources */, EC0CF200254D8BBF00888722 /* SceneDelegate.swift in Sources */, 53014FBB2C11A8E80071CE39 /* CaptureSession+Orientation.swift in Sources */, @@ -1014,6 +1075,7 @@ 539D1C8B2C16E97F009DB24A /* ShareSheetViewController.swift in Sources */, 53014F962C11A8E80071CE39 /* ScannerViewController.swift in Sources */, 53014FA52C11A8E80071CE39 /* EditScanCornerView.swift in Sources */, + 53E7D3382C1B00880025A1D3 /* FSPagerViewLayoutAttributes.swift in Sources */, 53014F8E2C11A8E80071CE39 /* ImageScannerController.swift in Sources */, EC70252B254E066400BE1958 /* SettingsTableViewCell.swift in Sources */, 535983ED2C142B49003EB6ED /* UIFont+Extensions.swift in Sources */, diff --git a/MiniScanner.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/xcschememanagement.plist b/MiniScanner.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/xcschememanagement.plist index 9f3ce571c737d6556c0082dc8853026b4ace5a8f..3efba6c8f2248a00a4e7e15d0b784416f0d27c9b 100644 --- a/MiniScanner.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/MiniScanner.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ <key>MiniScanner.xcscheme_^#shared#^_</key> <dict> <key>orderHint</key> - <integer>9</integer> + <integer>8</integer> </dict> </dict> </dict> diff --git a/MiniScanner.xcworkspace/xcshareddata/swiftpm/Package.resolved b/MiniScanner.xcworkspace/xcshareddata/swiftpm/Package.resolved index 2a402b605b14368c643e5b8700661997e6c8722c..970347f9c4cde986e681c24f6957184e4320f099 100644 --- a/MiniScanner.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/MiniScanner.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,14 +1,16 @@ { - "pins" : [ - { - "identity" : "lnextensionexecutor", - "kind" : "remoteSourceControl", - "location" : "https://github.com/LeoNatan/LNExtensionExecutor.git", - "state" : { - "revision" : "16b741f659e344f4569c9f9d32ef2298ef0233ff", - "version" : "1.2.0" + "object": { + "pins": [ + { + "package": "LNExtensionExecutor", + "repositoryURL": "https://github.com/LeoNatan/LNExtensionExecutor.git", + "state": { + "branch": null, + "revision": "16b741f659e344f4569c9f9d32ef2298ef0233ff", + "version": "1.2.0" + } } - } - ], - "version" : 2 + ] + }, + "version": 1 } diff --git a/MiniScanner.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/UserInterfaceState.xcuserstate b/MiniScanner.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/UserInterfaceState.xcuserstate index 4ccd91bec66ee792ed7249cb0293bc785bf47de2..38a977e2d2b167a27acc1d8314705b731235324d 100644 Binary files a/MiniScanner.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/UserInterfaceState.xcuserstate and b/MiniScanner.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/MiniScanner.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/MiniScanner.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 6d52f9de97ee59c6d8f1e896e029bcdcfe42f2b3..216ee44a169a423c337b1cc8c733a132117605a0 100644 --- a/MiniScanner.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/MiniScanner.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -3,22 +3,4 @@ uuid = "270C854E-19C5-4254-A77F-7774BFB2FDA6" type = "0" version = "2.0"> - <Breakpoints> - <BreakpointProxy - BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> - <BreakpointContent - uuid = "781CC172-B153-4DD6-BA44-38196A7A37FD" - shouldBeEnabled = "Yes" - ignoreCount = "0" - continueAfterRunningActions = "No" - filePath = "MiniScanner/Modules/EditViewController/EditViewController.swift" - startingColumnNumber = "9223372036854775807" - endingColumnNumber = "9223372036854775807" - startingLineNumber = "239" - endingLineNumber = "239" - landmarkName = "saveFileAndShare(with:name:)" - landmarkType = "7"> - </BreakpointContent> - </BreakpointProxy> - </Breakpoints> </Bucket> diff --git a/MiniScanner/.DS_Store b/MiniScanner/.DS_Store index b70afdd5908417f48436ff71e03f67913f48e0de..6beef102e5d580989a74bd8ee08a491859ba95d7 100644 Binary files a/MiniScanner/.DS_Store and b/MiniScanner/.DS_Store differ diff --git a/MiniScanner/Extensions/.DS_Store b/MiniScanner/Extensions/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..90fd3d40cd3a786558f50de1cbb037ba8985620d Binary files /dev/null and b/MiniScanner/Extensions/.DS_Store differ diff --git a/MiniScanner/Extensions/LogoAnimationView/LogoAnimationView.swift b/MiniScanner/Extensions/LogoAnimationView/LogoAnimationView.swift new file mode 100755 index 0000000000000000000000000000000000000000..4da81a6928cd6de1577ea4bfb235fee4349ceb38 --- /dev/null +++ b/MiniScanner/Extensions/LogoAnimationView/LogoAnimationView.swift @@ -0,0 +1,8 @@ +// +// LogoAnimationView.swift +// AnimatedGifLaunchScreen-Example +// +// Created by Amer Hukic on 13/09/2018. +// Copyright © 2018 Amer Hukic. All rights reserved. +// + diff --git a/MiniScanner/Extensions/LogoAnimationView/StickerView.swift b/MiniScanner/Extensions/LogoAnimationView/StickerView.swift new file mode 100755 index 0000000000000000000000000000000000000000..7e407b26dcae14512932ab5fece8a712c73ae8fa --- /dev/null +++ b/MiniScanner/Extensions/LogoAnimationView/StickerView.swift @@ -0,0 +1,417 @@ +// +// StickerView.swift +// StickerView +// +// Created by Edgar Sia on 1/12/18. +// Copyright © 2018 Edgar Sia. All rights reserved. +// + +import UIKit + +enum StickerViewHandler:Int { + case close = 0 + case rotate + case flip +} + +enum StickerViewPosition:Int { + case topLeft = 0 + case topRight + case bottomLeft + case bottomRight +} + +@inline(__always) func CGRectGetCenter(_ rect:CGRect) -> CGPoint { + return CGPoint(x: rect.midX, y: rect.midY) +} + +@inline(__always) func CGRectScale(_ rect:CGRect, wScale:CGFloat, hScale:CGFloat) -> CGRect { + return CGRect(x: rect.origin.x, y: rect.origin.y, width: rect.size.width * wScale, height: rect.size.height * hScale) +} + +@inline(__always) func CGAffineTransformGetAngle(_ t:CGAffineTransform) -> CGFloat { + return atan2(t.b, t.a) +} + +@inline(__always) func CGPointGetDistance(point1:CGPoint, point2:CGPoint) -> CGFloat { + let fx = point2.x - point1.x + let fy = point2.y - point1.y + return sqrt(fx * fx + fy * fy) +} + +@objc protocol StickerViewDelegate { + @objc func stickerViewDidBeginMoving(_ stickerView: StickerView) + @objc func stickerViewDidChangeMoving(_ stickerView: StickerView) + @objc func stickerViewDidEndMoving(_ stickerView: StickerView) + @objc func stickerViewDidBeginRotating(_ stickerView: StickerView) + @objc func stickerViewDidChangeRotating(_ stickerView: StickerView) + @objc func stickerViewDidEndRotating(_ stickerView: StickerView) + @objc func stickerViewDidClose(_ stickerView: StickerView) + @objc func stickerViewDidTap(_ stickerView: StickerView) +} + +class StickerView: UIView { + var delegate: StickerViewDelegate! + /// The contentView inside the sticker view. + var contentView:UIView! + /// Enable the close handler or not. Default value is YES. + var enableClose:Bool = true { + didSet { + if self.showEditing { + self.setEnableClose(self.enableClose) + } + } + } + /// Enable the rotate/resize handler or not. Default value is YES. + var enableRotate:Bool = true{ + didSet { + if self.showEditing { + self.setEnableRotate(self.enableRotate) + } + } + } + /// Enable the flip handler or not. Default value is YES. + var enableFlip:Bool = true + /// Show close and rotate/resize handlers or not. Default value is YES. + var showEditing:Bool = true { + didSet { + if self.showEditing { + self.setEnableClose(self.enableClose) + self.setEnableRotate(self.enableRotate) + self.setEnableFlip(self.enableFlip) + self.contentView?.layer.borderWidth = 1 + } + else { + self.setEnableClose(false) + self.setEnableRotate(false) + self.setEnableFlip(false) + self.contentView?.layer.borderWidth = 0 + } + } + } + + /// Minimum value for the shorter side while resizing. Default value will be used if not set. + private var _minimumSize:NSInteger = 0 + var minimumSize:NSInteger { + set { + _minimumSize = max(newValue, self.defaultMinimumSize) + } + get { + return _minimumSize + } + } + /// Color of the outline border. Default: brown color. + private var _outlineBorderColor:UIColor = .clear + var outlineBorderColor:UIColor { + set { + _outlineBorderColor = newValue + self.contentView?.layer.borderColor = _outlineBorderColor.cgColor + } + get { + return _outlineBorderColor + } + } + /// A convenient property for you to store extra information. + var userInfo:Any? + + + init(contentView: UIView) { + self.defaultInset = 11 + self.defaultMinimumSize = 4 * self.defaultInset + + var frame = contentView.frame + frame = CGRect(x: 0, y: 0, width: frame.size.width + CGFloat(self.defaultInset) * 2, height: frame.size.height + CGFloat(self.defaultInset) * 2) + super.init(frame: frame) + self.backgroundColor = UIColor.clear + self.addGestureRecognizer(self.moveGesture) + self.addGestureRecognizer(self.tapGesture) + + // Setup content view + self.contentView = contentView + self.contentView.center = CGRectGetCenter(self.bounds) + self.contentView.isUserInteractionEnabled = false + self.contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + self.contentView.layer.allowsEdgeAntialiasing = true + self.addSubview(self.contentView) + + // Setup editing handlers + self.setPosition(.topLeft, forHandler: .close) + self.addSubview(self.closeImageView) + self.setPosition(.bottomRight, forHandler: .rotate) + self.addSubview(self.rotateImageView) + self.setPosition(.bottomLeft, forHandler: .flip) + self.addSubview(self.flipImageView) + + self.showEditing = true + self.enableClose = true + self.enableRotate = true + self.enableFlip = false + + self.minimumSize = self.defaultMinimumSize + self.outlineBorderColor = .white + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setImage(_ image:UIImage, forHandler handler:StickerViewHandler) { + switch handler { + case .close: + self.closeImageView.image = image + case .rotate: + self.rotateImageView.image = image + case .flip: + self.flipImageView.image = image + } + } + + func setPosition(_ position:StickerViewPosition, forHandler handler:StickerViewHandler) { + let origin = self.contentView.frame.origin + let size = self.contentView.frame.size + + var handlerView:UIImageView? + switch handler { + case .close: + handlerView = self.closeImageView + case .rotate: + handlerView = self.rotateImageView + case .flip: + handlerView = self.flipImageView + } + + switch position { + case .topLeft: + handlerView?.center = origin + handlerView?.autoresizingMask = [.flexibleRightMargin, .flexibleBottomMargin] + case .topRight: + handlerView?.center = CGPoint(x: origin.x + size.width, y: origin.y) + handlerView?.autoresizingMask = [.flexibleLeftMargin, .flexibleBottomMargin] + case .bottomLeft: + handlerView?.center = CGPoint(x: origin.x, y: origin.y + size.height) + handlerView?.autoresizingMask = [.flexibleRightMargin, .flexibleTopMargin] + case .bottomRight: + handlerView?.center = CGPoint(x: origin.x + size.width, y: origin.y + size.height) + handlerView?.autoresizingMask = [.flexibleLeftMargin, .flexibleTopMargin] + } + + handlerView?.tag = position.rawValue + } + + /** + * Customize handler's size + * + * @param size Handler's size + */ + func setHandlerSize(_ size:Int) { + if size <= 0 { + return + } + + self.defaultInset = NSInteger(round(Float(size) / 2)) + self.defaultMinimumSize = 4 * self.defaultInset + self.minimumSize = max(self.minimumSize, self.defaultMinimumSize) + + let originalCenter = self.center + let originalTransform = self.transform + var frame = self.contentView.frame + frame = CGRect(x: 0, y: 0, width: frame.size.width + CGFloat(self.defaultInset) * 2, height: frame.size.height + CGFloat(self.defaultInset) * 2) + + self.contentView.removeFromSuperview() + + self.transform = CGAffineTransform.identity + self.frame = frame + + self.contentView.center = CGRectGetCenter(self.bounds) + self.addSubview(self.contentView) + self.sendSubviewToBack(self.contentView) + + let handlerFrame = CGRect(x: 0, y: 0, width: self.defaultInset * 2, height: self.defaultInset * 2) + self.closeImageView.frame = handlerFrame + self.setPosition(StickerViewPosition(rawValue: self.closeImageView.tag)!, forHandler: .close) + self.rotateImageView.frame = handlerFrame + self.setPosition(StickerViewPosition(rawValue: self.rotateImageView.tag)!, forHandler: .rotate) + self.flipImageView.frame = handlerFrame + self.setPosition(StickerViewPosition(rawValue: self.flipImageView.tag)!, forHandler: .flip) + + self.center = originalCenter + self.transform = originalTransform + } + + /** + * Default value + */ + private var defaultInset:NSInteger + private var defaultMinimumSize:NSInteger + + /** + * Variables for moving view + */ + private var beginningPoint = CGPoint.zero + private var beginningCenter = CGPoint.zero + + /** + * Variables for rotating and resizing view + */ + private var initialBounds = CGRect.zero + private var initialDistance:CGFloat = 0 + private var deltaAngle:CGFloat = 0 + + private lazy var moveGesture = { + return UIPanGestureRecognizer(target: self, action: #selector(handleMoveGesture(_:))) + }() + private lazy var rotateImageView:UIImageView = { + let rotateImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 32, height: 32)) + rotateImageView.cornerRadiuss = 16 + rotateImageView.tintColor = UIColor.black + rotateImageView.contentMode = UIView.ContentMode.scaleAspectFill + rotateImageView.backgroundColor = UIColor.white + rotateImageView.isUserInteractionEnabled = true + rotateImageView.addGestureRecognizer(self.rotateGesture) + + return rotateImageView + }() + private lazy var rotateGesture = { + return UIPanGestureRecognizer(target: self, action: #selector(handleRotateGesture(_:))) + }() + private lazy var closeImageView:UIImageView = { + let closeImageview = UIImageView(frame: CGRect(x: 0, y: 0, width: 32, height: 32)) + closeImageview.cornerRadiuss = 16 + closeImageview.tintColor = UIColor.black + closeImageview.contentMode = UIView.ContentMode.scaleAspectFill + closeImageview.backgroundColor = UIColor.white + closeImageview.isUserInteractionEnabled = true + closeImageview.addGestureRecognizer(self.closeGesture) + return closeImageview + }() + private lazy var closeGesture = { + return UITapGestureRecognizer(target: self, action: #selector(handleCloseGesture(_:))) + }() + private lazy var flipImageView:UIImageView = { + let flipImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.defaultInset * 2, height: self.defaultInset * 2)) + flipImageView.contentMode = UIView.ContentMode.scaleAspectFit + flipImageView.backgroundColor = UIColor.clear + flipImageView.isUserInteractionEnabled = true + flipImageView.addGestureRecognizer(self.flipGesture) + return flipImageView + }() + private lazy var flipGesture = { + return UITapGestureRecognizer(target: self, action: #selector(handleFlipGesture(_:))) + }() + private lazy var tapGesture = { + return UITapGestureRecognizer(target: self, action: #selector(handleTapGesture(_:))) + }() + // MARK: - Gesture Handlers + @objc + func handleMoveGesture(_ recognizer: UIPanGestureRecognizer) { + let touchLocation = recognizer.location(in: self.superview) + switch recognizer.state { + case .began: + self.beginningPoint = touchLocation + self.beginningCenter = self.center + if let delegate = self.delegate { + delegate.stickerViewDidBeginMoving(self) + } + case .changed: + self.center = CGPoint(x: self.beginningCenter.x + (touchLocation.x - self.beginningPoint.x), y: self.beginningCenter.y + (touchLocation.y - self.beginningPoint.y)) + if let delegate = self.delegate { + delegate.stickerViewDidChangeMoving(self) + } + case .ended: + self.center = CGPoint(x: self.beginningCenter.x + (touchLocation.x - self.beginningPoint.x), y: self.beginningCenter.y + (touchLocation.y - self.beginningPoint.y)) + if let delegate = self.delegate { + delegate.stickerViewDidEndMoving(self) + } + default: + break + } + } + + @objc + func handleRotateGesture(_ recognizer: UIPanGestureRecognizer) { + let touchLocation = recognizer.location(in: self.superview) + let center = self.center + + switch recognizer.state { + case .began: + self.deltaAngle = CGFloat(atan2f(Float(touchLocation.y - center.y), Float(touchLocation.x - center.x))) - CGAffineTransformGetAngle(self.transform) + self.initialBounds = self.bounds + self.initialDistance = CGPointGetDistance(point1: center, point2: touchLocation) + if let delegate = self.delegate { + delegate.stickerViewDidBeginRotating(self) + } + case .changed: + let angle = atan2f(Float(touchLocation.y - center.y), Float(touchLocation.x - center.x)) + let angleDiff = Float(self.deltaAngle) - angle + self.transform = CGAffineTransform(rotationAngle: CGFloat(-angleDiff)) + + var scale = CGPointGetDistance(point1: center, point2: touchLocation) / self.initialDistance + let minimumScale = CGFloat(self.minimumSize) / min(self.initialBounds.size.width, self.initialBounds.size.height) + scale = max(scale, minimumScale) + let scaledBounds = CGRectScale(self.initialBounds, wScale: scale, hScale: scale) + self.bounds = scaledBounds + self.setNeedsDisplay() + + if let delegate = self.delegate { + delegate.stickerViewDidChangeRotating(self) + } + case .ended: + if let delegate = self.delegate { + delegate.stickerViewDidEndRotating(self) + } + default: + break + } + } + + @objc + func handleCloseGesture(_ recognizer: UITapGestureRecognizer) { + if let delegate = self.delegate { + delegate.stickerViewDidClose(self) + } + self.removeFromSuperview() + } + + @objc + func handleFlipGesture(_ recognizer: UITapGestureRecognizer) { + UIView.animate(withDuration: 0.3) { + self.contentView.transform = self.contentView.transform.scaledBy(x: -1, y: 1) + } + } + + @objc + func handleTapGesture(_ recognizer: UITapGestureRecognizer) { + if let delegate = self.delegate { + delegate.stickerViewDidTap(self) + } + } + + // MARK: - Private Methods + private func setEnableClose(_ enableClose:Bool) { + self.closeImageView.isHidden = !enableClose + self.closeImageView.isUserInteractionEnabled = enableClose + } + + private func setEnableRotate(_ enableRotate:Bool) { + self.rotateImageView.isHidden = !enableRotate + self.rotateImageView.isUserInteractionEnabled = enableRotate + } + + private func setEnableFlip(_ enableFlip:Bool) { + self.flipImageView.isHidden = !enableFlip + self.flipImageView.isUserInteractionEnabled = enableFlip + } +} + +extension StickerView: UIGestureRecognizerDelegate { + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { + /** + * ref: http://stackoverflow.com/questions/19095165/should-superviews-gesture-cancel-subviews-gesture-in-ios-7/ + * + * The `gestureRecognizer` would be either closeGestureRecognizer or rotateGestureRecognizer, + * `otherGestureRecognizer` should work only when `gestureRecognizer` is failed. + * So, we always return YES here. + */ + return true + } +} diff --git a/MiniScanner/Extensions/LogoAnimationView/UIView+Constraints.swift b/MiniScanner/Extensions/LogoAnimationView/UIView+Constraints.swift new file mode 100755 index 0000000000000000000000000000000000000000..992e1c7225745efa72d8e62dbefa87eea91cf943 --- /dev/null +++ b/MiniScanner/Extensions/LogoAnimationView/UIView+Constraints.swift @@ -0,0 +1,21 @@ +// +// UIView+Constraints.swift +// AnimatedGifLaunchScreen-Example +// +// Created by Amer Hukic on 13/09/2018. +// Copyright © 2018 Amer Hukic. All rights reserved. +// + +import UIKit + +extension UIView { + + func pinEdgesToSuperView() { + guard let superView = superview else { return } + translatesAutoresizingMaskIntoConstraints = false + topAnchor.constraint(equalTo: superView.topAnchor).isActive = true + leftAnchor.constraint(equalTo: superView.leftAnchor).isActive = true + bottomAnchor.constraint(equalTo: superView.bottomAnchor).isActive = true + rightAnchor.constraint(equalTo: superView.rightAnchor).isActive = true + } +} diff --git a/MiniScanner/Extensions/MyExtention.swift b/MiniScanner/Extensions/MyExtention.swift new file mode 100755 index 0000000000000000000000000000000000000000..2c3818914920947a0d9437c6e5acc1dcff51354d --- /dev/null +++ b/MiniScanner/Extensions/MyExtention.swift @@ -0,0 +1,791 @@ +import UIKit +import Foundation +import CoreLocation +import QuartzCore +import CoreGraphics +import SystemConfiguration +import TLPhotoPicker + +let SCREEN_WIDTH = UIScreen.main.bounds.width +let SCREEN_HEIGHT = UIScreen.main.bounds.height +let storyBoard = UIStoryboard.init(name: "Main", bundle: nil) +let appDelegate = UIApplication.shared.delegate as! AppDelegate + +let BANNER_ADID = "ca-app-pub-3940256099942544/2934735716" +let FULL_ADID = "ca-app-pub-3940256099942544/4411468910" +let APPOPENADID = "ca-app-pub-3940256099942544/5662855259" +let APP_NATIVE = "ca-app-pub-3940256099942544/3986624511" + +let appID = "app ID" +let devURL = "developer URL" +let Mail_ID = "support mail" +var RateURL : String = "app URL" + +var AppName = "Cam Scanner" +var PDFFileName = "FinalPDF" + +let ShadowColor = UIColor.init(named: "ShadowColor")! +let FontColor = UIColor.init(named: "FontColor")! +let BGColor = UIColor.init(named: "BGColor")! +let ThemeColor = UIColor.init(named: "ThemeColor")! + +var bottomPadding: CGFloat = UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0.0 +var topPadding: CGFloat = UIApplication.shared.keyWindow?.safeAreaInsets.top ?? 0.0 + +class MyFunc: NSObject +{ + func convertImageToBase64(image: UIImage) -> String { + let imageData = image.pngData()! + return imageData.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters) + } + + func convertBase64ToImage(imageString: String) -> UIImage { + let imageData = Data(base64Encoded: imageString, options: Data.Base64DecodingOptions.ignoreUnknownCharacters)! + return UIImage(data: imageData)! + } +} + +class UserDefaultMgr +{ + class func setSortType(strId: Int) + { + UserDefaults.standard.setValue(strId, forKey: "sortType") + UserDefaults.standard.synchronize() + } + class func getSortType() -> Int{ + if UserDefaults.standard.object(forKey: "sortType") == nil{ + return 0 + } + return UserDefaults.standard.value(forKey: "sortType") as! Int + } + + + class func getIsDoc4Time() -> Int{ + if UserDefaults.standard.object(forKey: "ad_DocCount") == nil{ + return 0 + } + return UserDefaults.standard.value(forKey: "ad_DocCount") as! Int + } + class func setIsDoc4Time(strId: Int) + { + UserDefaults.standard.setValue(strId, forKey: "ad_DocCount") + UserDefaults.standard.synchronize() + } + + class func getIsOCROneTime() -> Int{ + if UserDefaults.standard.object(forKey: "ad_OCRcount") == nil{ + return 0 + } + return UserDefaults.standard.value(forKey: "ad_OCRcount") as! Int + } + class func setIsOCROneTime(strId: Int) + { + UserDefaults.standard.setValue(strId, forKey: "ad_OCRcount") + UserDefaults.standard.synchronize() + } + + class func setIsChangeLayout(type: Bool){ + UserDefaults.standard.setValue(type, forKey: "isChangeLayout") + UserDefaults.standard.synchronize() + } + class func getIsChangeLayout() -> Bool{ + if UserDefaults.standard.object(forKey: "isChangeLayout") == nil{ + setIsChangeLayout(type: false) + return false + } + return UserDefaults.standard.value(forKey: "isChangeLayout") as! Bool + } + + class func setIsPasscode(type: Bool){ + UserDefaults.standard.setValue(type, forKey: "isPasscode") + UserDefaults.standard.synchronize() + } + + class func getIsPasscode() -> Bool{ + if UserDefaults.standard.object(forKey: "isPasscode") == nil{ + setIsPasscode(type: false) + return false + } + return UserDefaults.standard.value(forKey: "isPasscode") as! Bool + } + + class func setIsFaceID(type: Bool){ + UserDefaults.standard.setValue(type, forKey: "isFaceID") + UserDefaults.standard.synchronize() + } + + class func getIsFaceID() -> Bool{ + if UserDefaults.standard.object(forKey: "isFaceID") == nil{ + setIsFaceID(type: false) + return false + } + return UserDefaults.standard.value(forKey: "isFaceID") as! Bool + } + + + class func setIsTouchID(type: Bool){ + UserDefaults.standard.setValue(type, forKey: "isTouchID") + UserDefaults.standard.synchronize() + } + + class func getIsTouchID() -> Bool{ + if UserDefaults.standard.object(forKey: "isTouchID") == nil{ + setIsTouchID(type: false) + return false + } + return UserDefaults.standard.value(forKey: "isTouchID") as! Bool + } + +} + + +let aloaderSpinnerMarginSide : CGFloat = 35.0 +let aloaderSpinnerMarginTop : CGFloat = 20.0 +let aloaderTitleMargin : CGFloat = 5.0 + +let maxCount = 6 + + +open class ProcessLoader : UIView { + + fileprivate var coverView : UIView? + fileprivate var titleLabel : UILabel? + fileprivate var loadingView : SwiftLoadingView? + fileprivate var animated : Bool = true + fileprivate var canUpdated = false + fileprivate var title: String? + fileprivate var speed = 1 + + fileprivate var config : Config = Config() { + didSet { + self.loadingView?.config = config + } + } + + @objc func rotated(_ notification: Notification) { + + let loader = ProcessLoader.sharedInstance + + let height : CGFloat = UIScreen.main.bounds.size.height + let width : CGFloat = UIScreen.main.bounds.size.width + let center : CGPoint = CGPoint(x: width / 2.0, y: height / 2.0) + + loader.center = center + loader.coverView?.frame = UIScreen.main.bounds + } + + override open var frame : CGRect { + didSet { + self.update() + } + } + + class var sharedInstance: ProcessLoader { + struct Singleton { + static let instance = ProcessLoader(frame: CGRect(origin: CGPoint(x: 0,y: 0),size: CGSize(width: Config().size,height: Config().size))) + } + return Singleton.instance + } + + open class func show(animated: Bool) { + self.show(title: nil, animated: animated) + } + + open class func show(title: String?, animated : Bool) { + + let currentWindow : UIWindow = UIApplication.shared.keyWindow! + + let loader = ProcessLoader.sharedInstance + loader.canUpdated = true + loader.animated = animated + loader.title = title + loader.update() + + let height : CGFloat = UIScreen.main.bounds.size.height + let width : CGFloat = UIScreen.main.bounds.size.width + let center : CGPoint = CGPoint(x: width / 2.0, y: height / 2.0) + + loader.center = center + + if (loader.superview == nil) { + loader.coverView = UIView(frame: currentWindow.bounds) + loader.coverView?.backgroundColor = loader.config.foregroundColor.withAlphaComponent(loader.config.foregroundAlpha) + + currentWindow.addSubview(loader.coverView!) + currentWindow.addSubview(loader) + loader.start() + } + } + + open class func hide() { + + let loader = ProcessLoader.sharedInstance + NotificationCenter.default.removeObserver(loader) + + loader.stop() + } + + public class func setConfig(config : Config) { + let loader = ProcessLoader.sharedInstance + loader.config = config + loader.frame = CGRect(origin: CGPoint(x: 0, y: 0),size: CGSize(width: loader.config.size, height: loader.config.size)) + } + + private func setup() { + self.alpha = 0 + self.update() + } + + private func start() { + self.loadingView?.start() + + if (self.animated) { + UIView.animate(withDuration: 0.3, animations: { () -> Void in + self.alpha = 1 + }, completion: { (finished) -> Void in + + }); + } else { + self.alpha = 1 + } + } + + private func stop() { + + DispatchQueue.main.async { + if (self.animated) { + UIView.animate(withDuration: 0.3, animations: { () -> Void in + self.alpha = 0 + }, completion: { (finished) -> Void in + self.removeFromSuperview() + self.coverView?.removeFromSuperview() + self.loadingView?.stop() + }); + } else { + self.alpha = 0 + self.removeFromSuperview() + self.coverView?.removeFromSuperview() + self.loadingView?.stop() + } + } + } + + private func update() { + self.backgroundColor = self.config.backgroundColor + self.layer.cornerRadius = self.config.cornerRadius + let loadingViewSize = self.frame.size.width - (aloaderSpinnerMarginSide * 2) + + if (self.loadingView == nil) { + self.loadingView = SwiftLoadingView(frame: self.frameForSpinner()) + self.addSubview(self.loadingView!) + } else { + self.loadingView?.frame = self.frameForSpinner() + } + + if (self.titleLabel == nil) { + self.titleLabel = UILabel(frame: CGRect(origin: CGPoint(x: aloaderTitleMargin, y: aloaderSpinnerMarginTop + loadingViewSize), size: CGSize(width: self.frame.width - aloaderTitleMargin*2, height: 42.0))) + self.addSubview(self.titleLabel!) + self.titleLabel?.numberOfLines = 1 + self.titleLabel?.textAlignment = NSTextAlignment.center + self.titleLabel?.adjustsFontSizeToFitWidth = true + } else { + self.titleLabel?.frame = CGRect(origin: CGPoint(x: aloaderTitleMargin, y: aloaderSpinnerMarginTop + loadingViewSize), size: CGSize(width: self.frame.width - aloaderTitleMargin*2, height: 42.0)) + } + + self.titleLabel?.font = self.config.titleTextFont + self.titleLabel?.textColor = self.config.titleTextColor + self.titleLabel?.text = self.title + + self.titleLabel?.isHidden = self.title == nil + } + + func frameForSpinner() -> CGRect { + let loadingViewSize = self.frame.size.width - (aloaderSpinnerMarginSide * 2) + + if (self.title == nil) { + let yOffset = (self.frame.size.height - loadingViewSize) / 2 + return CGRect(origin: CGPoint(x: aloaderSpinnerMarginSide, y: yOffset), size: CGSize(width: loadingViewSize, height: loadingViewSize)) + } + return CGRect(origin: CGPoint(x: aloaderSpinnerMarginSide, y: aloaderSpinnerMarginTop), size: CGSize(width: loadingViewSize, height: loadingViewSize)) + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.setup() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + class SwiftLoadingView : UIView { + + fileprivate var speed : Int? + fileprivate var lineWidth : Float? + fileprivate var lineTintColor : UIColor? + fileprivate var backgroundLayer : CAShapeLayer? + fileprivate var isSpinning : Bool? + + var config : Config = Config() { + didSet { + self.update() + } + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.setup() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + func setup() { + self.backgroundColor = UIColor.clear + self.lineWidth = fmaxf(Float(self.frame.size.width) * 0.025, 1) + + self.backgroundLayer = CAShapeLayer() + self.backgroundLayer?.strokeColor = self.config.spinnerColor.cgColor + self.backgroundLayer?.fillColor = self.backgroundColor?.cgColor + self.backgroundLayer?.lineCap = CAShapeLayerLineCap.round + self.backgroundLayer?.lineWidth = CGFloat(self.lineWidth!) + self.layer.addSublayer(self.backgroundLayer!) + } + + func update() { + self.lineWidth = self.config.spinnerLineWidth + self.speed = self.config.speed + + self.backgroundLayer?.lineWidth = CGFloat(self.lineWidth!) + self.backgroundLayer?.strokeColor = self.config.spinnerColor.cgColor + } + + override func draw(_ rect: CGRect) { + self.backgroundLayer?.frame = self.bounds + } + + func drawBackgroundCircle(_ partial : Bool) { + let startAngle : CGFloat = .pi / CGFloat(2.0) + var endAngle : CGFloat = (2.0 * .pi) + startAngle + + let center : CGPoint = CGPoint(x: self.bounds.size.width / 2,y: self.bounds.size.height / 2) + let radius : CGFloat = (CGFloat(self.bounds.size.width) - CGFloat(self.lineWidth!)) / CGFloat(2.0) + + let processBackgroundPath : UIBezierPath = UIBezierPath() + processBackgroundPath.lineWidth = CGFloat(self.lineWidth!) + + if (partial) { + endAngle = (1.8 * .pi) + startAngle + } + + processBackgroundPath.addArc(withCenter: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true) + self.backgroundLayer?.path = processBackgroundPath.cgPath; + } + + func start() { + self.isSpinning? = true + self.drawBackgroundCircle(true) + + let rotationAnimation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") + rotationAnimation.toValue = NSNumber(value: .pi * 2.0) + rotationAnimation.duration = 1; + rotationAnimation.isCumulative = true; + rotationAnimation.repeatCount = HUGE; + self.backgroundLayer?.add(rotationAnimation, forKey: "rotationAnimation") + } + + func stop() { + self.drawBackgroundCircle(false) + self.backgroundLayer?.removeAllAnimations() + self.isSpinning? = false + } + } + + public struct Config { + public var size : CGFloat = 120.0 + public var spinnerColor = BGColor + public var spinnerLineWidth :Float = 1.0 + public var titleTextColor = UIColor.black + public var speed :Int = 1 + public var titleTextFont : UIFont = UIFont.boldSystemFont(ofSize: 16.0) + public var backgroundColor = FontColor + public var foregroundColor = UIColor.clear + public var foregroundAlpha:CGFloat = 0.0 + public var cornerRadius : CGFloat = 10.0 + public init() {} + } +} + +extension UIView { + + func roundCorners(corners: UIRectCorner, radius: CGFloat) { + let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) + let mask = CAShapeLayer() + mask.path = path.cgPath + layer.mask = mask + } + + func addShadow(offset: CGSize, color: UIColor, radius: CGFloat, opacity: Float) { + layer.masksToBounds = false + layer.shadowOffset = offset + layer.shadowColor = color.cgColor + layer.shadowRadius = radius + layer.shadowOpacity = opacity + + let backgroundCGColor = backgroundColor?.cgColor + backgroundColor = nil + layer.backgroundColor = backgroundCGColor + } + + + func addFixShadow() { + layer.masksToBounds = false + layer.shadowOffset = CGSize.init(width: 2.0, height: 2.0) + layer.shadowColor = ShadowColor.cgColor + layer.shadowRadius = 4.0 + layer.shadowOpacity = 0.5 + + let backgroundCGColor = backgroundColor?.cgColor + backgroundColor = nil + layer.backgroundColor = backgroundCGColor + } +} + +extension Array { + mutating func remove(at indexes: [Int]) { + for index in indexes.sorted(by: >) { + remove(at: index) + } + } +} + +extension Sequence where Element: Hashable { + func uniqued() -> [Element] { + var set = Set<Element>() + return filter { set.insert($0).inserted } + } +} + +extension UIViewController { + + func showAlertWithTitle( alertTitle : String , msg:String ) + { + let alert = UIAlertController(title:alertTitle, message: msg, preferredStyle: .alert) + let action = UIAlertAction(title: "OK", style: .cancel, handler: nil) + alert.addAction(action) + self.present(alert, animated: true, completion: nil) + + } + + func OpenPhotosPicker(_ self : UIViewController){ + + let TLController = TLPhotosPickerViewController() + TLController.delegate = self as? TLPhotosPickerViewControllerDelegate + TLController.didExceedMaximumNumberOfSelection = { [weak self] (picker) in + + let alert = UIAlertController(title: "", message: "Exceed Maximum Number Of Selection", preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil)) + self!.present(alert, animated: true, completion: nil) + } + + var configure = TLPhotosPickerConfigure() + configure.numberOfColumn = 3 + configure.usedCameraButton = false + configure.mediaType = .image + configure.maxSelectedAssets = 50 + TLController.configure = configure + TLController.selectedAssets.removeAll() + TLController.logDelegate = self as? TLPhotosPickerLogDelegate + + if let popoverController = TLController.popoverPresentationController { + popoverController.sourceView = self.view + popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0) + } + TLController.modalPresentationStyle = .fullScreen + self.present(TLController, animated: true, completion: nil) + } +} + + +extension UIApplication +{ + class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { + if let navigationController = controller as? UINavigationController { + return topViewController(controller: navigationController.visibleViewController) + } + if let tabController = controller as? UITabBarController { + if let selected = tabController.selectedViewController { + return topViewController(controller: selected) + } + } + if let presented = controller?.presentedViewController { + return topViewController(controller: presented) + } + return controller + } + + class func getTopViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { + + if let nav = base as? UINavigationController { + return getTopViewController(base: nav.visibleViewController) + + } else if let tab = base as? UITabBarController, let selected = tab.selectedViewController { + return getTopViewController(base: selected) + + } else if let presented = base?.presentedViewController { + return getTopViewController(base: presented) + } + return base + } +} + + +extension UIColor { + + public convenience init?(hexString: String) { + var cString: String = hexString.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased() + + if (cString.hasPrefix("#")) { + if let range = cString.range(of: cString) { + cString = cString.substring(from: cString.index(range.lowerBound, offsetBy: 1)) + } + } + + if ((cString.count) != 6) { + self.init(white: 0.2, alpha: 1) + return + } + + var rgbValue: UInt32 = 0 + Scanner(string: cString).scanHexInt32(&rgbValue) + + self.init( + red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, + green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0, + blue: CGFloat(rgbValue & 0x0000FF) / 255.0, + alpha: CGFloat(1.0) + ) + } +} + +extension UIView { + + var height:CGFloat{return self.bounds.size.height} + var width:CGFloat{return self.bounds.size.width} + var x:CGFloat{return self.frame.origin.x} + var y:CGFloat{return self.frame.origin.y} + + func MoveToXwithDuration(toX:CGFloat,duration:Double) { + UIView.animate(withDuration: duration) { + self.frame.origin.x = toX + } + } + + func MoveToYwithDuration(toY:CGFloat,duration:Double) { + + UIView.animate(withDuration: duration) { + self.frame.origin.y = toY + } + } + + @IBInspectable + var cornerRadiuss: CGFloat { + get { + return layer.cornerRadius + } + set { + layer.cornerRadius = newValue + } + } + + @IBInspectable + var borderWidth: CGFloat { + get + { + return layer.borderWidth + } + set + { + layer.borderWidth = newValue + } + } + + @IBInspectable + var borderColor: UIColor? { + get { + if let color = layer.borderColor { + return UIColor(cgColor: color) + } + return nil + } + set { + if let color = newValue { + layer.borderColor = color.cgColor + } else { + layer.borderColor = nil + } + } + } + + //FIND The parent view from UIVIEW + var parentViewController: UIViewController? { + var parentResponder: UIResponder? = self + while parentResponder != nil { + parentResponder = parentResponder!.next + if let viewController = parentResponder as? UIViewController { + return viewController + } + } + return nil + } + + func TakeScreenshot() -> UIImage { + + UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.main.scale) + drawHierarchy(in: self.bounds, afterScreenUpdates: true) + let image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + if (image != nil) + { + return image! + } + return UIImage() + } +} + +extension Int +{ + var FloatValue:CGFloat{return CGFloat(self)} + var DoubleValue:Double{return Double(self)} +} + + +extension UIImage{ + + var height:CGFloat{return self.size.height} + var width:CGFloat{return self.size.width} + + func resizeImage(targetSize: CGSize) -> UIImage? { + let size = self.size + + let widthRatio = targetSize.width / size.width + let heightRatio = targetSize.height / size.height + + // Figure out what our orientation is, and use that to form the rectangle + var newSize: CGSize + if(widthRatio > heightRatio) { + newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio) + } else { + newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio) + } + + // This is the rect that we've calculated out and this is what is actually used below + let rect = CGRect(origin: .zero, size: newSize) + + // Actually do the resizing to the rect using the ImageContext stuff + UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0) + self.draw(in: rect) + let newImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + return newImage + } + + func BlurImage(value:NSNumber) -> UIImage { + + let context = CIContext(options: [CIContextOption.useSoftwareRenderer:true]) + let CIImage = CoreImage.CIImage(image:self) + let blurFilter = CIFilter(name: "CIGaussianBlur") + blurFilter?.setValue(CIImage, forKey: kCIInputImageKey) + blurFilter?.setValue(value, forKey: "inputRadius") + let imageRef = context.createCGImage((blurFilter?.outputImage)!, from: (CIImage?.extent)!) + + let newImage = UIImage(cgImage:imageRef!) + return newImage + } + + func fixImageOrientation()->UIImage { + UIGraphicsBeginImageContext(self.size) + self.draw(at: .zero) + let newImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return newImage ?? self + } +} + +extension String +{ + var toInteger:Int?{ + get{ + return Int(self) + } + } + + var toDouble:Double?{ + get{ + return Double(self) + } + } + + var toFloat:Float?{ + get{ + return Float(self) + } + } + + var toBool:Bool?{ + get + { + if self == "1" + { + return "1" == self ? true : false + } + return "true" == self ? true : false + } + } +} + +extension CGFloat +{ + var toInt:Int?{ + get{ + return Int(self) + } + } +} + + +struct ImageHeaderData{ + static var PNG: [UInt8] = [0x89] + static var JPEG: [UInt8] = [0xFF] + static var GIF: [UInt8] = [0x47] + static var TIFF_01: [UInt8] = [0x49] + static var TIFF_02: [UInt8] = [0x4D] +} + +enum ImageFormat{ + case Unknown, PNG, JPEG, GIF, TIFF +} + + +extension NSData{ + var imageFormat: ImageFormat{ + var buffer = [UInt8](repeating: 0, count: 1) + self.getBytes(&buffer, range: NSRange(location: 0,length: 1)) + if buffer == ImageHeaderData.PNG + { + return .PNG + } else if buffer == ImageHeaderData.JPEG + { + return .JPEG + } else if buffer == ImageHeaderData.GIF + { + return .GIF + } else if buffer == ImageHeaderData.TIFF_01 || buffer == ImageHeaderData.TIFF_02{ + return .TIFF + } else{ + return .Unknown + } + } +} diff --git a/MiniScanner/Modules/EditViewController/CustomCells/PagerImageCollectionViewCell/PagerImageCollectionViewCell.swift b/MiniScanner/Modules/EditViewController/CustomCells/PagerImageCollectionViewCell/PagerImageCollectionViewCell.swift index ea9c7aed9450537cb10906da64f6e51d5e5f2867..8c2661fbd93403262eec53af8e931693e7339111 100644 --- a/MiniScanner/Modules/EditViewController/CustomCells/PagerImageCollectionViewCell/PagerImageCollectionViewCell.swift +++ b/MiniScanner/Modules/EditViewController/CustomCells/PagerImageCollectionViewCell/PagerImageCollectionViewCell.swift @@ -7,7 +7,6 @@ // import UIKit -import FSPagerView class PagerImageCollectionViewCell: UICollectionViewCell { // MARK: - Outlets @IBOutlet weak var cellImageView: UIImageView! diff --git a/MiniScanner/Modules/EditViewController/CustomViews/BannerView.swift b/MiniScanner/Modules/EditViewController/CustomViews/BannerView.swift index ce494343296135fcf145f7fc675072b1c5918587..41973314973ba995f15dcf0858d84afa2d23a6d9 100644 --- a/MiniScanner/Modules/EditViewController/CustomViews/BannerView.swift +++ b/MiniScanner/Modules/EditViewController/CustomViews/BannerView.swift @@ -7,12 +7,12 @@ // import UIKit -import FSPagerView protocol BannerViewDelegate { func updateSelectedIndex(index: Int) func delete(index: Int) func preview(index: Int) + func update(session: MultiPageScanSession?) } class BannerView: UIView { @@ -28,6 +28,10 @@ class BannerView: UIView { } } + var signatureImage: UIImage! + var signAllDoc: Bool = false + var donePressed: Bool = false + var isEditing: Bool = false fileprivate let transformerTypes: [FSPagerViewTransformerType] = [.crossFading, .zoomOut, .depth, @@ -37,6 +41,7 @@ class BannerView: UIView { .invertedFerrisWheel, .coverFlow, .cubic] + var options:ImageScannerOptions! fileprivate var typeIndex = 0 { didSet { @@ -67,7 +72,7 @@ class BannerView: UIView { // MARK: - Properties - var scanSession:MultiPageScanSession? + var scanSession: MultiPageScanSession? // MARK: - Init @@ -101,7 +106,7 @@ class BannerView: UIView { // MARK: - Methods private func clearUI() { view.backgroundColor = .clear - + self.options = ImageScannerOptions() } @@ -110,6 +115,28 @@ class BannerView: UIView { self.scanSession = session clearUI() } + func reloadSignature(with : UIImage, isAll: Bool = false) { + self.signatureImage = with + self.signAllDoc = isAll + pagerView.reloadData() + } + + func saveSignarure() { + donePressed = true + let cell = pagerView.cellForItem(at: pagerView.currentIndex) + cell?.selectedStickerView1?.showEditing = false + let image = cell?.contentView.TakeScreenshot() + cell?.selectedStickerView1?.removeFromSuperview() + self.scanSession?.remove(index: pagerView.currentIndex) + + let scannedItem = ScannedItem(originalImage: image ?? UIImage(), quad: nil) + scannedItem.colorOption = self.options.defaultColorRenderOption + scannedItem.rotation = 180 + scannedItem.render { (_) in } + self.scanSession?.add(item: scannedItem, at: pagerView.currentIndex) + cell?.imageView?.image = image + delegate?.update(session: self.scanSession) + } } @@ -122,16 +149,30 @@ extension BannerView: FSPagerViewDataSource,FSPagerViewDelegate { let cell = pagerView.dequeueReusableCell(withReuseIdentifier: "cell", at: index) cell.index = index cell.delegate = self + if let item = scanSession?.scannedItems[index] { cell.imageView?.image = item.renderedImage?.retrieveImage() } + if isEditing { + if signAllDoc { + if cell.sign == nil { + cell.sign = signatureImage + } + } else { + if index == pagerView.currentIndex { + if cell.sign == nil { + cell.sign = signatureImage + } + } + } + } + return cell } func pagerViewWillEndDragging(_ pagerView: FSPagerView, targetIndex: Int) { delegate?.updateSelectedIndex(index: targetIndex) } - } extension BannerView: FSPagerViewCellDelegate { diff --git a/MiniScanner/Modules/EditViewController/CustomViews/BannerView.xib b/MiniScanner/Modules/EditViewController/CustomViews/BannerView.xib index e6de6b7f598157416ae3212aea485db6f5acadf3..e2b0840d55ea0a032afbba06d36979f788a57927 100644 --- a/MiniScanner/Modules/EditViewController/CustomViews/BannerView.xib +++ b/MiniScanner/Modules/EditViewController/CustomViews/BannerView.xib @@ -20,7 +20,7 @@ <rect key="frame" x="0.0" y="0.0" width="393" height="645"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> - <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Qub-hE-fqd" customClass="FSPagerView" customModule="FSPagerView"> + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Qub-hE-fqd" customClass="FSPagerView" customModule="MiniScanner" customModuleProvider="target"> <rect key="frame" x="0.0" y="0.0" width="393" height="645"/> <color key="backgroundColor" systemColor="systemBackgroundColor"/> </view> diff --git a/MiniScanner/Modules/EditViewController/EditViewController.swift b/MiniScanner/Modules/EditViewController/EditViewController.swift index 8b133e5f1bc0dd5f64a6f13f37f4ea450fbe098d..04f7f75fee73b6027ca33d3790039965f278825c 100644 --- a/MiniScanner/Modules/EditViewController/EditViewController.swift +++ b/MiniScanner/Modules/EditViewController/EditViewController.swift @@ -11,6 +11,7 @@ import LNExtensionExecutor import NBBottomSheet import QuickLook import AVKit +import EPSignature public protocol EditViewControllerDelegate: NSObjectProtocol { func editViewController(_ editViewController: EditViewController, finished session: MultiPageScanSession) @@ -32,7 +33,10 @@ public class EditViewController: UIViewController { var selectedFolder: AppConfigurator.Folder? private var localFileManager: LocalFileManager? private var fileURL: URL? + var options:ImageScannerOptions! + var signatureImage = UIImage() + var isAll: Bool = false lazy private var activityIndicator: UIActivityIndicatorView = { let activityIndicator = UIActivityIndicatorView(style: .large) activityIndicator.color = .white @@ -41,8 +45,6 @@ public class EditViewController: UIViewController { return activityIndicator }() - - // MARK: - LifeCycle public override func viewDidLoad() { super.viewDidLoad() @@ -57,7 +59,32 @@ public class EditViewController: UIViewController { continueButton.setTitleColor(.white, for: .normal) continueButton.layer.cornerRadius = 10 localFileManager = LocalFileManager() - + options = ImageScannerOptions() + } + + @objc func onTouchDoneButton() { + self.banner.donePressed = true + if let items = scanSession?.scannedItems { + let cell = banner.pagerView.cellForItemat(index: self.banner.pagerView.currentIndex) + cell?.selectedStickerView1?.showEditing = false + + cell?.trashButton.isHidden = true + cell?.previewButton.isHidden = true + let image = cell?.contentView.TakeScreenshot() + cell?.trashButton.isHidden = false + cell?.previewButton.isHidden = false + cell?.selectedStickerView1?.removeFromSuperview() + + if let img = image { + let scannedItem = ScannedItem(originalImage: img, renderImage: img, quad: nil) + scannedItem.colorOption = self.options.defaultColorRenderOption + scannedItem.rotation = 180 + self.scanSession = self.scanSession?.replaceAndGet(item: scannedItem, at: banner.pagerView.currentIndex) + self.banner.scanSession = self.scanSession + self.banner.pagerView.reloadData() + updatePageLabel() + } + } } @IBAction func backIndex(_ sender: UIButton) { @@ -94,7 +121,7 @@ public class EditViewController: UIViewController { let configuration = NBBottomSheetConfiguration(animationDuration: 0.4, sheetSize: .fixed(322)) let bottomSheetController = NBBottomSheetController(configuration: configuration) - bottomSheetController.present(popup, on: self) + bottomSheetController.present(popup, on: self) } public init(scanSession: MultiPageScanSession){ @@ -175,7 +202,7 @@ public class EditViewController: UIViewController { self.present(shareController, animated: true, completion: nil) self.activityIndicator.stopAnimating() } - + } // MARK: - TABBAR ACTION @@ -183,10 +210,20 @@ public class EditViewController: UIViewController { } + @IBAction func signatureTapped(_ sender: UIButton) { + let signatureVC = EPSignatureViewController(signatureDelegate: self, showsDate: true, showsSaveSignatureOption: true) + let nav = UINavigationController(rootViewController: signatureVC) + nav.modalPresentationStyle = .fullScreen + self.present(nav, animated: true, completion: nil) + } } // MARK: - BannerViewDelegate extension EditViewController: BannerViewDelegate { + func update(session: MultiPageScanSession?) { + self.scanSession = session + } + func preview(index: Int) { let previewController = PreviewImageViewController() if let image = scanSession?.scannedItems[index].renderedImage?.retrieveImage() { @@ -197,7 +234,7 @@ extension EditViewController: BannerViewDelegate { func delete(index: Int) { let alertController = UIAlertController(title: "Alert", message: "Are you sure you want to delete this image?", preferredStyle: .alert) - + let okAction = UIAlertAction(title: "Yes", style: .default) { (action) in self.scanSession?.remove(index: index) if index != 0 { @@ -215,11 +252,11 @@ extension EditViewController: BannerViewDelegate { } self.dismiss(animated: true) } - + let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (action) in self.dismiss(animated: true) } - + alertController.addAction(okAction) alertController.addAction(cancelAction) self.present(alertController, animated: true, completion: nil) @@ -232,7 +269,7 @@ extension EditViewController: BannerViewDelegate { private func saveFileAndShare(with: String, name: String) { activityIndicator.startAnimating() - + var images = [URL]() for index in 0..<(scanSession?.scannedItems.count ?? 0) { if let url = scanSession?.scannedItems[index].renderedImage { @@ -269,7 +306,7 @@ extension EditViewController: ShareSheetViewControllerDelegate { DispatchQueue.main.async { self.saveFileAndShare(with: ShareOptions.gmail, name: name) } - + } func printTapped() { @@ -303,8 +340,8 @@ extension EditViewController: ShareSheetViewControllerDelegate { let shareController = UIActivityViewController(activityItems: self.payload, applicationActivities: nil) self.present(shareController, animated: true, completion: nil) self.activityIndicator.stopAnimating() - - + + }) } } @@ -318,7 +355,7 @@ extension EditViewController: ShareSheetViewControllerDelegate { } } print("images: \(images)") - if let folder = selectedFolder { + if let folder = selectedFolder { PDFManager.createMultiPDFPage(from: images, localFileManager: localFileManager, folder: folder, name: name, { self.activityIndicator.stopAnimating() self.navigationController?.popViewController(animated: true) @@ -337,3 +374,48 @@ extension EditViewController: QLPreviewControllerDataSource { return fileURL! as QLPreviewItem } } + +// MARK: - EPSignatureDelegate +extension EditViewController: EPSignatureDelegate { + public func epSignature(_: EPSignatureViewController, didCancel error : NSError) { + print("User canceled") + } + + public func epSignature(_: EPSignatureViewController, didSign signatureImage : UIImage, boundingRect: CGRect) { + self.dismiss(animated: true) { + self.banner.donePressed = false + self.banner.isEditing = true + self.signatureImage = signatureImage + let alertController = UIAlertController(title: "", message: "Do you want to sign:", preferredStyle: .alert) + + let allAction = UIAlertAction(title: "All document", style: .default) { (action) in + self.banner.signatureImage = signatureImage + self.banner.signAllDoc = true + self.banner.pagerView.reloadData() + + let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: #selector(self.onTouchDoneButton)) + self.navigationItem.rightBarButtonItem = doneButton + self.dismiss(animated: true) + } + + let currentAction = UIAlertAction(title: "Current page", style: .default) { (action) in + self.banner.signatureImage = signatureImage + self.banner.signAllDoc = false + self.banner.pagerView.reloadData() + + let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: #selector(self.onTouchDoneButton)) + self.navigationItem.rightBarButtonItem = doneButton + self.dismiss(animated: true) + } + let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (action) in + self.banner.isEditing = false + self.dismiss(animated: true) + } + + alertController.addAction(allAction) + alertController.addAction(currentAction) + alertController.addAction(cancelAction) + self.present(alertController, animated: true, completion: nil) + } + } +} diff --git a/MiniScanner/Modules/EditViewController/EditViewController.xib b/MiniScanner/Modules/EditViewController/EditViewController.xib index 5c2a541515f55bc00c50b6a1d78aca991b2c3878..f6ecf3ffeadd5a7669cea41c140ddaeb319c70e1 100644 --- a/MiniScanner/Modules/EditViewController/EditViewController.xib +++ b/MiniScanner/Modules/EditViewController/EditViewController.xib @@ -99,7 +99,7 @@ </constraints> </view> <label opaque="NO" userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Direct Share" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Kl7-O6-xwc"> - <rect key="frame" x="166" y="13" width="98.333333333333314" height="22"/> + <rect key="frame" x="171" y="13" width="88.333333333333314" height="22"/> <fontDescription key="fontDescription" name="Poppins-Medium" family="Poppins" pointSize="16"/> <nil key="textColor"/> <nil key="highlightedColor"/> @@ -228,6 +228,9 @@ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="1gC-XS-O2e"> <rect key="frame" x="0.0" y="0.0" width="82" height="90"/> <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> + <connections> + <action selector="signatureTapped:" destination="-1" eventType="touchUpInside" id="oKV-wj-LNT"/> + </connections> </button> </subviews> <color key="backgroundColor" systemColor="systemBackgroundColor"/> @@ -288,7 +291,7 @@ </constraints> </imageView> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="edit" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qsI-va-wrT"> - <rect key="frame" x="0.0" y="52" width="82" height="24"/> + <rect key="frame" x="0.0" y="52" width="82" height="20"/> <fontDescription key="fontDescription" name="Poppins-Regular" family="Poppins" pointSize="17"/> <nil key="textColor"/> <nil key="highlightedColor"/> diff --git a/MiniScanner/Supporting Files/.DS_Store b/MiniScanner/Supporting Files/.DS_Store index 4305f7734bae3905870154284d7bffee466c2663..c2fa1916ae96cee75a48220af50e8511e972e506 100644 Binary files a/MiniScanner/Supporting Files/.DS_Store and b/MiniScanner/Supporting Files/.DS_Store differ diff --git a/MiniScanner/Supporting Files/Assets.xcassets/close.imageset/Contents.json b/MiniScanner/Supporting Files/Assets.xcassets/close.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..acb0efb273c620cd8d940b78dc60a4754c4198a4 --- /dev/null +++ b/MiniScanner/Supporting Files/Assets.xcassets/close.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "close.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MiniScanner/Supporting Files/Assets.xcassets/close.imageset/close.png b/MiniScanner/Supporting Files/Assets.xcassets/close.imageset/close.png new file mode 100644 index 0000000000000000000000000000000000000000..97b961b4d8697e22a5b53dd3e5124af5c850acfb Binary files /dev/null and b/MiniScanner/Supporting Files/Assets.xcassets/close.imageset/close.png differ diff --git a/MiniScanner/Supporting Files/Assets.xcassets/resize.imageset/Contents.json b/MiniScanner/Supporting Files/Assets.xcassets/resize.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..c83c48dbae9e74cfd8d6d417e0b129c42c2782fe --- /dev/null +++ b/MiniScanner/Supporting Files/Assets.xcassets/resize.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "resize.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MiniScanner/Supporting Files/Assets.xcassets/resize.imageset/resize.png b/MiniScanner/Supporting Files/Assets.xcassets/resize.imageset/resize.png new file mode 100644 index 0000000000000000000000000000000000000000..911f9384ea8897e410975ab8632a475ce2d60d2d Binary files /dev/null and b/MiniScanner/Supporting Files/Assets.xcassets/resize.imageset/resize.png differ diff --git a/MiniScanner/Supporting Files/CustomWeScan/MultiPageSession/MultiPageScanSession.swift b/MiniScanner/Supporting Files/CustomWeScan/MultiPageSession/MultiPageScanSession.swift index 86039cf7c84fca24565b6472bff397904dc9562f..fbc9168b7adacb89e6651e190d4ca7f7b518eb51 100644 --- a/MiniScanner/Supporting Files/CustomWeScan/MultiPageSession/MultiPageScanSession.swift +++ b/MiniScanner/Supporting Files/CustomWeScan/MultiPageSession/MultiPageScanSession.swift @@ -38,6 +38,13 @@ public class ScannedItem{ self.colorOption = colorOption } + public init(originalImage:UIImage, renderImage: UIImage, quad:Quadrilateral? = nil, colorOption:ScannedItemColorOption = .color) { + self.originalImage = filePath().saveImage(image: originalImage.withFixedOrientation()) + self.quad = quad + self.colorOption = colorOption + self.renderedImage = filePath().saveImage(image: renderImage.withFixedOrientation()) + } + public func render(completion: @escaping (_ image:URL?)->Void){ ScannedItemRenderer().render(scannedItem: self) { (image) in self.renderedImage = self.filePath().saveImage(image: image?.withFixedOrientation()) @@ -62,10 +69,27 @@ public class MultiPageScanSession { self.scannedItems.append(item) } + public func add(item: ScannedItem, at: Int) { + self.scannedItems.insert(item, at: at) + } + public func remove(index:Int){ self.scannedItems.remove(at: index) } + public func replace(with item: ScannedItem, at: Int) { + if (scannedItems.indices.contains(at)) == true { + scannedItems[at] = item + } + } + + public func replaceAndGet(item: ScannedItem, at: Int) -> MultiPageScanSession{ + if (scannedItems.indices.contains(at)) == true { + scannedItems[at] = item + } + return self + } + } extension ScannedItem { diff --git a/MiniScanner/Supporting Files/Info.plist b/MiniScanner/Supporting Files/Info.plist index 328f2afed01ac7cf3631aaaf230308523caa91a7..7648ba4f28faf911acce826c4c1f60d66ca46c07 100644 --- a/MiniScanner/Supporting Files/Info.plist +++ b/MiniScanner/Supporting Files/Info.plist @@ -70,12 +70,5 @@ <array> <string>UIInterfaceOrientationPortrait</string> </array> - <key>UISupportedInterfaceOrientations~ipad</key> - <array> - <string>UIInterfaceOrientationLandscapeLeft</string> - <string>UIInterfaceOrientationLandscapeRight</string> - <string>UIInterfaceOrientationPortrait</string> - <string>UIInterfaceOrientationPortraitUpsideDown</string> - </array> </dict> </plist> diff --git a/MiniScanner/Supporting Files/LogoAnimationView/.DS_Store b/MiniScanner/Supporting Files/LogoAnimationView/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 Binary files /dev/null and b/MiniScanner/Supporting Files/LogoAnimationView/.DS_Store differ diff --git a/MiniScanner/Supporting Files/LogoAnimationView/StickerView.swift b/MiniScanner/Supporting Files/LogoAnimationView/StickerView.swift new file mode 100755 index 0000000000000000000000000000000000000000..e07326b40f709b2894eb64913b2cb6c53d2cae90 --- /dev/null +++ b/MiniScanner/Supporting Files/LogoAnimationView/StickerView.swift @@ -0,0 +1,417 @@ +// +// StickerView.swift +// StickerView +// +// Created by Edgar Sia on 1/12/18. +// Copyright © 2018 Edgar Sia. All rights reserved. +// + +import UIKit + +enum StickerViewHandler:Int { + case close = 0 + case rotate + case flip +} + +enum StickerViewPosition:Int { + case topLeft = 0 + case topRight + case bottomLeft + case bottomRight +} + +@inline(__always) func CGRectGetCenter(_ rect:CGRect) -> CGPoint { + return CGPoint(x: rect.midX, y: rect.midY) +} + +@inline(__always) func CGRectScale(_ rect:CGRect, wScale:CGFloat, hScale:CGFloat) -> CGRect { + return CGRect(x: rect.origin.x, y: rect.origin.y, width: rect.size.width * wScale, height: rect.size.height * hScale) +} + +@inline(__always) func CGAffineTransformGetAngle(_ t:CGAffineTransform) -> CGFloat { + return atan2(t.b, t.a) +} + +@inline(__always) func CGPointGetDistance(point1:CGPoint, point2:CGPoint) -> CGFloat { + let fx = point2.x - point1.x + let fy = point2.y - point1.y + return sqrt(fx * fx + fy * fy) +} + +@objc protocol StickerViewDelegate { + @objc func stickerViewDidBeginMoving(_ stickerView: StickerView) + @objc func stickerViewDidChangeMoving(_ stickerView: StickerView) + @objc func stickerViewDidEndMoving(_ stickerView: StickerView) + @objc func stickerViewDidBeginRotating(_ stickerView: StickerView) + @objc func stickerViewDidChangeRotating(_ stickerView: StickerView) + @objc func stickerViewDidEndRotating(_ stickerView: StickerView) + @objc func stickerViewDidClose(_ stickerView: StickerView) + @objc func stickerViewDidTap(_ stickerView: StickerView) +} + +open class StickerView: UIView { + var delegate: StickerViewDelegate! + /// The contentView inside the sticker view. + var contentView:UIView! + /// Enable the close handler or not. Default value is YES. + var enableClose:Bool = true { + didSet { + if self.showEditing { + self.setEnableClose(self.enableClose) + } + } + } + /// Enable the rotate/resize handler or not. Default value is YES. + var enableRotate:Bool = true{ + didSet { + if self.showEditing { + self.setEnableRotate(self.enableRotate) + } + } + } + /// Enable the flip handler or not. Default value is YES. + var enableFlip:Bool = true + /// Show close and rotate/resize handlers or not. Default value is YES. + var showEditing:Bool = true { + didSet { + if self.showEditing { + self.setEnableClose(self.enableClose) + self.setEnableRotate(self.enableRotate) + self.setEnableFlip(self.enableFlip) + self.contentView?.layer.borderWidth = 1 + } + else { + self.setEnableClose(false) + self.setEnableRotate(false) + self.setEnableFlip(false) + self.contentView?.layer.borderWidth = 0 + } + } + } + + /// Minimum value for the shorter side while resizing. Default value will be used if not set. + private var _minimumSize:NSInteger = 0 + var minimumSize:NSInteger { + set { + _minimumSize = max(newValue, self.defaultMinimumSize) + } + get { + return _minimumSize + } + } + /// Color of the outline border. Default: brown color. + private var _outlineBorderColor:UIColor = .clear + var outlineBorderColor:UIColor { + set { + _outlineBorderColor = newValue + self.contentView?.layer.borderColor = _outlineBorderColor.cgColor + } + get { + return _outlineBorderColor + } + } + /// A convenient property for you to store extra information. + var userInfo:Any? + + + init(contentView: UIView) { + self.defaultInset = 11 + self.defaultMinimumSize = 4 * self.defaultInset + + var frame = contentView.frame + frame = CGRect(x: 0, y: 0, width: frame.size.width + CGFloat(self.defaultInset) * 2, height: frame.size.height + CGFloat(self.defaultInset) * 2) + super.init(frame: frame) + self.backgroundColor = UIColor.clear + self.addGestureRecognizer(self.moveGesture) + self.addGestureRecognizer(self.tapGesture) + + // Setup content view + self.contentView = contentView + self.contentView.center = CGRectGetCenter(self.bounds) + self.contentView.isUserInteractionEnabled = false + self.contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + self.contentView.layer.allowsEdgeAntialiasing = true + self.addSubview(self.contentView) + + // Setup editing handlers + self.setPosition(.topLeft, forHandler: .close) + self.addSubview(self.closeImageView) + self.setPosition(.bottomRight, forHandler: .rotate) + self.addSubview(self.rotateImageView) + self.setPosition(.bottomLeft, forHandler: .flip) + self.addSubview(self.flipImageView) + + self.showEditing = true + self.enableClose = true + self.enableRotate = true + self.enableFlip = false + + self.minimumSize = self.defaultMinimumSize + self.outlineBorderColor = .white + } + + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setImage(_ image:UIImage, forHandler handler:StickerViewHandler) { + switch handler { + case .close: + self.closeImageView.image = image + case .rotate: + self.rotateImageView.image = image + case .flip: + self.flipImageView.image = image + } + } + + func setPosition(_ position:StickerViewPosition, forHandler handler:StickerViewHandler) { + let origin = self.contentView.frame.origin + let size = self.contentView.frame.size + + var handlerView:UIImageView? + switch handler { + case .close: + handlerView = self.closeImageView + case .rotate: + handlerView = self.rotateImageView + case .flip: + handlerView = self.flipImageView + } + + switch position { + case .topLeft: + handlerView?.center = origin + handlerView?.autoresizingMask = [.flexibleRightMargin, .flexibleBottomMargin] + case .topRight: + handlerView?.center = CGPoint(x: origin.x + size.width, y: origin.y) + handlerView?.autoresizingMask = [.flexibleLeftMargin, .flexibleBottomMargin] + case .bottomLeft: + handlerView?.center = CGPoint(x: origin.x, y: origin.y + size.height) + handlerView?.autoresizingMask = [.flexibleRightMargin, .flexibleTopMargin] + case .bottomRight: + handlerView?.center = CGPoint(x: origin.x + size.width, y: origin.y + size.height) + handlerView?.autoresizingMask = [.flexibleLeftMargin, .flexibleTopMargin] + } + + handlerView?.tag = position.rawValue + } + + /** + * Customize handler's size + * + * @param size Handler's size + */ + func setHandlerSize(_ size:Int) { + if size <= 0 { + return + } + + self.defaultInset = NSInteger(round(Float(size) / 2)) + self.defaultMinimumSize = 4 * self.defaultInset + self.minimumSize = max(self.minimumSize, self.defaultMinimumSize) + + let originalCenter = self.center + let originalTransform = self.transform + var frame = self.contentView.frame + frame = CGRect(x: 0, y: 0, width: frame.size.width + CGFloat(self.defaultInset) * 2, height: frame.size.height + CGFloat(self.defaultInset) * 2) + + self.contentView.removeFromSuperview() + + self.transform = CGAffineTransform.identity + self.frame = frame + + self.contentView.center = CGRectGetCenter(self.bounds) + self.addSubview(self.contentView) + self.sendSubviewToBack(self.contentView) + + let handlerFrame = CGRect(x: 0, y: 0, width: self.defaultInset * 2, height: self.defaultInset * 2) + self.closeImageView.frame = handlerFrame + self.setPosition(StickerViewPosition(rawValue: self.closeImageView.tag)!, forHandler: .close) + self.rotateImageView.frame = handlerFrame + self.setPosition(StickerViewPosition(rawValue: self.rotateImageView.tag)!, forHandler: .rotate) + self.flipImageView.frame = handlerFrame + self.setPosition(StickerViewPosition(rawValue: self.flipImageView.tag)!, forHandler: .flip) + + self.center = originalCenter + self.transform = originalTransform + } + + /** + * Default value + */ + private var defaultInset:NSInteger + private var defaultMinimumSize:NSInteger + + /** + * Variables for moving view + */ + private var beginningPoint = CGPoint.zero + private var beginningCenter = CGPoint.zero + + /** + * Variables for rotating and resizing view + */ + private var initialBounds = CGRect.zero + private var initialDistance:CGFloat = 0 + private var deltaAngle:CGFloat = 0 + + private lazy var moveGesture = { + return UIPanGestureRecognizer(target: self, action: #selector(handleMoveGesture(_:))) + }() + private lazy var rotateImageView:UIImageView = { + let rotateImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20)) + rotateImageView.cornerRadiuss = 10 + rotateImageView.tintColor = UIColor.black + rotateImageView.contentMode = UIView.ContentMode.scaleAspectFit + rotateImageView.backgroundColor = UIColor.white + rotateImageView.isUserInteractionEnabled = true + rotateImageView.addGestureRecognizer(self.rotateGesture) + + return rotateImageView + }() + private lazy var rotateGesture = { + return UIPanGestureRecognizer(target: self, action: #selector(handleRotateGesture(_:))) + }() + private lazy var closeImageView:UIImageView = { + let closeImageview = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20)) + closeImageview.cornerRadiuss = 10 + closeImageview.tintColor = UIColor.black + closeImageview.contentMode = UIView.ContentMode.scaleAspectFit + closeImageview.backgroundColor = UIColor.white + closeImageview.isUserInteractionEnabled = true + closeImageview.addGestureRecognizer(self.closeGesture) + return closeImageview + }() + private lazy var closeGesture = { + return UITapGestureRecognizer(target: self, action: #selector(handleCloseGesture(_:))) + }() + private lazy var flipImageView:UIImageView = { + let flipImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.defaultInset * 2, height: self.defaultInset * 2)) + flipImageView.contentMode = UIView.ContentMode.scaleAspectFit + flipImageView.backgroundColor = UIColor.clear + flipImageView.isUserInteractionEnabled = true + flipImageView.addGestureRecognizer(self.flipGesture) + return flipImageView + }() + private lazy var flipGesture = { + return UITapGestureRecognizer(target: self, action: #selector(handleFlipGesture(_:))) + }() + private lazy var tapGesture = { + return UITapGestureRecognizer(target: self, action: #selector(handleTapGesture(_:))) + }() + // MARK: - Gesture Handlers + @objc + func handleMoveGesture(_ recognizer: UIPanGestureRecognizer) { + let touchLocation = recognizer.location(in: self.superview) + switch recognizer.state { + case .began: + self.beginningPoint = touchLocation + self.beginningCenter = self.center + if let delegate = self.delegate { + delegate.stickerViewDidBeginMoving(self) + } + case .changed: + self.center = CGPoint(x: self.beginningCenter.x + (touchLocation.x - self.beginningPoint.x), y: self.beginningCenter.y + (touchLocation.y - self.beginningPoint.y)) + if let delegate = self.delegate { + delegate.stickerViewDidChangeMoving(self) + } + case .ended: + self.center = CGPoint(x: self.beginningCenter.x + (touchLocation.x - self.beginningPoint.x), y: self.beginningCenter.y + (touchLocation.y - self.beginningPoint.y)) + if let delegate = self.delegate { + delegate.stickerViewDidEndMoving(self) + } + default: + break + } + } + + @objc + func handleRotateGesture(_ recognizer: UIPanGestureRecognizer) { + let touchLocation = recognizer.location(in: self.superview) + let center = self.center + + switch recognizer.state { + case .began: + self.deltaAngle = CGFloat(atan2f(Float(touchLocation.y - center.y), Float(touchLocation.x - center.x))) - CGAffineTransformGetAngle(self.transform) + self.initialBounds = self.bounds + self.initialDistance = CGPointGetDistance(point1: center, point2: touchLocation) + if let delegate = self.delegate { + delegate.stickerViewDidBeginRotating(self) + } + case .changed: + let angle = atan2f(Float(touchLocation.y - center.y), Float(touchLocation.x - center.x)) + let angleDiff = Float(self.deltaAngle) - angle + self.transform = CGAffineTransform(rotationAngle: CGFloat(-angleDiff)) + + var scale = CGPointGetDistance(point1: center, point2: touchLocation) / self.initialDistance + let minimumScale = CGFloat(self.minimumSize) / min(self.initialBounds.size.width, self.initialBounds.size.height) + scale = max(scale, minimumScale) + let scaledBounds = CGRectScale(self.initialBounds, wScale: scale, hScale: scale) + self.bounds = scaledBounds + self.setNeedsDisplay() + + if let delegate = self.delegate { + delegate.stickerViewDidChangeRotating(self) + } + case .ended: + if let delegate = self.delegate { + delegate.stickerViewDidEndRotating(self) + } + default: + break + } + } + + @objc + func handleCloseGesture(_ recognizer: UITapGestureRecognizer) { + if let delegate = self.delegate { + delegate.stickerViewDidClose(self) + } + self.removeFromSuperview() + } + + @objc + func handleFlipGesture(_ recognizer: UITapGestureRecognizer) { + UIView.animate(withDuration: 0.3) { + self.contentView.transform = self.contentView.transform.scaledBy(x: -1, y: 1) + } + } + + @objc + func handleTapGesture(_ recognizer: UITapGestureRecognizer) { + if let delegate = self.delegate { + delegate.stickerViewDidTap(self) + } + } + + // MARK: - Private Methods + private func setEnableClose(_ enableClose:Bool) { + self.closeImageView.isHidden = !enableClose + self.closeImageView.isUserInteractionEnabled = enableClose + } + + private func setEnableRotate(_ enableRotate:Bool) { + self.rotateImageView.isHidden = !enableRotate + self.rotateImageView.isUserInteractionEnabled = enableRotate + } + + private func setEnableFlip(_ enableFlip:Bool) { + self.flipImageView.isHidden = !enableFlip + self.flipImageView.isUserInteractionEnabled = enableFlip + } +} + +extension StickerView: UIGestureRecognizerDelegate { + public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { + /** + * ref: http://stackoverflow.com/questions/19095165/should-superviews-gesture-cancel-subviews-gesture-in-ios-7/ + * + * The `gestureRecognizer` would be either closeGestureRecognizer or rotateGestureRecognizer, + * `otherGestureRecognizer` should work only when `gestureRecognizer` is failed. + * So, we always return YES here. + */ + return true + } +} diff --git a/MiniScanner/Supporting Files/LogoAnimationView/UIView+Constraints.swift b/MiniScanner/Supporting Files/LogoAnimationView/UIView+Constraints.swift new file mode 100755 index 0000000000000000000000000000000000000000..992e1c7225745efa72d8e62dbefa87eea91cf943 --- /dev/null +++ b/MiniScanner/Supporting Files/LogoAnimationView/UIView+Constraints.swift @@ -0,0 +1,21 @@ +// +// UIView+Constraints.swift +// AnimatedGifLaunchScreen-Example +// +// Created by Amer Hukic on 13/09/2018. +// Copyright © 2018 Amer Hukic. All rights reserved. +// + +import UIKit + +extension UIView { + + func pinEdgesToSuperView() { + guard let superView = superview else { return } + translatesAutoresizingMaskIntoConstraints = false + topAnchor.constraint(equalTo: superView.topAnchor).isActive = true + leftAnchor.constraint(equalTo: superView.leftAnchor).isActive = true + bottomAnchor.constraint(equalTo: superView.bottomAnchor).isActive = true + rightAnchor.constraint(equalTo: superView.rightAnchor).isActive = true + } +} diff --git a/MiniScanner/Supporting Files/MyExtention.swift b/MiniScanner/Supporting Files/MyExtention.swift new file mode 100755 index 0000000000000000000000000000000000000000..fdf6fc4ca84883b373f1f6c31c01bee5673304b8 --- /dev/null +++ b/MiniScanner/Supporting Files/MyExtention.swift @@ -0,0 +1,762 @@ +import UIKit +import Foundation +import CoreLocation +import QuartzCore +import CoreGraphics +import SystemConfiguration + +let SCREEN_WIDTH = UIScreen.main.bounds.width +let SCREEN_HEIGHT = UIScreen.main.bounds.height +let storyBoard = UIStoryboard.init(name: "Main", bundle: nil) +let appDelegate = UIApplication.shared.delegate as! AppDelegate + +let BANNER_ADID = "ca-app-pub-3940256099942544/2934735716" +let FULL_ADID = "ca-app-pub-3940256099942544/4411468910" +let APPOPENADID = "ca-app-pub-3940256099942544/5662855259" +let APP_NATIVE = "ca-app-pub-3940256099942544/3986624511" + +let appID = "app ID" +let devURL = "developer URL" +let Mail_ID = "support mail" +var RateURL : String = "app URL" + +var AppName = "Cam Scanner" +var PDFFileName = "FinalPDF" + +let ShadowColor = UIColor.init(named: "ShadowColor")! +let FontColor = UIColor.init(named: "FontColor")! +let BGColor = UIColor.init(named: "BGColor")! +let ThemeColor = UIColor.init(named: "ThemeColor")! + +var bottomPadding: CGFloat = UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0.0 +var topPadding: CGFloat = UIApplication.shared.keyWindow?.safeAreaInsets.top ?? 0.0 + +class MyFunc: NSObject +{ + func convertImageToBase64(image: UIImage) -> String { + let imageData = image.pngData()! + return imageData.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters) + } + + func convertBase64ToImage(imageString: String) -> UIImage { + let imageData = Data(base64Encoded: imageString, options: Data.Base64DecodingOptions.ignoreUnknownCharacters)! + return UIImage(data: imageData)! + } +} + +class UserDefaultMgr +{ + class func setSortType(strId: Int) + { + UserDefaults.standard.setValue(strId, forKey: "sortType") + UserDefaults.standard.synchronize() + } + class func getSortType() -> Int{ + if UserDefaults.standard.object(forKey: "sortType") == nil{ + return 0 + } + return UserDefaults.standard.value(forKey: "sortType") as! Int + } + + + class func getIsDoc4Time() -> Int{ + if UserDefaults.standard.object(forKey: "ad_DocCount") == nil{ + return 0 + } + return UserDefaults.standard.value(forKey: "ad_DocCount") as! Int + } + class func setIsDoc4Time(strId: Int) + { + UserDefaults.standard.setValue(strId, forKey: "ad_DocCount") + UserDefaults.standard.synchronize() + } + + class func getIsOCROneTime() -> Int{ + if UserDefaults.standard.object(forKey: "ad_OCRcount") == nil{ + return 0 + } + return UserDefaults.standard.value(forKey: "ad_OCRcount") as! Int + } + class func setIsOCROneTime(strId: Int) + { + UserDefaults.standard.setValue(strId, forKey: "ad_OCRcount") + UserDefaults.standard.synchronize() + } + + class func setIsChangeLayout(type: Bool){ + UserDefaults.standard.setValue(type, forKey: "isChangeLayout") + UserDefaults.standard.synchronize() + } + class func getIsChangeLayout() -> Bool{ + if UserDefaults.standard.object(forKey: "isChangeLayout") == nil{ + setIsChangeLayout(type: false) + return false + } + return UserDefaults.standard.value(forKey: "isChangeLayout") as! Bool + } + + class func setIsPasscode(type: Bool){ + UserDefaults.standard.setValue(type, forKey: "isPasscode") + UserDefaults.standard.synchronize() + } + + class func getIsPasscode() -> Bool{ + if UserDefaults.standard.object(forKey: "isPasscode") == nil{ + setIsPasscode(type: false) + return false + } + return UserDefaults.standard.value(forKey: "isPasscode") as! Bool + } + + class func setIsFaceID(type: Bool){ + UserDefaults.standard.setValue(type, forKey: "isFaceID") + UserDefaults.standard.synchronize() + } + + class func getIsFaceID() -> Bool{ + if UserDefaults.standard.object(forKey: "isFaceID") == nil{ + setIsFaceID(type: false) + return false + } + return UserDefaults.standard.value(forKey: "isFaceID") as! Bool + } + + + class func setIsTouchID(type: Bool){ + UserDefaults.standard.setValue(type, forKey: "isTouchID") + UserDefaults.standard.synchronize() + } + + class func getIsTouchID() -> Bool{ + if UserDefaults.standard.object(forKey: "isTouchID") == nil{ + setIsTouchID(type: false) + return false + } + return UserDefaults.standard.value(forKey: "isTouchID") as! Bool + } + +} + + +let aloaderSpinnerMarginSide : CGFloat = 35.0 +let aloaderSpinnerMarginTop : CGFloat = 20.0 +let aloaderTitleMargin : CGFloat = 5.0 + +let maxCount = 6 + + +open class ProcessLoader : UIView { + + fileprivate var coverView : UIView? + fileprivate var titleLabel : UILabel? + fileprivate var loadingView : SwiftLoadingView? + fileprivate var animated : Bool = true + fileprivate var canUpdated = false + fileprivate var title: String? + fileprivate var speed = 1 + + fileprivate var config : Config = Config() { + didSet { + self.loadingView?.config = config + } + } + + @objc func rotated(_ notification: Notification) { + + let loader = ProcessLoader.sharedInstance + + let height : CGFloat = UIScreen.main.bounds.size.height + let width : CGFloat = UIScreen.main.bounds.size.width + let center : CGPoint = CGPoint(x: width / 2.0, y: height / 2.0) + + loader.center = center + loader.coverView?.frame = UIScreen.main.bounds + } + + override open var frame : CGRect { + didSet { + self.update() + } + } + + class var sharedInstance: ProcessLoader { + struct Singleton { + static let instance = ProcessLoader(frame: CGRect(origin: CGPoint(x: 0,y: 0),size: CGSize(width: Config().size,height: Config().size))) + } + return Singleton.instance + } + + open class func show(animated: Bool) { + self.show(title: nil, animated: animated) + } + + open class func show(title: String?, animated : Bool) { + + let currentWindow : UIWindow = UIApplication.shared.keyWindow! + + let loader = ProcessLoader.sharedInstance + loader.canUpdated = true + loader.animated = animated + loader.title = title + loader.update() + + let height : CGFloat = UIScreen.main.bounds.size.height + let width : CGFloat = UIScreen.main.bounds.size.width + let center : CGPoint = CGPoint(x: width / 2.0, y: height / 2.0) + + loader.center = center + + if (loader.superview == nil) { + loader.coverView = UIView(frame: currentWindow.bounds) + loader.coverView?.backgroundColor = loader.config.foregroundColor.withAlphaComponent(loader.config.foregroundAlpha) + + currentWindow.addSubview(loader.coverView!) + currentWindow.addSubview(loader) + loader.start() + } + } + + open class func hide() { + + let loader = ProcessLoader.sharedInstance + NotificationCenter.default.removeObserver(loader) + + loader.stop() + } + + public class func setConfig(config : Config) { + let loader = ProcessLoader.sharedInstance + loader.config = config + loader.frame = CGRect(origin: CGPoint(x: 0, y: 0),size: CGSize(width: loader.config.size, height: loader.config.size)) + } + + private func setup() { + self.alpha = 0 + self.update() + } + + private func start() { + self.loadingView?.start() + + if (self.animated) { + UIView.animate(withDuration: 0.3, animations: { () -> Void in + self.alpha = 1 + }, completion: { (finished) -> Void in + + }); + } else { + self.alpha = 1 + } + } + + private func stop() { + + DispatchQueue.main.async { + if (self.animated) { + UIView.animate(withDuration: 0.3, animations: { () -> Void in + self.alpha = 0 + }, completion: { (finished) -> Void in + self.removeFromSuperview() + self.coverView?.removeFromSuperview() + self.loadingView?.stop() + }); + } else { + self.alpha = 0 + self.removeFromSuperview() + self.coverView?.removeFromSuperview() + self.loadingView?.stop() + } + } + } + + private func update() { + self.backgroundColor = self.config.backgroundColor + self.layer.cornerRadius = self.config.cornerRadius + let loadingViewSize = self.frame.size.width - (aloaderSpinnerMarginSide * 2) + + if (self.loadingView == nil) { + self.loadingView = SwiftLoadingView(frame: self.frameForSpinner()) + self.addSubview(self.loadingView!) + } else { + self.loadingView?.frame = self.frameForSpinner() + } + + if (self.titleLabel == nil) { + self.titleLabel = UILabel(frame: CGRect(origin: CGPoint(x: aloaderTitleMargin, y: aloaderSpinnerMarginTop + loadingViewSize), size: CGSize(width: self.frame.width - aloaderTitleMargin*2, height: 42.0))) + self.addSubview(self.titleLabel!) + self.titleLabel?.numberOfLines = 1 + self.titleLabel?.textAlignment = NSTextAlignment.center + self.titleLabel?.adjustsFontSizeToFitWidth = true + } else { + self.titleLabel?.frame = CGRect(origin: CGPoint(x: aloaderTitleMargin, y: aloaderSpinnerMarginTop + loadingViewSize), size: CGSize(width: self.frame.width - aloaderTitleMargin*2, height: 42.0)) + } + + self.titleLabel?.font = self.config.titleTextFont + self.titleLabel?.textColor = self.config.titleTextColor + self.titleLabel?.text = self.title + + self.titleLabel?.isHidden = self.title == nil + } + + func frameForSpinner() -> CGRect { + let loadingViewSize = self.frame.size.width - (aloaderSpinnerMarginSide * 2) + + if (self.title == nil) { + let yOffset = (self.frame.size.height - loadingViewSize) / 2 + return CGRect(origin: CGPoint(x: aloaderSpinnerMarginSide, y: yOffset), size: CGSize(width: loadingViewSize, height: loadingViewSize)) + } + return CGRect(origin: CGPoint(x: aloaderSpinnerMarginSide, y: aloaderSpinnerMarginTop), size: CGSize(width: loadingViewSize, height: loadingViewSize)) + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.setup() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + class SwiftLoadingView : UIView { + + fileprivate var speed : Int? + fileprivate var lineWidth : Float? + fileprivate var lineTintColor : UIColor? + fileprivate var backgroundLayer : CAShapeLayer? + fileprivate var isSpinning : Bool? + + var config : Config = Config() { + didSet { + self.update() + } + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.setup() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + func setup() { + self.backgroundColor = UIColor.clear + self.lineWidth = fmaxf(Float(self.frame.size.width) * 0.025, 1) + + self.backgroundLayer = CAShapeLayer() + self.backgroundLayer?.strokeColor = self.config.spinnerColor.cgColor + self.backgroundLayer?.fillColor = self.backgroundColor?.cgColor + self.backgroundLayer?.lineCap = CAShapeLayerLineCap.round + self.backgroundLayer?.lineWidth = CGFloat(self.lineWidth!) + self.layer.addSublayer(self.backgroundLayer!) + } + + func update() { + self.lineWidth = self.config.spinnerLineWidth + self.speed = self.config.speed + + self.backgroundLayer?.lineWidth = CGFloat(self.lineWidth!) + self.backgroundLayer?.strokeColor = self.config.spinnerColor.cgColor + } + + override func draw(_ rect: CGRect) { + self.backgroundLayer?.frame = self.bounds + } + + func drawBackgroundCircle(_ partial : Bool) { + let startAngle : CGFloat = .pi / CGFloat(2.0) + var endAngle : CGFloat = (2.0 * .pi) + startAngle + + let center : CGPoint = CGPoint(x: self.bounds.size.width / 2,y: self.bounds.size.height / 2) + let radius : CGFloat = (CGFloat(self.bounds.size.width) - CGFloat(self.lineWidth!)) / CGFloat(2.0) + + let processBackgroundPath : UIBezierPath = UIBezierPath() + processBackgroundPath.lineWidth = CGFloat(self.lineWidth!) + + if (partial) { + endAngle = (1.8 * .pi) + startAngle + } + + processBackgroundPath.addArc(withCenter: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true) + self.backgroundLayer?.path = processBackgroundPath.cgPath; + } + + func start() { + self.isSpinning? = true + self.drawBackgroundCircle(true) + + let rotationAnimation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") + rotationAnimation.toValue = NSNumber(value: .pi * 2.0) + rotationAnimation.duration = 1; + rotationAnimation.isCumulative = true; + rotationAnimation.repeatCount = HUGE; + self.backgroundLayer?.add(rotationAnimation, forKey: "rotationAnimation") + } + + func stop() { + self.drawBackgroundCircle(false) + self.backgroundLayer?.removeAllAnimations() + self.isSpinning? = false + } + } + + public struct Config { + public var size : CGFloat = 120.0 + public var spinnerColor = BGColor + public var spinnerLineWidth :Float = 1.0 + public var titleTextColor = UIColor.black + public var speed :Int = 1 + public var titleTextFont : UIFont = UIFont.boldSystemFont(ofSize: 16.0) + public var backgroundColor = FontColor + public var foregroundColor = UIColor.clear + public var foregroundAlpha:CGFloat = 0.0 + public var cornerRadius : CGFloat = 10.0 + public init() {} + } +} + +extension UIView { + + func roundCorners(corners: UIRectCorner, radius: CGFloat) { + let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) + let mask = CAShapeLayer() + mask.path = path.cgPath + layer.mask = mask + } + + func addShadow(offset: CGSize, color: UIColor, radius: CGFloat, opacity: Float) { + layer.masksToBounds = false + layer.shadowOffset = offset + layer.shadowColor = color.cgColor + layer.shadowRadius = radius + layer.shadowOpacity = opacity + + let backgroundCGColor = backgroundColor?.cgColor + backgroundColor = nil + layer.backgroundColor = backgroundCGColor + } + + + func addFixShadow() { + layer.masksToBounds = false + layer.shadowOffset = CGSize.init(width: 2.0, height: 2.0) + layer.shadowColor = ShadowColor.cgColor + layer.shadowRadius = 4.0 + layer.shadowOpacity = 0.5 + + let backgroundCGColor = backgroundColor?.cgColor + backgroundColor = nil + layer.backgroundColor = backgroundCGColor + } +} + +extension Array { + mutating func remove(at indexes: [Int]) { + for index in indexes.sorted(by: >) { + remove(at: index) + } + } +} + +extension Sequence where Element: Hashable { + func uniqued() -> [Element] { + var set = Set<Element>() + return filter { set.insert($0).inserted } + } +} + +extension UIViewController { + + func showAlertWithTitle( alertTitle : String , msg:String ) + { + let alert = UIAlertController(title:alertTitle, message: msg, preferredStyle: .alert) + let action = UIAlertAction(title: "OK", style: .cancel, handler: nil) + alert.addAction(action) + self.present(alert, animated: true, completion: nil) + + } +} + + +extension UIApplication +{ + class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { + if let navigationController = controller as? UINavigationController { + return topViewController(controller: navigationController.visibleViewController) + } + if let tabController = controller as? UITabBarController { + if let selected = tabController.selectedViewController { + return topViewController(controller: selected) + } + } + if let presented = controller?.presentedViewController { + return topViewController(controller: presented) + } + return controller + } + + class func getTopViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { + + if let nav = base as? UINavigationController { + return getTopViewController(base: nav.visibleViewController) + + } else if let tab = base as? UITabBarController, let selected = tab.selectedViewController { + return getTopViewController(base: selected) + + } else if let presented = base?.presentedViewController { + return getTopViewController(base: presented) + } + return base + } +} + + +extension UIColor { + + public convenience init?(hexString: String) { + var cString: String = hexString.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased() + + if (cString.hasPrefix("#")) { + if let range = cString.range(of: cString) { + cString = cString.substring(from: cString.index(range.lowerBound, offsetBy: 1)) + } + } + + if ((cString.count) != 6) { + self.init(white: 0.2, alpha: 1) + return + } + + var rgbValue: UInt32 = 0 + Scanner(string: cString).scanHexInt32(&rgbValue) + + self.init( + red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, + green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0, + blue: CGFloat(rgbValue & 0x0000FF) / 255.0, + alpha: CGFloat(1.0) + ) + } +} + +extension UIView { + + var height:CGFloat{return self.bounds.size.height} + var width:CGFloat{return self.bounds.size.width} + var x:CGFloat{return self.frame.origin.x} + var y:CGFloat{return self.frame.origin.y} + + func MoveToXwithDuration(toX:CGFloat,duration:Double) { + UIView.animate(withDuration: duration) { + self.frame.origin.x = toX + } + } + + func MoveToYwithDuration(toY:CGFloat,duration:Double) { + + UIView.animate(withDuration: duration) { + self.frame.origin.y = toY + } + } + + @IBInspectable + var cornerRadiuss: CGFloat { + get { + return layer.cornerRadius + } + set { + layer.cornerRadius = newValue + } + } + + @IBInspectable + var borderWidth: CGFloat { + get + { + return layer.borderWidth + } + set + { + layer.borderWidth = newValue + } + } + + @IBInspectable + var borderColor: UIColor? { + get { + if let color = layer.borderColor { + return UIColor(cgColor: color) + } + return nil + } + set { + if let color = newValue { + layer.borderColor = color.cgColor + } else { + layer.borderColor = nil + } + } + } + + //FIND The parent view from UIVIEW + var parentViewController: UIViewController? { + var parentResponder: UIResponder? = self + while parentResponder != nil { + parentResponder = parentResponder!.next + if let viewController = parentResponder as? UIViewController { + return viewController + } + } + return nil + } + + func TakeScreenshot() -> UIImage { + + UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.main.scale) + drawHierarchy(in: self.bounds, afterScreenUpdates: true) + let image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + if (image != nil) + { + return image! + } + return UIImage() + } +} + +extension Int +{ + var FloatValue:CGFloat{return CGFloat(self)} + var DoubleValue:Double{return Double(self)} +} + + +extension UIImage{ + + var height:CGFloat{return self.size.height} + var width:CGFloat{return self.size.width} + + func resizeImage(targetSize: CGSize) -> UIImage? { + let size = self.size + + let widthRatio = targetSize.width / size.width + let heightRatio = targetSize.height / size.height + + // Figure out what our orientation is, and use that to form the rectangle + var newSize: CGSize + if(widthRatio > heightRatio) { + newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio) + } else { + newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio) + } + + // This is the rect that we've calculated out and this is what is actually used below + let rect = CGRect(origin: .zero, size: newSize) + + // Actually do the resizing to the rect using the ImageContext stuff + UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0) + self.draw(in: rect) + let newImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + return newImage + } + + func BlurImage(value:NSNumber) -> UIImage { + + let context = CIContext(options: [CIContextOption.useSoftwareRenderer:true]) + let CIImage = CoreImage.CIImage(image:self) + let blurFilter = CIFilter(name: "CIGaussianBlur") + blurFilter?.setValue(CIImage, forKey: kCIInputImageKey) + blurFilter?.setValue(value, forKey: "inputRadius") + let imageRef = context.createCGImage((blurFilter?.outputImage)!, from: (CIImage?.extent)!) + + let newImage = UIImage(cgImage:imageRef!) + return newImage + } + + func fixImageOrientation()->UIImage { + UIGraphicsBeginImageContext(self.size) + self.draw(at: .zero) + let newImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return newImage ?? self + } +} + +extension String +{ + var toInteger:Int?{ + get{ + return Int(self) + } + } + + var toDouble:Double?{ + get{ + return Double(self) + } + } + + var toFloat:Float?{ + get{ + return Float(self) + } + } + + var toBool:Bool?{ + get + { + if self == "1" + { + return "1" == self ? true : false + } + return "true" == self ? true : false + } + } +} + +extension CGFloat +{ + var toInt:Int?{ + get{ + return Int(self) + } + } +} + + +struct ImageHeaderData{ + static var PNG: [UInt8] = [0x89] + static var JPEG: [UInt8] = [0xFF] + static var GIF: [UInt8] = [0x47] + static var TIFF_01: [UInt8] = [0x49] + static var TIFF_02: [UInt8] = [0x4D] +} + +enum ImageFormat{ + case Unknown, PNG, JPEG, GIF, TIFF +} + + +extension NSData{ + var imageFormat: ImageFormat{ + var buffer = [UInt8](repeating: 0, count: 1) + self.getBytes(&buffer, range: NSRange(location: 0,length: 1)) + if buffer == ImageHeaderData.PNG + { + return .PNG + } else if buffer == ImageHeaderData.JPEG + { + return .JPEG + } else if buffer == ImageHeaderData.GIF + { + return .GIF + } else if buffer == ImageHeaderData.TIFF_01 || buffer == ImageHeaderData.TIFF_02{ + return .TIFF + } else{ + return .Unknown + } + } +} diff --git a/Pods/FSPagerView/Sources/FSPageControl.swift b/MiniScanner/Supporting Files/Sources/FSPageControl.swift similarity index 100% rename from Pods/FSPagerView/Sources/FSPageControl.swift rename to MiniScanner/Supporting Files/Sources/FSPageControl.swift diff --git a/Pods/FSPagerView/Sources/FSPageViewLayout.swift b/MiniScanner/Supporting Files/Sources/FSPageViewLayout.swift similarity index 100% rename from Pods/FSPagerView/Sources/FSPageViewLayout.swift rename to MiniScanner/Supporting Files/Sources/FSPageViewLayout.swift diff --git a/Pods/FSPagerView/Sources/FSPageViewTransformer.swift b/MiniScanner/Supporting Files/Sources/FSPageViewTransformer.swift similarity index 99% rename from Pods/FSPagerView/Sources/FSPageViewTransformer.swift rename to MiniScanner/Supporting Files/Sources/FSPageViewTransformer.swift index 28786792ecc9107efd1c29ee65e1afd986852c8c..7f467716726898a27e0275051bbd464447300a83 100644 --- a/Pods/FSPagerView/Sources/FSPageViewTransformer.swift +++ b/MiniScanner/Supporting Files/Sources/FSPageViewTransformer.swift @@ -26,8 +26,8 @@ open class FSPagerViewTransformer: NSObject { open internal(set) weak var pagerView: FSPagerView? open internal(set) var type: FSPagerViewTransformerType - open var minimumScale: CGFloat = 0.65 - open var minimumAlpha: CGFloat = 0.6 + @objc open var minimumScale: CGFloat = 0.65 + @objc open var minimumAlpha: CGFloat = 0.6 @objc public init(type: FSPagerViewTransformerType) { diff --git a/Pods/FSPagerView/Sources/FSPagerCollectionView.swift b/MiniScanner/Supporting Files/Sources/FSPagerCollectionView.swift similarity index 100% rename from Pods/FSPagerView/Sources/FSPagerCollectionView.swift rename to MiniScanner/Supporting Files/Sources/FSPagerCollectionView.swift diff --git a/Pods/FSPagerView/Sources/FSPagerView.swift b/MiniScanner/Supporting Files/Sources/FSPagerView.swift similarity index 97% rename from Pods/FSPagerView/Sources/FSPagerView.swift rename to MiniScanner/Supporting Files/Sources/FSPagerView.swift index 7fb17d9e53c1b376aa9d49a53c86ca0ad4466bd4..32d00cd840c16b42852ed52f7e63730094e664d1 100644 --- a/Pods/FSPagerView/Sources/FSPagerView.swift +++ b/MiniScanner/Supporting Files/Sources/FSPagerView.swift @@ -477,10 +477,24 @@ open class FSPagerView: UIView,UICollectionViewDataSource,UICollectionViewDelega /// Reloads all of the data for the collection view. @objc(reloadData) open func reloadData() { - self.collectionViewLayout.needsReprepare = true; + self.collectionViewLayout.needsReprepare = true self.collectionView.reloadData() + self.collectionView.layoutIfNeeded() } + open func getCell(at: Int) -> FSPagerViewCell { + if let cell = self.collectionView.cellForItem(at: IndexPath(row: at, section: 0)) as? FSPagerViewCell { + return cell + } + return FSPagerViewCell() + } + + open func reloadData(at: Int) { + let index = IndexPath(row: at, section: 0) + self.collectionView.reloadItems(at: [index]) + } + + /// Selects the item at the specified index and optionally scrolls it into view. /// /// - Parameters: @@ -549,6 +563,11 @@ open class FSPagerView: UIView,UICollectionViewDataSource,UICollectionViewDelega return self.collectionView.cellForItem(at: indexPath) as? FSPagerViewCell } + open func cellForItemat(index: Int) -> FSPagerViewCell? { + let indexPath = IndexPath(row: index, section: 0) + return self.collectionView.cellForItem(at: indexPath) as? FSPagerViewCell + } + // MARK: - Private functions fileprivate func commonInit() { diff --git a/Pods/FSPagerView/Sources/FSPagerViewCell.swift b/MiniScanner/Supporting Files/Sources/FSPagerViewCell.swift similarity index 67% rename from Pods/FSPagerView/Sources/FSPagerViewCell.swift rename to MiniScanner/Supporting Files/Sources/FSPagerViewCell.swift index 832de15a36f2a84d443ba14378d28901d5ae5aff..9b4b55c81d45fd2c73fa74bc78bfedfc21415db3 100644 --- a/Pods/FSPagerView/Sources/FSPagerViewCell.swift +++ b/MiniScanner/Supporting Files/Sources/FSPagerViewCell.swift @@ -17,6 +17,32 @@ open class FSPagerViewCell: UICollectionViewCell { open var delegate: FSPagerViewCellDelegate? open var index: Int? + open var sign: UIImage! { + didSet { + loadCaptureSignature(sign ?? UIImage()) + } + } + var session: MultiPageScanSession? + + private var selectedStickerView:StickerView? + + var selectedStickerView1:StickerView? { + get { + return selectedStickerView + } + set { + if selectedStickerView != newValue { + if let selectedStickerView = selectedStickerView { + selectedStickerView.showEditing = false + } + selectedStickerView = newValue + } + if let selectedStickerView = selectedStickerView { + selectedStickerView.showEditing = true + selectedStickerView.superview?.bringSubviewToFront(selectedStickerView) + } + } + } /// Returns the label used for the main textual content of the pager view cell. @objc @@ -108,6 +134,8 @@ open class FSPagerViewCell: UICollectionViewCell { } } + + open override var isSelected: Bool { set { super.isSelected = newValue @@ -188,4 +216,81 @@ open class FSPagerViewCell: UICollectionViewCell { } } + func grayscale(image: UIImage) -> UIImage? + { + let context = CIContext(options: nil) + if let filter = CIFilter(name: "CIPhotoEffectNoir") { + filter.setValue(CIImage(image: image), forKey: kCIInputImageKey) + if let output = filter.outputImage { + if let cgImage = context.createCGImage(output, from: output.extent) { + return UIImage(cgImage: cgImage) + } + } + } + return nil + } + + func loadCaptureSignature(_ cropImage : UIImage) + { + let grayImg = grayscale(image: cropImage) + let newImage = grayImg + + let imageSize = CGSize(width: 125, height: 125) + + let testImage = UIImageView() + testImage.frame.size = imageSize + testImage.contentMode = .scaleAspectFit + testImage.image = newImage + + let stickerView = StickerView.init(contentView: testImage) + stickerView.center = contentView.center + stickerView.delegate = self + if let exitIcon = UIImage(named: "close"), + let rotateIcon = UIImage(named: "resize") { + stickerView.setImage(exitIcon, forHandler: StickerViewHandler.close) + stickerView.setImage(rotateIcon, forHandler: StickerViewHandler.rotate) + } + + stickerView.showEditing = false + + self.selectedStickerView1 = stickerView + if let sign = self.selectedStickerView1 { + contentView.addSubview(sign) + } + } +} +extension FSPagerViewCell: StickerViewDelegate { + func stickerViewDidBeginMoving(_ stickerView: StickerView) { + return + } + + func stickerViewDidChangeMoving(_ stickerView: StickerView) { + return + } + + func stickerViewDidEndMoving(_ stickerView: StickerView) { + return + } + + func stickerViewDidBeginRotating(_ stickerView: StickerView) { + return + } + + func stickerViewDidChangeRotating(_ stickerView: StickerView) { + return + } + + func stickerViewDidEndRotating(_ stickerView: StickerView) { + return + } + + func stickerViewDidClose(_ stickerView: StickerView) { + return + } + + func stickerViewDidTap(_ stickerView: StickerView) { + selectedStickerView1?.showEditing = !(selectedStickerView1?.showEditing ?? false) + } + + } diff --git a/Pods/FSPagerView/Sources/FSPagerViewLayoutAttributes.swift b/MiniScanner/Supporting Files/Sources/FSPagerViewLayoutAttributes.swift similarity index 100% rename from Pods/FSPagerView/Sources/FSPagerViewLayoutAttributes.swift rename to MiniScanner/Supporting Files/Sources/FSPagerViewLayoutAttributes.swift diff --git a/Pods/FSPagerView/Sources/FSPagerViewObjcCompat.h b/MiniScanner/Supporting Files/Sources/FSPagerViewObjcCompat.h similarity index 100% rename from Pods/FSPagerView/Sources/FSPagerViewObjcCompat.h rename to MiniScanner/Supporting Files/Sources/FSPagerViewObjcCompat.h diff --git a/Pods/FSPagerView/Sources/FSPagerViewObjcCompat.m b/MiniScanner/Supporting Files/Sources/FSPagerViewObjcCompat.m similarity index 100% rename from Pods/FSPagerView/Sources/FSPagerViewObjcCompat.m rename to MiniScanner/Supporting Files/Sources/FSPagerViewObjcCompat.m diff --git a/Podfile b/Podfile index 754b27a27bbe4ad37b39a68c8f1531f24a64675e..64a9519821e697f99b10a9348a275505e56a11e1 100644 --- a/Podfile +++ b/Podfile @@ -10,7 +10,6 @@ target 'MiniScanner' do pod 'IQKeyboardManagerSwift' pod 'ImagePicker' pod 'NBBottomSheet' - pod 'FSPagerView' pod 'EPSignature' diff --git a/Podfile.lock b/Podfile.lock index d3193b9f9bdd6603acd0c752afb29ef569cc4bec..6649453d01ac2fa8903135f6c0e524589e24e832 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,6 +1,5 @@ PODS: - EPSignature (1.0.6) - - FSPagerView (0.8.3) - ImagePicker (3.2.0) - IQKeyboardManagerSwift (7.0.3) - LanguageManager-iOS (1.2.7) @@ -8,7 +7,6 @@ PODS: DEPENDENCIES: - EPSignature - - FSPagerView - ImagePicker - IQKeyboardManagerSwift - LanguageManager-iOS @@ -17,7 +15,6 @@ DEPENDENCIES: SPEC REPOS: trunk: - EPSignature - - FSPagerView - ImagePicker - IQKeyboardManagerSwift - LanguageManager-iOS @@ -25,12 +22,11 @@ SPEC REPOS: SPEC CHECKSUMS: EPSignature: 3fa3b520c80717b98019723faa60a41794b03fbc - FSPagerView: 670405b2f18e2a87fa37f20b00de783e562c25a8 ImagePicker: 1d950bbb2422548ed58791b4ec7f42fe42920511 IQKeyboardManagerSwift: f9c5dc36cba16ddd2e51fa7d51c34a2e083029b5 LanguageManager-iOS: 6b2dbb3793445827114708f0759b76e96932d7c8 NBBottomSheet: aa7a52809b2d7b193f733247b8ce391a59904372 -PODFILE CHECKSUM: 23ea4bb572ed7de088aee5894c2fe160357b3d96 +PODFILE CHECKSUM: 55e1d258d6921724b2dcc8fa7966f2e028ae9600 COCOAPODS: 1.14.3 diff --git a/Pods/FSPagerView/README-OBJECTIVE-C.md b/Pods/FSPagerView/README-OBJECTIVE-C.md deleted file mode 100644 index ee4cbd71bf9b2af95754bd5a097f48363bcbe489..0000000000000000000000000000000000000000 --- a/Pods/FSPagerView/README-OBJECTIVE-C.md +++ /dev/null @@ -1,416 +0,0 @@ - - -[](#) <br/> -[](http://cocoadocs.org/docsets/FSPagerView) -[](http://cocoadocs.org/docsets/FSPagerView) -[](https://github.com/Carthage/Carthage) -[](https://swift.org/package-manager/) - -|[<b>SWIFT</b>](https://github.com/WenchaoD/FSPagerView/blob/master/README.md)|<b>OBJECTIVE-C</b>| -|---|---| - -**FSPagerView** is an elegant Screen Slide Library implemented primarily with ***UICollectionView***. It is extremely helpful for making Bannerã€Product Showã€Welcome/Guide Pagesã€Screen/ViewController Sliders. - -## Features -* ***Infinite*** scrolling. -* ***Automatic*** Sliding. -* Support ***Horizontal*** and ***Vertical*** paging. -* Fully customizable item, with predefined banner-style item. -* Fully customizable ***page control***. -* Rich build-in 3D transformers. -* ***Simple*** and ***Delightful*** api usage. -* Support **SWIFT** and **OBJECTIVE-C**. - -## Demo1 Banner - -| Banner | -|---| -| | - -### automaticSlidingInterval -The time interval of automatic sliding. 0 means disabling automatic sliding. Default is 0. - -**e.g.** - -```objc -pagerView.automaticSlidingInterval = 3.0; -``` - - -### isInfinite -A boolean value indicates whether the pager view has infinite number of items. Default is false. - -**e.g.** - -```objc -pagerView.isInfinite = YES; -``` - -### decelerationDistance -An unsigned integer value that determines the paging distance of the pager view, which indicates the number of passing items during the deceleration. When the value of this property is FSPagerViewAutomaticDistance, the actual 'distance' is automatically calculated according to the scrolling speed of the pager view. Default is 1. - -**e.g.** - -```objc -pagerView.decelerationDistance = 2 -``` - -### itemSize -The item size of the pager view. When the value of this property is FSPagerViewAutomaticSize, the items fill the entire visible area of the pager view. Default is FSPagerViewAutomaticSize. - - -**e.g.** - -```objc -pagerView.itemSize = CGSizeMake(200, 180); -``` - -### interitemSpacing -The spacing to use between items in the pager view. Default is 0. - -**e.g.** - -```objc -pagerView.interitemSpacing = 10; -``` - -## Demo2 - Transformers - -|Cross Fading| -|---| -|  | - -```objc -pagerView.transformer = [[FSPagerViewTransformer alloc] initWithType:FSPagerViewTransformerTypeCrossFading]; -``` ---- - - - -|Zoom Out| -|---| -|  | - -```objc -pagerView.transformer = [[FSPagerViewTransformer alloc] initWithType:FSPagerViewTransformerTypeZoomOut]; -``` ---- - - -|Depth| -|---| -|  | - -```objc -pagerView.transformer = [[FSPagerViewTransformer alloc] initWithType:FSPagerViewTransformerTypeDepth]; -``` ---- - - -|Linear| -|---| -|  | - -```objc -pagerView.transformer = [[FSPagerViewTransformer alloc] initWithType:FSPagerViewTransformerTypeLinear]; -``` ---- - - -|Overlap| -|---| -|  | - -```objc -pagerView.transformer = [[FSPagerViewTransformer alloc] initWithType:FSPagerViewTransformerTypeOverlap]; -``` ---- - - -|Ferris Wheel| -|------| -|  | - -```objc -pagerView.transformer = [[FSPagerViewTransformer alloc] initWithType:FSPagerViewTransformerTypeFerrisWheel]; -``` ---- - - -|Inverted Ferris Wheel| -|------| -|  | - -```objc -pagerView.transformer = [[FSPagerViewTransformer alloc] initWithType:FSPagerViewTransformerTypeInvertedFerrisWheel]; -``` ---- - - -|Cover Flow| -|------| -|  | -```objc -pagerView.transformer = [[FSPagerViewTransformer alloc] initWithType:FSPagerViewTransformerTypeCoverFlow]; -``` ---- - -|Cubic| -|------| -|  | -```objc -pagerView.transformer = [[FSPagerViewTransformer alloc] initWithType:FSPagerViewTransformerTypeCubic]; -``` ---- - - -> Customize your own transformer by subclassing`FSPagerViewTransformer.` - - -## Demo3 Page Control -|Page Control| -|---| -| -| - -### numberOfPages -The number of page indicators of the page control. Default is 0. - -**e.g.** - -```objc -pageControl.numberOfPages = 5; -``` - -### currentPage -The current page, highlighted by the page control. Default is 0. - -**e.g.** - -```objc -pageControl.currentPage = 1; -``` -### contentHorizontalAlignment -The horizontal alignment of content within the control’s bounds. Default is center. - -**e.g.** - -```objc -pageControl.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight; -``` - -### setStrokeColor:forState: -Sets the stroke color for page indicators to use for the specified state. (selected/normal). - -**e.g.** - -```objc -[pageControl setStrokeColor:[UIColor greenColor] forState:UIControlStateNormal]; -[pageControl setStrokeColor:[UIColor yellowColor] forState:UIControlStateSelected]; -``` - - -### setFillColor:forState: -Sets the fill color for page indicators to use for the specified state. (selected/normal). - -**e.g.** - -```objc -[pageControl setFillColor:[UIColor grayColor] forState:UIControlStateNormal]; -[pageControl setFillColor:[UIColor whiteColor] forState:UIControlStateSelected]; -``` - -### setImage:forState: -Sets the image for page indicators to use for the specified state. (selected/normal). - -**e.g.** - -```objc -[pageControl setImage:[UIImage imageNamed:@"image1"] forState:UIControlStateNormal]; -[pageControl setImage:[UIImage imageNamed:@"image2"] forState:UIControlStateSelected]; -``` - -### setPath:forState: -Sets the path for page indicators to use for the specified state. (selected/normal). - -**e.g.** - -```objc -[pageControl setPath:[UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 8, 8)] forState:UIControlStateNormal]; -[pageControl setPath: [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 8, 8)] forState:UIControlStateSelected]; -``` - -## Installation -* Manually -* Cocoapods -* Carthage - -### Manually -1. ***[Download](#)*** the source code. -2. Extract the zip file, simply drag folder ***Sources*** into your project. -3. Make sure ***Copy items if needed*** is checked. - -### Cocoapods -```ruby -use_frameworks! -target '<Your Target Name>' do - pod 'FSPagerView' -end -``` - -### Carthage -```ruby -github "WenchaoD/FSPagerView" -``` - -## Tutorial -* [Getting started](#getting_started) -* [Implement FSPagerViewDataSource](#implement_fspagerviewdatasource) -* [Implement FSPagerViewDelegate](#implement_fspagerviewdelegate) - -### 1. Getting started <a id='getting_started'></a> - -* Getting started with code - -```objc -// Create a pager view -FSPagerView *pagerView = [[FSPagerView alloc] initWithFrame:frame1]; -pagerView.dataSource = self; -pagerView.delegate = self; -[pagerView registerClass:[FSPagerViewCell class] forCellWithReuseIdentifier:@"cell"]; -[self.view addSubview:pagerView]; -// Create a page control -FSPageControl *pageControl = [[FSPageControl alloc] initWithFrame:frame2]; -[self.view addSubview:pageControl]; -``` - -* Getting started with Interface Builder <br/> -1ã€Simply drag **UIView** instance into your View Controller, Change the `Custom Class` to `FSPagerView`. (Or `FSPageControl`) <br/> -2ã€Link the `dataSource` and `delegate` property of **FSPagerView** to your View Controller. <br/> -3ã€Register a cell class. - -```objc -- (void)viewDidLoad -{ - [super viewDidLoad]; - [self.pagerView registerClass:[FSPagerViewCell class] forCellWithReuseIdentifier:@"cell"]; -} -``` - - -### 2. Implement FSPagerViewDataSource <a id='implement_fspagerviewdatasource'></a> -```objc -- (NSInteger)numberOfItemsInpagerView:(FSPagerView *)pagerView -{ - return numberOfItems; -} - -- (FSPagerViewCell *)pagerView:(FSPagerView *)pagerView cellForItemAtIndex:(NSInteger)index -{ - FSPagerViewCell *cell = [pagerView dequeueReusableCellWithReuseIdentifier:@"cell" atIndex:index]; - cell.imageView.image = ...; - cell.textLabel.text = ...; - return cell; -} -``` - -### 3. Implement FSPagerViewDelegate <a id='implement_fspagerviewdelegate'></a> - -```objc -- (BOOL)pagerView:(FSPagerView *)pagerView shouldHighlightItemAtIndex:(NSInteger)index; -``` -> Asks the delegate if the item should be highlighted during tracking. - ---- - -```objc -- (void)pagerView:(FSPagerView *)pagerView didHighlightItemAtIndex:(NSInteger)index; -``` -> Tells the delegate that the item at the specified index was highlighted. - ---- - -```objc -- (BOOL)pagerView:(FSPagerView *)pagerView shouldSelectItemAtIndex:(NSInteger)index; -``` -> Asks the delegate if the specified item should be selected. - ---- - -```objc -- (void)pagerView:(FSPagerView *)pagerView didSelectItemAtIndex:(NSInteger)index; -``` -> Tells the delegate that the item at the specified index was selected. - ---- - -```objc -- (void)pagerView:(FSPagerView *)pagerView willDisplayCell:(FSPagerViewCell *)cell forItemAtIndex:(NSInteger)index; -``` -> Tells the delegate that the specified cell is about to be displayed in the pager view. - ---- - -```objc -- (void)pagerView:(FSPagerView *)pagerView didEndDisplayingCell:(FSPagerViewCell *)cell forItemAtIndex:(NSInteger)index; -``` -> Tells the delegate that the specified cell was removed from the pager view. - ---- - -```objc -- (void)pagerViewWillBeginDragging:(FSPagerView *)pagerView; -``` -> Tells the delegate when the pager view is about to start scrolling the content. - ---- - -```objc -- (void)pagerViewWillEndDragging:(FSPagerView *) pagerView targetIndex:(NSInteger)index: -``` -> Tells the delegate when the user finishes scrolling the content. - ---- - -```objc -- (void)pagerViewDidScroll:(FSPagerView *)pagerView; -``` -> Tells the delegate when the user scrolls the content view within the receiver. - ---- - -```objc -- (void)pagerViewDidEndScrollAnimation:(FSPagerView *)pagerView; -``` -> Tells the delegate when a scrolling animation in the pager view concludes. - ---- - -```objc -- (void)pagerViewDidEndDecelerating:(FSPagerView *)pagerView; -``` -> Tells the delegate that the pager view has ended decelerating the scrolling movement. - ---- - -## <a id="support"></a>Support this repo -* ***Star*** this repo <a href="#"><img style="margin-bottom:-12px" width="72" alt="star" src="https://cloud.githubusercontent.com/assets/5186464/15383105/fcf9cdf0-1dc2-11e6-88db-bf221042a584.png"></a> -<br/> - -* Buy me a ***Coffee***. â˜•ï¸ - - <a href="https://www.paypal.me/WenchaoD" target="_blank"><img src="https://www.paypalobjects.com/webstatic/i/logo/rebrand/ppcom.svg" width="100" height="40" style="margin-bottom:-15px;"></a> | - <a href="https://user-images.githubusercontent.com/5186464/45949944-46960480-c030-11e8-9e90-30b015698cf6.png" target="_blank"><img src="http://a1.mzstatic.com/us/r30/Purple49/v4/50/16/b3/5016b341-39c1-b47b-2994-d7e23823baed/icon175x175.png" width="40" height="40" style="margin-bottom:-15px;-webkit-border-radius:10px;border:1px solid rgba(30, 154, 236, 1);"></a> | - <a href="https://cloud.githubusercontent.com/assets/5186464/15096872/b06f3a3a-153c-11e6-89f9-2e9c7b88ef42.png" target="_blank"><img src="http://a4.mzstatic.com/us/r30/Purple49/v4/23/31/14/233114f8-2e8d-7b63-8dc5-85d29893061e/icon175x175.jpeg" height="40" width="40" style="margin-bottom:-15px; -webkit-border-radius: 10px;border:1px solid rgba(43, 177, 0, 1)"></a> - ---- - -## Author -* ***å¾®åšï¼š[@WenchaoD](http://weibo.com/WenchaoD)*** -* ***Twitter: [@WenchaoD](https://twitter.com/WenchaoD)*** -* Other repos: - * ***[FSCalendar](https://github.com/WenchaoD/FSCalendar)*** - ---- - -# [Documentation](http://cocoadocs.org/docsets/FSPagerView) \ No newline at end of file diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index d3193b9f9bdd6603acd0c752afb29ef569cc4bec..6649453d01ac2fa8903135f6c0e524589e24e832 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,6 +1,5 @@ PODS: - EPSignature (1.0.6) - - FSPagerView (0.8.3) - ImagePicker (3.2.0) - IQKeyboardManagerSwift (7.0.3) - LanguageManager-iOS (1.2.7) @@ -8,7 +7,6 @@ PODS: DEPENDENCIES: - EPSignature - - FSPagerView - ImagePicker - IQKeyboardManagerSwift - LanguageManager-iOS @@ -17,7 +15,6 @@ DEPENDENCIES: SPEC REPOS: trunk: - EPSignature - - FSPagerView - ImagePicker - IQKeyboardManagerSwift - LanguageManager-iOS @@ -25,12 +22,11 @@ SPEC REPOS: SPEC CHECKSUMS: EPSignature: 3fa3b520c80717b98019723faa60a41794b03fbc - FSPagerView: 670405b2f18e2a87fa37f20b00de783e562c25a8 ImagePicker: 1d950bbb2422548ed58791b4ec7f42fe42920511 IQKeyboardManagerSwift: f9c5dc36cba16ddd2e51fa7d51c34a2e083029b5 LanguageManager-iOS: 6b2dbb3793445827114708f0759b76e96932d7c8 NBBottomSheet: aa7a52809b2d7b193f733247b8ce391a59904372 -PODFILE CHECKSUM: 23ea4bb572ed7de088aee5894c2fe160357b3d96 +PODFILE CHECKSUM: 55e1d258d6921724b2dcc8fa7966f2e028ae9600 COCOAPODS: 1.14.3 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 47cd7ab490ce3033e144c8d8f518d9992f50d658..a55087a99045387c88186777cc6bd2cc6e56ec0a 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,368 +7,338 @@ objects = { /* Begin PBXBuildFile section */ - 014ADEB344680FBC5C6D76E16B255CAC /* Pods-MiniScanner-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 123ADF4A6B2F1DEBA5B7482D4983B685 /* Pods-MiniScanner-dummy.m */; }; - 028F3BD1F76536182769D7FA2BB26457 /* ImageStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47978E33AA1FE786BB675EA3F66DE381 /* ImageStack.swift */; }; - 047539EBA967BC7505B53F36E1A2836A /* focusIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2A1F3E9AD6E574C81576EFC109E4F56 /* focusIcon@3x.png */; }; - 0615219BFD2EBBE27FF41C2C8816791E /* IQTextFieldViewInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 309F127A50B023B6041C44942C9079DE /* IQTextFieldViewInfo.swift */; }; - 0718CCD0E19136B8DB2A7D4C6585E3ED /* LanguageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8434491D5623794FFD75623AC5720E3C /* LanguageManager.swift */; }; - 08822D4E49DB8618D27BAEDED7911733 /* IQKeyboardManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = A230ED28736A611DEEC851620E6444DE /* IQKeyboardManager+Internal.swift */; }; - 08C234F2981017EEF271582022F339F3 /* IQUIView+IQKeyboardToolbarDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A7457CB008481373FBC626968AD770 /* IQUIView+IQKeyboardToolbarDeprecated.swift */; }; - 0A4DB572ACD97EC492C4E93A0FFB2E47 /* IQTextFieldViewListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DB66972AE146B779F56CFD49B324220 /* IQTextFieldViewListener.swift */; }; - 0C99571A708CA382A984BDEDA5AE25D5 /* selectedImageGallery@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6214DC5E72470BE3105210D7465B90A /* selectedImageGallery@3x.png */; }; - 1021FCA162D086E55DE8D6926F8DA215 /* ImageGalleryViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 689EF9768E3E18B833DD776EAD893408 /* ImageGalleryViewCell.swift */; }; - 103FE4EEFF1BE8BAD0FA047987AFED74 /* IQUIView+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE1348270A5A7F3FDEFAC32D8E89686A /* IQUIView+Hierarchy.swift */; }; - 10D1A87F45AFB52D2B34D9ABA1A86105 /* UIImageView+Direction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5761D7B5C5A856ED4D8A03F284C8771F /* UIImageView+Direction.swift */; }; - 14063E1AF70EDDC9F33C8E08DCA0BEF3 /* IQPreviousNextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7235727A466A9B7BF8342CC42C4B91 /* IQPreviousNextView.swift */; }; - 14638F89550DD287F122C4C8968289F4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C54FCF3DBFE97D4603C0EACF18FA0D04 /* Foundation.framework */; }; - 154362EFC8EC0F61F54E24B09266DEB1 /* IQKeyboardReturnKeyHandler+TextFieldDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7136D2DF9E35BE04AE50612BF8809136 /* IQKeyboardReturnKeyHandler+TextFieldDelegate.swift */; }; - 178BF9CAADACBF4E8FE49574A848C12A /* NBBottomSheetPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C5B4DA5F338896C639DBDA08FCCC486 /* NBBottomSheetPresentationController.swift */; }; - 1948830F0F143F2897657B9D75895EFA /* VideoInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA1D8FBFBA4E4BE6EC7D55255DE3EFBC /* VideoInfoView.swift */; }; - 1A7787DB0275CF4A44CA312DD3BA5D33 /* EPSignatureViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2D93C4B3BEDE27E7A936E76984B03C35 /* EPSignatureViewController.xib */; }; + 028F3BD1F76536182769D7FA2BB26457 /* ImageStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7EA56260324998EC43B70CD2092E1FB /* ImageStack.swift */; }; + 0615219BFD2EBBE27FF41C2C8816791E /* IQTextFieldViewInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34B4735C7461EBF9AEEC896DEB27C33 /* IQTextFieldViewInfo.swift */; }; + 0718CCD0E19136B8DB2A7D4C6585E3ED /* LanguageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8292FC683D8C22C77C5F637AF2836FA /* LanguageManager.swift */; }; + 08822D4E49DB8618D27BAEDED7911733 /* IQKeyboardManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB94CC5B3F453AA0801700167152FCA1 /* IQKeyboardManager+Internal.swift */; }; + 08C234F2981017EEF271582022F339F3 /* IQUIView+IQKeyboardToolbarDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E6FDE31134B7541747D1E89E52E225A /* IQUIView+IQKeyboardToolbarDeprecated.swift */; }; + 09F4E3A6DED312368CE8E037A171BD70 /* selectedImageGallery@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 081BAFFE15D81F33E77489E60A036BE7 /* selectedImageGallery@3x.png */; }; + 0A4DB572ACD97EC492C4E93A0FFB2E47 /* IQTextFieldViewListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F6826627BFA6A69002524426F8CFFB7 /* IQTextFieldViewListener.swift */; }; + 1021FCA162D086E55DE8D6926F8DA215 /* ImageGalleryViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AC4CEA5F2332B5B286CA6B73D2643EF /* ImageGalleryViewCell.swift */; }; + 103FE4EEFF1BE8BAD0FA047987AFED74 /* IQUIView+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55EBF017F6625B593286F47CFEB1FA3 /* IQUIView+Hierarchy.swift */; }; + 10D1A87F45AFB52D2B34D9ABA1A86105 /* UIImageView+Direction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7927C464AC094A95C8B864DF6A0B1D06 /* UIImageView+Direction.swift */; }; + 14063E1AF70EDDC9F33C8E08DCA0BEF3 /* IQPreviousNextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 187B8EDBE8957C190B1EB7C8F949ED80 /* IQPreviousNextView.swift */; }; + 154362EFC8EC0F61F54E24B09266DEB1 /* IQKeyboardReturnKeyHandler+TextFieldDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F0A5164AA0CCC729C8EA5166760BA9E /* IQKeyboardReturnKeyHandler+TextFieldDelegate.swift */; }; + 178BF9CAADACBF4E8FE49574A848C12A /* NBBottomSheetPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1D47766C4492BAF84E069DF6E3DD758 /* NBBottomSheetPresentationController.swift */; }; + 1948830F0F143F2897657B9D75895EFA /* VideoInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02E924FDDE7F7B51AEC552C94D9C9AD6 /* VideoInfoView.swift */; }; + 19BA03143F6B7CCC7F6D3A5000333763 /* ON@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7488E11EF92CBFCB3965EA6F8020E701 /* ON@3x.png */; }; + 1A7787DB0275CF4A44CA312DD3BA5D33 /* EPSignatureViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 56C1C453B74E770D4AC56A090051BCF5 /* EPSignatureViewController.xib */; }; + 1B1937CEB4E9DF65238702771B4232B4 /* video@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 45C50C21EF30A0239628BA0E14464BCE /* video@3x.png */; }; 1BBD42E84E62842B6EA186CEF24BBF45 /* ImagePicker.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 97AA160F23F0CBEDDAF212103E762FC7 /* ImagePicker.bundle */; }; - 1BBED45FEDD4AF437A762909E4937019 /* CameraMan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B78794BA632342FFC447557E4671B16 /* CameraMan.swift */; }; - 1C3881B0113D3219398154E16AA4413C /* IQKeyboardReturnKeyHandler+TextViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C332B0108C87436290C293E043023A /* IQKeyboardReturnKeyHandler+TextViewDelegate.swift */; }; - 1D5090C638CFC6ABA603A73B2D890CC7 /* Helper.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB2BF5C6F33D3DA91B2EB11B23EEE3FE /* Helper.swift */; }; + 1BBED45FEDD4AF437A762909E4937019 /* CameraMan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297D96869095AA06F276F3DA5DD575B7 /* CameraMan.swift */; }; + 1C3881B0113D3219398154E16AA4413C /* IQKeyboardReturnKeyHandler+TextViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5EDE1D4720CA7A048A32667F968ED10 /* IQKeyboardReturnKeyHandler+TextViewDelegate.swift */; }; + 1D5090C638CFC6ABA603A73B2D890CC7 /* Helper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8016BAC4075F40E70BE2133125B01BF5 /* Helper.swift */; }; + 1ECC8F5583B658DA5BC4F8D29132213F /* Pods-MiniScanner-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 123ADF4A6B2F1DEBA5B7482D4983B685 /* Pods-MiniScanner-dummy.m */; }; 23D11E770DF137CBF802A30E2B19C054 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C54FCF3DBFE97D4603C0EACF18FA0D04 /* Foundation.framework */; }; - 24C699F9653980B77F44634EF44641C1 /* IQKeyboardInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69FC816770553B761090561AE8707674 /* IQKeyboardInfo.swift */; }; - 267C4C6C182CC853990C78F13C5318CE /* TopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FF2B9AD02F97A175585504BA5B7F448 /* TopView.swift */; }; - 29C03EAF5C27DC851118AEC88ABEC151 /* FSPagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3703BDC76205E7D102F2BF32B3D8ACC /* FSPagerView.swift */; }; - 2E4A914423BA1B263C96C3BBC43E2245 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C63F26DA7ECAFB44B0A5DD0BC0E2F89 /* UIKit.framework */; }; - 2F7AE7DED85C12F45995DA2DF033641C /* ON@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = BC0F20E077483A5E6339C4C6304E6507 /* ON@3x.png */; }; - 3402A26F7BBA359E410BEB33C8B74254 /* NBBottomSheetTransitioningDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BB9A00426C7107F694592F19527BE69 /* NBBottomSheetTransitioningDelegate.swift */; }; - 3452528F3B9B79AD67D45FEA174F71E4 /* IQUICollectionView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4C85B9AE116359EBFD1959406B32999 /* IQUICollectionView+Additions.swift */; }; - 34BDB069A96125DAF2FEF6FF93A3F6AF /* IQToolbarPlaceholderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92CEF8FFA7885B7EC96C4120D507A08F /* IQToolbarPlaceholderConfiguration.swift */; }; - 35699581E68E1E6F640C681EEDEEE2B6 /* EPSignature-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A7BA040D977C503D2A8C2D9BF404E21C /* EPSignature-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3573FA382FBE08F99039CED491DB9FF0 /* IQKeyboardManagerSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C94B5C4512123F377D23B93F1FA23097 /* IQKeyboardManagerSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3806469B2739BBFA16083760004ED9B4 /* ImageGalleryViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = E62A4882567E433682E9D7925C2BDA73 /* ImageGalleryViewDataSource.swift */; }; - 38CBE3196BDD577B5E72BC65508A77F8 /* IQTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B5D88BFE14997FA9B22FA4A4B8CD6DA /* IQTextView.swift */; }; - 38FD95DCC2D02D5B78BE9AEE48DBDF25 /* ConstraintsSetup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E44A8883A35E6A01365B1C682A1164D /* ConstraintsSetup.swift */; }; + 24C699F9653980B77F44634EF44641C1 /* IQKeyboardInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F3317C2A83E43FF75DFCFD3FAEB3669 /* IQKeyboardInfo.swift */; }; + 267C4C6C182CC853990C78F13C5318CE /* TopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B71FD6B5A8AC626259BE6B97226F81FB /* TopView.swift */; }; + 28658B67B33D0AF1A396F70CF4C416FD /* cameraIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 843CD6046BA80BCDF11AE4FAC807D29B /* cameraIcon@3x.png */; }; + 3402A26F7BBA359E410BEB33C8B74254 /* NBBottomSheetTransitioningDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7F7A4EA7A5659C2F78D04CC218E1440 /* NBBottomSheetTransitioningDelegate.swift */; }; + 3452528F3B9B79AD67D45FEA174F71E4 /* IQUICollectionView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92470A870676C63A27509F38301D521C /* IQUICollectionView+Additions.swift */; }; + 34BDB069A96125DAF2FEF6FF93A3F6AF /* IQToolbarPlaceholderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3B5F550C3AA900D117E22291DE5D67C /* IQToolbarPlaceholderConfiguration.swift */; }; + 35699581E68E1E6F640C681EEDEEE2B6 /* EPSignature-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A36BA6D882CE68172CAE63D99BCB5BA /* EPSignature-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3573FA382FBE08F99039CED491DB9FF0 /* IQKeyboardManagerSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8147290C4A326DADC3F305533BD64023 /* IQKeyboardManagerSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3806469B2739BBFA16083760004ED9B4 /* ImageGalleryViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5054DCBC2013F1894FA0EE7D6D99005 /* ImageGalleryViewDataSource.swift */; }; + 38CBE3196BDD577B5E72BC65508A77F8 /* IQTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A6291B42FA169A1C1919CB49B0B8509 /* IQTextView.swift */; }; + 38FD95DCC2D02D5B78BE9AEE48DBDF25 /* ConstraintsSetup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290501CF6F70FA1835207284AF05BEE5 /* ConstraintsSetup.swift */; }; 3CCAA73182C09F77A88AFFA24E96DBB6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C54FCF3DBFE97D4603C0EACF18FA0D04 /* Foundation.framework */; }; - 3E21C9612D00C6B92D3FCE3589917729 /* UIView+Direction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 586B6FC37EB8231AC7C24C1CC2776384 /* UIView+Direction.swift */; }; - 4017CF2B3EE45E7E579E68E6FCFBF732 /* IQKeyboardManager+UIKeyboardNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A5338232CA701AD47A2EA3B534BD224 /* IQKeyboardManager+UIKeyboardNotification.swift */; }; - 40987E046BAD603A58CA00B9A7648588 /* FSPageViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F711A94EB088CF457F893E60C568B4 /* FSPageViewLayout.swift */; }; - 42B931814C7B25871333D5DA9A0E2A41 /* IQKeyboardReturnKeyHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = E21781AECFBC7371F2118155ACE5C3C7 /* IQKeyboardReturnKeyHandler.swift */; }; - 4695B952627B345252A52CB26B7747CC /* OFF@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 2E2B400DD678EA303FAFFBEF32CBCA41 /* OFF@3x.png */; }; - 488A767CF7494D169BFB886EDC470F5D /* FSPageViewTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B909C40450F7213C478AE50F7E2D18A9 /* FSPageViewTransformer.swift */; }; - 48A4D5E4D954CB4212E540A92570BBF0 /* UIView+Swizzling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EF3F9326AE21BCEED16E14D0872FE9C /* UIView+Swizzling.swift */; }; + 3E21C9612D00C6B92D3FCE3589917729 /* UIView+Direction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B432B6773BE3F0B4A6976820602F07A /* UIView+Direction.swift */; }; + 4017CF2B3EE45E7E579E68E6FCFBF732 /* IQKeyboardManager+UIKeyboardNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DB0BCD57E720CE97C1C3CE74B75024 /* IQKeyboardManager+UIKeyboardNotification.swift */; }; + 42B931814C7B25871333D5DA9A0E2A41 /* IQKeyboardReturnKeyHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC4B66ABF37EFD118BC08264BBCA6461 /* IQKeyboardReturnKeyHandler.swift */; }; + 48A4D5E4D954CB4212E540A92570BBF0 /* UIView+Swizzling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 252B706186B99322E0DA5829FCC7D43C /* UIView+Swizzling.swift */; }; 4CDBAE55660ED186441E9E4EDE6B3D31 /* IQKeyboardManagerSwift.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift.bundle */; }; - 50374D59C8ED3AE3E41C30F25859F981 /* ImagePickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21142CC27FC93E41241CC8948B1EE25C /* ImagePickerController.swift */; }; - 54BAE903D82C39392943869866252D93 /* IQNSArray+Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DC2A0ED79E1179E28CE75BFECCDA82 /* IQNSArray+Sort.swift */; }; - 597994C3AE8908B1E462BC03AC8C23FB /* IQKeyboardManagerCompatible.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5483FEE1B87041C4751EA1D4F3EF54 /* IQKeyboardManagerCompatible.swift */; }; + 50374D59C8ED3AE3E41C30F25859F981 /* ImagePickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9067705903BD2E8C3EC9BD8EBF709221 /* ImagePickerController.swift */; }; + 54BAE903D82C39392943869866252D93 /* IQNSArray+Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62160BE00E3966D4D52808B89DE0B1B3 /* IQNSArray+Sort.swift */; }; + 597994C3AE8908B1E462BC03AC8C23FB /* IQKeyboardManagerCompatible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49FC6FE3F43F76CA598D3253A1731EEB /* IQKeyboardManagerCompatible.swift */; }; + 5C4E571F3ADE020356DAF5143816FC55 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = A532EFEAAE9EEAA7CFA7DF04C7E1808B /* PrivacyInfo.xcprivacy */; }; 5D35C19C362961F919BE9820991D761E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C54FCF3DBFE97D4603C0EACF18FA0D04 /* Foundation.framework */; }; - 5F0469C5B154DC20B844EA2A9B7F8D42 /* IQPlaceholderable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE58805A3FAC71C6A5782C1B1BB08069 /* IQPlaceholderable.swift */; }; - 5F62DAE67CF97B7C42471EA91B79AA9A /* IQTextFieldViewInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23B7EBFBD51FC4710CDE4AFAE46E8860 /* IQTextFieldViewInfoModel.swift */; }; - 61A0C05934861A0EACC1549F2419289A /* AUTO@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 664FCD8539D02C2C7ABBA15E9666F2B9 /* AUTO@3x.png */; }; - 6418A8A5D32E73D898AB155952180B0C /* LanguageManager-iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4B76FEC2A143DA2EFFC6D3F7FB7B5A /* LanguageManager-iOS-dummy.m */; }; - 674C6B2E317E657D8EAD3CC73F608540 /* IQKeyboardManager+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEB26DB8656A60C8AE2B83EF56A1149 /* IQKeyboardManager+Debug.swift */; }; - 69C7244F5E0D41CF59E5ADC8952F8D0D /* FSPagerViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842BA45676E86EFC650EFC7B33D1572F /* FSPagerViewCell.swift */; }; - 6D55C34EF7CE4718D8B2FE6CE95C5674 /* DefaultsKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615EB6B3844737F49004E6E4A8F968A0 /* DefaultsKeys.swift */; }; - 6F875A0983E3FB0E0CC0BDA6376F73E8 /* String+Localiz.swift in Sources */ = {isa = PBXBuildFile; fileRef = 398208613C39BD5EF043841FA4CBF884 /* String+Localiz.swift */; }; - 6FAA62F8C663AAEDAB170956E9A298CC /* ImageGalleryLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54A9B08BB29EC7935F6A8F8ACD56BEB0 /* ImageGalleryLayout.swift */; }; - 701904768C60A3F9060518DD58EC2882 /* IQToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 926EAAA6426204DE1DF8D36D2E13EA74 /* IQToolbar.swift */; }; - 71B7397ADA300CDE41CB406BE694A8A2 /* cameraIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F9A6C68497A6CFFB3FAA52682750752 /* cameraIcon@3x.png */; }; - 733CF7F19636AFF4A97708DFDE0AE53C /* IQKeyboardManagerSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BA790DC54E7A009FDDBBC07056093C41 /* IQKeyboardManagerSwift-dummy.m */; }; - 7399F0854271981516AA79727A0A06C8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C54FCF3DBFE97D4603C0EACF18FA0D04 /* Foundation.framework */; }; - 743ED1DCEC16DC2E7FAD8FBDD276EC8F /* ImagePicker-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DD48D4FC5BD3A99772F4FE6FDB643898 /* ImagePicker-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5F0469C5B154DC20B844EA2A9B7F8D42 /* IQPlaceholderable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3DC4A4D35E057E5F76427C838E3E495 /* IQPlaceholderable.swift */; }; + 5F62DAE67CF97B7C42471EA91B79AA9A /* IQTextFieldViewInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00AA2070B1A7F8ECC88B6E7F0EEB2167 /* IQTextFieldViewInfoModel.swift */; }; + 6418A8A5D32E73D898AB155952180B0C /* LanguageManager-iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BF809679D3CFFBC72878EC9BFEA90F5E /* LanguageManager-iOS-dummy.m */; }; + 674C6B2E317E657D8EAD3CC73F608540 /* IQKeyboardManager+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B1D47B8C43A0DA0A05A410655A28153 /* IQKeyboardManager+Debug.swift */; }; + 6D55C34EF7CE4718D8B2FE6CE95C5674 /* DefaultsKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DDA4537FCBE11326C1D65EA43B3CC6D /* DefaultsKeys.swift */; }; + 6F875A0983E3FB0E0CC0BDA6376F73E8 /* String+Localiz.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D01E52DE74EF3C733B94F1E045CCD77 /* String+Localiz.swift */; }; + 6FAA62F8C663AAEDAB170956E9A298CC /* ImageGalleryLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84969C2137D2629DFFC29942F8B97FEB /* ImageGalleryLayout.swift */; }; + 701904768C60A3F9060518DD58EC2882 /* IQToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76805C9416BA1FC318E025ACA3B95EF /* IQToolbar.swift */; }; + 733CF7F19636AFF4A97708DFDE0AE53C /* IQKeyboardManagerSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D4270A3541F22B881BD953A68F6E73F9 /* IQKeyboardManagerSwift-dummy.m */; }; + 743ED1DCEC16DC2E7FAD8FBDD276EC8F /* ImagePicker-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FDF5381B2554B2BB1D7949E3B9A7DF79 /* ImagePicker-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7586D1882B962E1E31C28CC6396668B3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C63F26DA7ECAFB44B0A5DD0BC0E2F89 /* UIKit.framework */; }; - 784DF7F278DC988FEEECB999A9ADFCBB /* BottomContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A4F7BDE573EF1AD77F082087EBBC731 /* BottomContainerView.swift */; }; - 797DF46337EAC66E47C5ADAF32515524 /* NBBottomSheet.h in Headers */ = {isa = PBXBuildFile; fileRef = E711836675BD919C63BEB7A0930B72B4 /* NBBottomSheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 784DF7F278DC988FEEECB999A9ADFCBB /* BottomContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F84A913AFEF518DF42A997F74EC8260 /* BottomContainerView.swift */; }; + 797DF46337EAC66E47C5ADAF32515524 /* NBBottomSheet.h in Headers */ = {isa = PBXBuildFile; fileRef = C6AEEFA5613E0B7BF8F6425A154D6EC9 /* NBBottomSheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7B2263CFC47393D3FB5CD8D5F7EB57AD /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C63F26DA7ECAFB44B0A5DD0BC0E2F89 /* UIKit.framework */; }; - 7DB7E0E519A315B78D72BF7C63C64E30 /* ButtonPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B021EB40B85B76049C30C2D063F0870D /* ButtonPicker.swift */; }; - 8086BD2DB5F1A0CC88E4F3386570A21C /* IQUITextFieldView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79655C283B54B5F907790F4E79C388EF /* IQUITextFieldView+Additions.swift */; }; - 8234444617FD513B81095D920BFA796B /* NBConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C698FD30D248D272DAE2F242C5D62EA2 /* NBConfiguration.swift */; }; - 82950EE4BDD57F74749742A3E1566073 /* IQKeyboardManager+UITextFieldViewNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFB4A164AE952F817BA0A6FCE622791 /* IQKeyboardManager+UITextFieldViewNotification.swift */; }; - 829A79A8C324697D5A619C029AEB0063 /* CameraView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 343F83F1A08E56F19D01674A9BA4DC53 /* CameraView.swift */; }; - 852E6AB133CF7BDE7DE7D836AE201868 /* Languages.swift in Sources */ = {isa = PBXBuildFile; fileRef = CACF959977B91C5F65F381B36C452B6D /* Languages.swift */; }; - 8EAF267614A5AB6196921C15E719AE35 /* NBBottomSheetDismissalTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1DF93E2C3692DABCE7DF9D4735D2645 /* NBBottomSheetDismissalTransition.swift */; }; - 8ED2E941DF0803C8AA331D0D8C722615 /* IQBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065FDC013F6128B451B9F622F8A98C11 /* IQBarButtonItem.swift */; }; - 8FDA28363A5E49017498FD69AAA8F59F /* IQKeyboardListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1BD1A58666D6C0FD408F4DB3ADC8107 /* IQKeyboardListener.swift */; }; - 907FCA3049CAAF64B579D08D339D118D /* IQBarButtonItemConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DA62F8724EC161B523761C4D312EE6A /* IQBarButtonItemConfiguration.swift */; }; - 91611428D06F5E61CECF70A53E6DA6C6 /* FSPagerViewObjcCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = F047971CD665BC407A8DAA32AD3A9B98 /* FSPagerViewObjcCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 93C0AD77AB416AE90A6BD03E44A9B684 /* EPSignature-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B3FCB83859385DB3694F04D44B40FE18 /* EPSignature-dummy.m */; }; - 94F893223EB4C1C0F829C17900114AFA /* IQUIScrollView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A8D208D764CFAC89604E6813F1444E /* IQUIScrollView+Additions.swift */; }; - 9517FE286FAA3C856DC6C1B6F91F48CF /* Pods-MiniScanner-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E8A070B594D65627DD64F5ABC65D271 /* Pods-MiniScanner-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 960957461D403847E92AF1825B4D8506 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B638343F1BC71A9A9CD3A6D6CA749DC7 /* PrivacyInfo.xcprivacy */; }; + 7DB7E0E519A315B78D72BF7C63C64E30 /* ButtonPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4648CA1088D11129C0BDD49912D6FAB /* ButtonPicker.swift */; }; + 8086BD2DB5F1A0CC88E4F3386570A21C /* IQUITextFieldView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 116DA05004680C76EAB707C0943392EB /* IQUITextFieldView+Additions.swift */; }; + 8234444617FD513B81095D920BFA796B /* NBConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD46A963E6CCE8CD900BA8A7331D7D8C /* NBConfiguration.swift */; }; + 82950EE4BDD57F74749742A3E1566073 /* IQKeyboardManager+UITextFieldViewNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0DA73612FA4F954FCE02EA0ADACE634 /* IQKeyboardManager+UITextFieldViewNotification.swift */; }; + 829A79A8C324697D5A619C029AEB0063 /* CameraView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC2ECE9C7A88988A534C8F7590F3AB64 /* CameraView.swift */; }; + 852E6AB133CF7BDE7DE7D836AE201868 /* Languages.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2B28EA5FE2C09FCEF4DF47D34186FB7 /* Languages.swift */; }; + 8AE718666177B657AE0BBD08AF829DD1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C54FCF3DBFE97D4603C0EACF18FA0D04 /* Foundation.framework */; }; + 8D935C83E5D7B42A4C6439FFA767CE24 /* AUTO@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = EB8D9081C43164E02C60F65C02702B8E /* AUTO@3x.png */; }; + 8EAF267614A5AB6196921C15E719AE35 /* NBBottomSheetDismissalTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97037D70AD7F37FBCDB7561DA20D7D2D /* NBBottomSheetDismissalTransition.swift */; }; + 8ED2E941DF0803C8AA331D0D8C722615 /* IQBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88000230AEFE1CF1FC184347AAE598B /* IQBarButtonItem.swift */; }; + 8FDA28363A5E49017498FD69AAA8F59F /* IQKeyboardListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 400224F8C71E7053C79E8D5E509534F4 /* IQKeyboardListener.swift */; }; + 907FCA3049CAAF64B579D08D339D118D /* IQBarButtonItemConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 419AB69B674D6C318AC58EE6D9AFF102 /* IQBarButtonItemConfiguration.swift */; }; + 93C0AD77AB416AE90A6BD03E44A9B684 /* EPSignature-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E24E6B8D32E615F0FEF0A78F3C181A09 /* EPSignature-dummy.m */; }; + 94F893223EB4C1C0F829C17900114AFA /* IQUIScrollView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B5E1D310DD754E122DEEE009481A2D6 /* IQUIScrollView+Additions.swift */; }; 98A4D0D5928A35C7DB3D9272187789A8 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F3DF46AD6E25D68DB361974528992221 /* CoreGraphics.framework */; }; - 9A00A25ED34A7687C62B02EBB76C1248 /* IQKeyboardConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B700D2C4CED5ED22050429C7997CF1FE /* IQKeyboardConfiguration.swift */; }; - 9E704111CAAACBF64155A576FC337323 /* LanguageManager-iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ED50ABC97C7298629CFFE2835E5645AE /* LanguageManager-iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9F78D56352F7D932DCEBE416C668C7BA /* IQKeyboardManager+ToolbarActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F23D0E0AE3BDC7AE6A7D331A0FF5AF6 /* IQKeyboardManager+ToolbarActions.swift */; }; - A4AE2538C33D06CB8C70D5FF35A65D98 /* EPSignatureViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF61B6A70C39B0ACDA33B583642A26EE /* EPSignatureViewController.swift */; }; - A5E69CC013C4311C8AF52C7F7AB095C9 /* IQUITableView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6F5B0BFC63CD2F3B0DF56912D4F54E8 /* IQUITableView+Additions.swift */; }; - AE7D065E1D48171258FD8F07F7CD592C /* IQKeyboardManagerConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC43EDC562847626ACF7B4E93E5462EF /* IQKeyboardManagerConstants.swift */; }; - AF715064CF6458D3D89BB563DFDB00C6 /* UIButton+Direction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4D36302D2F7234AEEC28003C3244EB4 /* UIButton+Direction.swift */; }; - B0E87F4E370B3A0CD14B50D219AE7B0B /* StackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8CA0DD8AA6C4033E65CAA6FE83870F1 /* StackView.swift */; }; + 9A00A25ED34A7687C62B02EBB76C1248 /* IQKeyboardConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297848FCF8FE33D0DA0FDA6C8B1F5CC3 /* IQKeyboardConfiguration.swift */; }; + 9E704111CAAACBF64155A576FC337323 /* LanguageManager-iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3510141CBBD30B465F757E0A8E2B1097 /* LanguageManager-iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9F78D56352F7D932DCEBE416C668C7BA /* IQKeyboardManager+ToolbarActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9651F46100B3C105EE27B92C1DFFCEC /* IQKeyboardManager+ToolbarActions.swift */; }; + A213B981B47C6B4734589B6ED9469132 /* OFF@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 18CC4F437D7A0F3454C4F89BD6CE0AEC /* OFF@3x.png */; }; + A4AE2538C33D06CB8C70D5FF35A65D98 /* EPSignatureViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A5BF586C35098EC908E7870B407170 /* EPSignatureViewController.swift */; }; + A5E69CC013C4311C8AF52C7F7AB095C9 /* IQUITableView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 619978A0C0036454C22A81173BAA5A6A /* IQUITableView+Additions.swift */; }; + AE7D065E1D48171258FD8F07F7CD592C /* IQKeyboardManagerConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9F19506C84032240A21541F9EFCA895 /* IQKeyboardManagerConstants.swift */; }; + AF715064CF6458D3D89BB563DFDB00C6 /* UIButton+Direction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4E6D4AE8BCE2646794F28F0E24A08D1 /* UIButton+Direction.swift */; }; + B0E87F4E370B3A0CD14B50D219AE7B0B /* StackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 467961922684B2F4C4295CBE0C9CD940 /* StackView.swift */; }; B1A786B1A2F11EBD1BF77305EEB710F5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2EE6749FC108D414ECB83B77EF11BD86 /* QuartzCore.framework */; }; - B1BFC54288364884DDEAE75027BABE1A /* IQActiveConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 831781174B420BA2000C5A20F9B1A155 /* IQActiveConfiguration.swift */; }; - B9CF878085ABA2991A9C6F12F9B9DAB3 /* IQTitleBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DB37A30323A7D2ED16581BA15B8351D /* IQTitleBarButtonItem.swift */; }; + B1BFC54288364884DDEAE75027BABE1A /* IQActiveConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FE3DE7F264E30C392DCECA7921DAEF2 /* IQActiveConfiguration.swift */; }; + B9CF878085ABA2991A9C6F12F9B9DAB3 /* IQTitleBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = A100F9EA89810A00541755ECD7BBB307 /* IQTitleBarButtonItem.swift */; }; BD0139B5F1C96514CB66C4310AAF1DF5 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B28C4E9F718651E6E1B010F31566EB /* AVFoundation.framework */; }; - C116540980BCB8D0E54215D9E8C7AD78 /* video@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5D646977F7C0DA29D63C4E18D9DD6630 /* video@3x.png */; }; - C85C11573FFE927A84AD0C8BE456AD81 /* FSPagerViewLayoutAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891FABB9A51285F499148E921B1A8E24 /* FSPagerViewLayoutAttributes.swift */; }; - CA6D6333D723B4391BD689F68FCF23DF /* EPSignatureView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE559964BD58119769FB19BB95144A6A /* EPSignatureView.swift */; }; - CA8CFC49D2338D41DA4E83F941867CEB /* ImagePicker-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AAF24BB95964A47FF71115DCACE5CC1 /* ImagePicker-dummy.m */; }; + C884AFFEC6B0F6540E8A5593250D5741 /* Pods-MiniScanner-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E8A070B594D65627DD64F5ABC65D271 /* Pods-MiniScanner-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CA6D6333D723B4391BD689F68FCF23DF /* EPSignatureView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 452182903F9A76184461CC377DB62A70 /* EPSignatureView.swift */; }; + CA8CFC49D2338D41DA4E83F941867CEB /* ImagePicker-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FD2850880C4A8033AED333F5DFAE328 /* ImagePicker-dummy.m */; }; CC897E71556348377B4C31307E208C80 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C54FCF3DBFE97D4603C0EACF18FA0D04 /* Foundation.framework */; }; - CC96488C33BFB3BCEE4A665A438CAC36 /* IQUIViewController+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B35CF76304163C551A5E4B592066D0D /* IQUIViewController+Additions.swift */; }; - CE2C6FD104092EA3F2F0A357C72460A8 /* FSPagerView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 01ACC366C89CCCD7C9CF3E69462AC2A7 /* FSPagerView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D2A598E7174826A7B04036E7AC8AA3B6 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D0027E6314671B943C4497115466711 /* Storage.swift */; }; - D3D1F63C30E95311B687FA924B872C15 /* IQKeyboardManager+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2207491E92F152C27D2B4A764A6A93 /* IQKeyboardManager+Deprecated.swift */; }; - D46F90A0F6FC8F1D2AA4129BC2A934DD /* NBBottomSheet-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1935C8E9966B3C94DD69B219D3DBFBD0 /* NBBottomSheet-dummy.m */; }; + CC96488C33BFB3BCEE4A665A438CAC36 /* IQUIViewController+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5598E57D63117C1B54ADBB7A187B232 /* IQUIViewController+Additions.swift */; }; + D2A598E7174826A7B04036E7AC8AA3B6 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB418B4C0BF451B734FFA48AAD9ADF6 /* Storage.swift */; }; + D3D1F63C30E95311B687FA924B872C15 /* IQKeyboardManager+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C5E34F15E4BBDA3480406FF35C1903 /* IQKeyboardManager+Deprecated.swift */; }; + D46F90A0F6FC8F1D2AA4129BC2A934DD /* NBBottomSheet-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AD71C20FAD4FE7E08FA8091857A2FDCB /* NBBottomSheet-dummy.m */; }; D4BB4D928CB44E6CE753BEA14E5AC918 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C54FCF3DBFE97D4603C0EACF18FA0D04 /* Foundation.framework */; }; - D8322CBE73400EE4382D1A042D2D53D3 /* IQUIView+IQKeyboardToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF9BB8A2089DB5AEEA4B43132D0B074 /* IQUIView+IQKeyboardToolbar.swift */; }; - D88C2EA8ACCC0DE031D9E7A768062E2C /* IQKeyboardManager+Toolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88DFD4B8DC15592A7CD38D8AD9C01668 /* IQKeyboardManager+Toolbar.swift */; }; - DE3B5070A41194C21898D92DBFFCBE4C /* IQRootControllerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24533AECDB8F27FACE2D96631FC3F307 /* IQRootControllerConfiguration.swift */; }; - E483FA24409A56AAEDF8A1DEC5F55F16 /* UIImage+NextPrevious.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC7F01FAC278F9B096CFFD78497206CF /* UIImage+NextPrevious.swift */; }; - E8770A941545BB190D76BF7E5262797D /* IQToolbarConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A9AA0FBABA9E9EEF6521C23B2031158 /* IQToolbarConfiguration.swift */; }; - EA280E998F6C42AE8492336F762F92D5 /* EPExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E288979D79A43A7925DB41055CDD376 /* EPExtensions.swift */; }; - EA89DFEFE15FAD82868C74E94F6F1B75 /* FSPagerViewObjcCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = B7F2D378ED96DA779D964000E6DECED9 /* FSPagerViewObjcCompat.m */; }; - EBB5F245DBEEB13D48F09E0DD75A6C95 /* IQKeyboardManager+Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2209E8AC4BD6C9607BD14A1D48B3FBB3 /* IQKeyboardManager+Position.swift */; }; - ECA11CD4E20DFCA3327CB006B10A3DB8 /* FSPagerCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E9452E6ADBDB9FF5D00CEDC3ED637F3 /* FSPagerCollectionView.swift */; }; - ECFE64B0759EFA4F555994B6CDCED624 /* AssetManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F6DD614B85D0662209A3ADCFA367295 /* AssetManager.swift */; }; - F2562CFCEC42E2989BADC7E823F2C9C3 /* FSPageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6D6492D4AE05CD36F797199E44F1805 /* FSPageControl.swift */; }; - F2AF558F96F3C43C3E4C747E45E5637C /* LocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAA72CEA94002E53D03EC7DCC0E59413 /* LocationManager.swift */; }; - F2ED9C9337B84D1E42E67BF7F7DAD72C /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C7704EF389F83C731970D2CDF6595B /* Configuration.swift */; }; - F56475ACE1A1CFE322DBFA35CDA1A204 /* NBBottomSheetConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8059AF588641259180B6DAD45BEF496B /* NBBottomSheetConfiguration.swift */; }; - F6702D89104E55C112FE16943BE7D41A /* FSPagerView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A54F7427340E254B559EC1244CA2E45 /* FSPagerView-dummy.m */; }; - F681FB74C756E0AAFFDC0D414EBD8FA0 /* IQScrollViewConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 545688259B1D4CD8A59AF3D7E0AFE7B9 /* IQScrollViewConfiguration.swift */; }; - F7C3A4FED58118F9ADC5B4AF9A10B9FC /* ViewDirection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EA72F0B0DD57B9D078AF8EFCE412455 /* ViewDirection.swift */; }; - F7E2900D9AF732C627F184A258F48DF0 /* NBBottomSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A60D99B014C4219B8F7BF725B9648E36 /* NBBottomSheetController.swift */; }; - F9DE1A3C506E506F4DA4B7714359E8D1 /* IQKeyboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B4086624F01B0B30DDB90F23478F288 /* IQKeyboardManager.swift */; }; - FB0A76B10B5927494469B16B28CF2B9A /* NBBottomSheetPresentationTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AA92C612F872EADC2BC40A15E01DB23 /* NBBottomSheetPresentationTransition.swift */; }; - FDEFBFB34E35A4BB332264E0CACCF5D8 /* IQInvocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A5E10DAD7E67CBAFB25E12CF020274 /* IQInvocation.swift */; }; - FE4936BFE1B6B6A9E8136010E413A24B /* NBBottomSheet-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 65E35E2A8DCF85A60B0EF9389B0495AE /* NBBottomSheet-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FF8C6AC907C8F4B527F9A0CBDBCC7F92 /* ImageGalleryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5D7D46BA438C135B812D0C145CBE6C /* ImageGalleryView.swift */; }; + D8322CBE73400EE4382D1A042D2D53D3 /* IQUIView+IQKeyboardToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB5F2D5DFB52DE92C94A23801BAC451C /* IQUIView+IQKeyboardToolbar.swift */; }; + D88C2EA8ACCC0DE031D9E7A768062E2C /* IQKeyboardManager+Toolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1229814968DD5876FBA87DDA81C5B8F /* IQKeyboardManager+Toolbar.swift */; }; + DE3B5070A41194C21898D92DBFFCBE4C /* IQRootControllerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 878EC7606D056CAB26A578762AF922D7 /* IQRootControllerConfiguration.swift */; }; + E483FA24409A56AAEDF8A1DEC5F55F16 /* UIImage+NextPrevious.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEB8E045AED5393DCC7FA1C76AB59AB8 /* UIImage+NextPrevious.swift */; }; + E8770A941545BB190D76BF7E5262797D /* IQToolbarConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3243FB397BF2AFE225A1FC09542DBF5D /* IQToolbarConfiguration.swift */; }; + EA280E998F6C42AE8492336F762F92D5 /* EPExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9D8E28679896AEA1627BA66F8580C2 /* EPExtensions.swift */; }; + EBB5F245DBEEB13D48F09E0DD75A6C95 /* IQKeyboardManager+Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05DDE99E61633BB77D72F46FD10F71BC /* IQKeyboardManager+Position.swift */; }; + ECFE64B0759EFA4F555994B6CDCED624 /* AssetManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9E511B375EE87D380DE8D4B00AE28F4 /* AssetManager.swift */; }; + F2AF558F96F3C43C3E4C747E45E5637C /* LocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D01404D467A420F82D2829CE6CD8BB4 /* LocationManager.swift */; }; + F2ED9C9337B84D1E42E67BF7F7DAD72C /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A6AE173040683BAF2BF0ACE7CB13A0A /* Configuration.swift */; }; + F56475ACE1A1CFE322DBFA35CDA1A204 /* NBBottomSheetConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72C2CB61DAC20DBF7210307C41485C5 /* NBBottomSheetConfiguration.swift */; }; + F681FB74C756E0AAFFDC0D414EBD8FA0 /* IQScrollViewConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 486835CC5D14C1EA193F8575CA89FDCC /* IQScrollViewConfiguration.swift */; }; + F7C3A4FED58118F9ADC5B4AF9A10B9FC /* ViewDirection.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC259076A4D444F235DABE44D7425021 /* ViewDirection.swift */; }; + F7E2900D9AF732C627F184A258F48DF0 /* NBBottomSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54323777101C6AB180A413C0B2DB23B9 /* NBBottomSheetController.swift */; }; + F9DE1A3C506E506F4DA4B7714359E8D1 /* IQKeyboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A353C25676960291A3718B5AFDB81A33 /* IQKeyboardManager.swift */; }; + FB0A76B10B5927494469B16B28CF2B9A /* NBBottomSheetPresentationTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00B378319A98BB422CBDBE14796C501A /* NBBottomSheetPresentationTransition.swift */; }; + FDEFBFB34E35A4BB332264E0CACCF5D8 /* IQInvocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A12B5A63F2CB09B7D22B7E2F4A2210EB /* IQInvocation.swift */; }; + FE4936BFE1B6B6A9E8136010E413A24B /* NBBottomSheet-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 389AA43304A03366FC2510859AA7DCBA /* NBBottomSheet-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FF74A846B2EEC0D52379B48D7963D8C0 /* focusIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9FC1B2AF5635D8020B43F30629EC2712 /* focusIcon@3x.png */; }; + FF8C6AC907C8F4B527F9A0CBDBCC7F92 /* ImageGalleryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21D53725C7625527BF97643CF7655C26 /* ImageGalleryView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 0473CB2089AEB22D5A94042369CBE127 /* PBXContainerItemProxy */ = { + 19D95F1858EF2D6E80811860CFD6BF92 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 01CB8D6098C21E12CE735619344DE81E; - remoteInfo = ImagePicker; + remoteGlobalIDString = 727C2007A89D1AD73613E3E2E22998E5; + remoteInfo = NBBottomSheet; }; - 195F278E699A41C19ED473B0310CAC62 /* PBXContainerItemProxy */ = { + 6CD75698768741DC0335DCB2F06CB5BC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 3CAF5EBFE5D1550CFF58AEC93594990A; - remoteInfo = EPSignature; + remoteGlobalIDString = 982A68D37F5DCBC1FC1FDC0BB2F0EB8E; + remoteInfo = "IQKeyboardManagerSwift-IQKeyboardManagerSwift"; }; - 35F75C3FB936C4BE71A7B3A5CE8352DE /* PBXContainerItemProxy */ = { + 8292BF480C5137113C3A6C342933F986 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 75F1EA88CB9544AB5CBE20DEC9A011AE; remoteInfo = "LanguageManager-iOS"; }; - 368B8A0D7A211FB1D8031E50553E22B1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 982A68D37F5DCBC1FC1FDC0BB2F0EB8E; - remoteInfo = "IQKeyboardManagerSwift-IQKeyboardManagerSwift"; - }; - 86BCB3533B3E4CC4A62FDD4F9D7AEF5C /* PBXContainerItemProxy */ = { + D06F098EB5FE1B281549C568AA85EEA9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 614D1818852890AC7D3CDF68D512C370; remoteInfo = "ImagePicker-ImagePicker"; }; - AE6E02E3D311CB4AEC5F673F47B2F7DE /* PBXContainerItemProxy */ = { + D96B4C07AAAD52B947C6F8CFEF7E8807 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = D4F8239FB329387A8476B964D92D92E7; - remoteInfo = FSPagerView; + remoteGlobalIDString = B490E7485944099E16C9CBD79119D1D4; + remoteInfo = IQKeyboardManagerSwift; }; - C3EEE11D57DF83B4A602A0BB6B6D5420 /* PBXContainerItemProxy */ = { + F3097459B372082D9C20BEF06209FBD6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = B490E7485944099E16C9CBD79119D1D4; - remoteInfo = IQKeyboardManagerSwift; + remoteGlobalIDString = 3CAF5EBFE5D1550CFF58AEC93594990A; + remoteInfo = EPSignature; }; - F39E3FCE8EA4C0F8CBCC8FCA9435B319 /* PBXContainerItemProxy */ = { + FBE5961EEB250DF2DACF4F88C36BCC1E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 727C2007A89D1AD73613E3E2E22998E5; - remoteInfo = NBBottomSheet; + remoteGlobalIDString = 01CB8D6098C21E12CE735619344DE81E; + remoteInfo = ImagePicker; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 01ACC366C89CCCD7C9CF3E69462AC2A7 /* FSPagerView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FSPagerView-umbrella.h"; sourceTree = "<group>"; }; - 01FB3E845976BA7356CB95994A0420CD /* IQKeyboardManagerSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardManagerSwift-Info.plist"; sourceTree = "<group>"; }; - 04420AA069E60E2676B1C8145D489AFE /* IQKeyboardManagerSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.release.xcconfig; sourceTree = "<group>"; }; - 065FDC013F6128B451B9F622F8A98C11 /* IQBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQBarButtonItem.swift; path = IQKeyboardManagerSwift/IQToolbar/IQBarButtonItem.swift; sourceTree = "<group>"; }; - 085D4171A3F780C04EFB71FBC8E635E1 /* LanguageManager-iOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "LanguageManager-iOS.modulemap"; sourceTree = "<group>"; }; + 00AA2070B1A7F8ECC88B6E7F0EEB2167 /* IQTextFieldViewInfoModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextFieldViewInfoModel.swift; path = IQKeyboardManagerSwift/ReturnKeyHandler/IQTextFieldViewInfoModel.swift; sourceTree = "<group>"; }; + 00B378319A98BB422CBDBE14796C501A /* NBBottomSheetPresentationTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBBottomSheetPresentationTransition.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheetPresentationTransition.swift; sourceTree = "<group>"; }; + 02E924FDDE7F7B51AEC552C94D9C9AD6 /* VideoInfoView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoInfoView.swift; path = Source/ImageGallery/VideoInfoView.swift; sourceTree = "<group>"; }; + 05DDE99E61633BB77D72F46FD10F71BC /* IQKeyboardManager+Position.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Position.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift"; sourceTree = "<group>"; }; + 081BAFFE15D81F33E77489E60A036BE7 /* selectedImageGallery@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "selectedImageGallery@3x.png"; path = "Images/selectedImageGallery@3x.png"; sourceTree = "<group>"; }; + 0A36BA6D882CE68172CAE63D99BCB5BA /* EPSignature-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "EPSignature-umbrella.h"; sourceTree = "<group>"; }; + 0AF6D83B6BEECA27C12EB10E96CF4A52 /* ResourceBundle-ImagePicker-ImagePicker-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-ImagePicker-ImagePicker-Info.plist"; sourceTree = "<group>"; }; + 0B1626D50D1FBDF5976CCCE6F16928A1 /* NBBottomSheet-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "NBBottomSheet-Info.plist"; sourceTree = "<group>"; }; + 0CB32F67F5B5E9A2C263A017E98041AC /* NBBottomSheet-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NBBottomSheet-prefix.pch"; sourceTree = "<group>"; }; + 0CBC68B38C0421EC0AE36B43FB2C7636 /* ImagePicker.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ImagePicker.release.xcconfig; sourceTree = "<group>"; }; 0E8A070B594D65627DD64F5ABC65D271 /* Pods-MiniScanner-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-MiniScanner-umbrella.h"; sourceTree = "<group>"; }; - 0EFB4A164AE952F817BA0A6FCE622791 /* IQKeyboardManager+UITextFieldViewNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+UITextFieldViewNotification.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+UITextFieldViewNotification.swift"; sourceTree = "<group>"; }; - 0F47FB5E28EE8C8342B1776D813D1A4C /* FSPagerView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FSPagerView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 116DA05004680C76EAB707C0943392EB /* IQUITextFieldView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUITextFieldView+Additions.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQUITextFieldView+Additions.swift"; sourceTree = "<group>"; }; 123ADF4A6B2F1DEBA5B7482D4983B685 /* Pods-MiniScanner-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-MiniScanner-dummy.m"; sourceTree = "<group>"; }; - 13CD760B3298D3E6B007FC21AEFDEF16 /* LanguageManager-iOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "LanguageManager-iOS-Info.plist"; sourceTree = "<group>"; }; - 1935C8E9966B3C94DD69B219D3DBFBD0 /* NBBottomSheet-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NBBottomSheet-dummy.m"; sourceTree = "<group>"; }; - 1B4086624F01B0B30DDB90F23478F288 /* IQKeyboardManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManager.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift; sourceTree = "<group>"; }; - 1BB9A00426C7107F694592F19527BE69 /* NBBottomSheetTransitioningDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBBottomSheetTransitioningDelegate.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheetTransitioningDelegate.swift; sourceTree = "<group>"; }; + 17EF00C659AFF94B598E7501E2992350 /* ImagePicker.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ImagePicker.modulemap; sourceTree = "<group>"; }; + 180962FC6F75908EC73049ADB28FC887 /* ImagePicker-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ImagePicker-Info.plist"; sourceTree = "<group>"; }; + 187B8EDBE8957C190B1EB7C8F949ED80 /* IQPreviousNextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQPreviousNextView.swift; path = IQKeyboardManagerSwift/IQToolbar/IQPreviousNextView.swift; sourceTree = "<group>"; }; + 18CC4F437D7A0F3454C4F89BD6CE0AEC /* OFF@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "OFF@3x.png"; path = "Images/OFF@3x.png"; sourceTree = "<group>"; }; 1C63F26DA7ECAFB44B0A5DD0BC0E2F89 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 1E288979D79A43A7925DB41055CDD376 /* EPExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EPExtensions.swift; path = Pod/Classes/EPExtensions.swift; sourceTree = "<group>"; }; - 1EF3F9326AE21BCEED16E14D0872FE9C /* UIView+Swizzling.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Swizzling.swift"; path = "LanguageManager-iOS/Classes/Helpers/Extensions/UIView+Swizzling.swift"; sourceTree = "<group>"; }; - 21142CC27FC93E41241CC8948B1EE25C /* ImagePickerController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePickerController.swift; path = Source/ImagePickerController.swift; sourceTree = "<group>"; }; + 1D01404D467A420F82D2829CE6CD8BB4 /* LocationManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LocationManager.swift; path = Source/LocationManager.swift; sourceTree = "<group>"; }; + 1DA09D0759A4DDF814A83483F582ADB1 /* EPSignature-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "EPSignature-Info.plist"; sourceTree = "<group>"; }; + 2006321B115FD55474FD1B985C1979FA /* EPSignature.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = EPSignature.release.xcconfig; sourceTree = "<group>"; }; 21A62BB316C6336F03408E50D730FD01 /* Pods-MiniScanner.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-MiniScanner.modulemap"; sourceTree = "<group>"; }; - 2209E8AC4BD6C9607BD14A1D48B3FBB3 /* IQKeyboardManager+Position.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Position.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift"; sourceTree = "<group>"; }; - 22FCBFA0E2A7651B248460AD3CB4DE32 /* NBBottomSheet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = NBBottomSheet.debug.xcconfig; sourceTree = "<group>"; }; - 23A10D783B0ECA5BA75D4E94BDA01957 /* NBBottomSheet.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = NBBottomSheet.modulemap; sourceTree = "<group>"; }; - 23B7EBFBD51FC4710CDE4AFAE46E8860 /* IQTextFieldViewInfoModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextFieldViewInfoModel.swift; path = IQKeyboardManagerSwift/ReturnKeyHandler/IQTextFieldViewInfoModel.swift; sourceTree = "<group>"; }; - 24533AECDB8F27FACE2D96631FC3F307 /* IQRootControllerConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQRootControllerConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQRootControllerConfiguration.swift; sourceTree = "<group>"; }; - 2D93C4B3BEDE27E7A936E76984B03C35 /* EPSignatureViewController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = EPSignatureViewController.xib; path = Pod/Classes/EPSignatureViewController.xib; sourceTree = "<group>"; }; - 2E2B400DD678EA303FAFFBEF32CBCA41 /* OFF@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "OFF@3x.png"; path = "Images/OFF@3x.png"; sourceTree = "<group>"; }; + 21D53725C7625527BF97643CF7655C26 /* ImageGalleryView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageGalleryView.swift; path = Source/ImageGallery/ImageGalleryView.swift; sourceTree = "<group>"; }; + 252B706186B99322E0DA5829FCC7D43C /* UIView+Swizzling.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Swizzling.swift"; path = "LanguageManager-iOS/Classes/Helpers/Extensions/UIView+Swizzling.swift"; sourceTree = "<group>"; }; + 26EDF88E14046AAC34BFF99F97D23B05 /* NBBottomSheet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = NBBottomSheet.release.xcconfig; sourceTree = "<group>"; }; + 290501CF6F70FA1835207284AF05BEE5 /* ConstraintsSetup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintsSetup.swift; path = Source/Extensions/ConstraintsSetup.swift; sourceTree = "<group>"; }; + 297848FCF8FE33D0DA0FDA6C8B1F5CC3 /* IQKeyboardConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQKeyboardConfiguration.swift; sourceTree = "<group>"; }; + 297D96869095AA06F276F3DA5DD575B7 /* CameraMan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CameraMan.swift; path = Source/CameraView/CameraMan.swift; sourceTree = "<group>"; }; + 2A6AE173040683BAF2BF0ACE7CB13A0A /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Source/Configuration.swift; sourceTree = "<group>"; }; + 2AC4CEA5F2332B5B286CA6B73D2643EF /* ImageGalleryViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageGalleryViewCell.swift; path = Source/ImageGallery/ImageGalleryViewCell.swift; sourceTree = "<group>"; }; + 2E9D8E28679896AEA1627BA66F8580C2 /* EPExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EPExtensions.swift; path = Pod/Classes/EPExtensions.swift; sourceTree = "<group>"; }; 2EE6749FC108D414ECB83B77EF11BD86 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - 2EEF70A7586548C9681199386735B949 /* LanguageManager-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "LanguageManager-iOS.debug.xcconfig"; sourceTree = "<group>"; }; - 309F127A50B023B6041C44942C9079DE /* IQTextFieldViewInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextFieldViewInfo.swift; path = IQKeyboardManagerSwift/LIsteners/Info/IQTextFieldViewInfo.swift; sourceTree = "<group>"; }; - 30A55721765A033C43BEE85DF167DC60 /* ImagePicker.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ImagePicker.modulemap; sourceTree = "<group>"; }; - 317125123DFF6A76FF8664EF536038C2 /* ResourceBundle-ImagePicker-ImagePicker-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-ImagePicker-ImagePicker-Info.plist"; sourceTree = "<group>"; }; - 32A5E10DAD7E67CBAFB25E12CF020274 /* IQInvocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQInvocation.swift; path = IQKeyboardManagerSwift/IQToolbar/IQInvocation.swift; sourceTree = "<group>"; }; + 3243FB397BF2AFE225A1FC09542DBF5D /* IQToolbarConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQToolbarConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQToolbarConfiguration.swift; sourceTree = "<group>"; }; + 32CC609D1546AF3789419217412783D0 /* IQKeyboardManagerSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardManagerSwift.modulemap; sourceTree = "<group>"; }; 3438B9790556194C521D4C9806D29C85 /* Pods_MiniScanner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MiniScanner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 343F83F1A08E56F19D01674A9BA4DC53 /* CameraView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CameraView.swift; path = Source/CameraView/CameraView.swift; sourceTree = "<group>"; }; - 398208613C39BD5EF043841FA4CBF884 /* String+Localiz.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Localiz.swift"; path = "LanguageManager-iOS/Classes/Helpers/Extensions/String+Localiz.swift"; sourceTree = "<group>"; }; - 3AA92C612F872EADC2BC40A15E01DB23 /* NBBottomSheetPresentationTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBBottomSheetPresentationTransition.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheetPresentationTransition.swift; sourceTree = "<group>"; }; + 3510141CBBD30B465F757E0A8E2B1097 /* LanguageManager-iOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LanguageManager-iOS-umbrella.h"; sourceTree = "<group>"; }; + 389AA43304A03366FC2510859AA7DCBA /* NBBottomSheet-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NBBottomSheet-umbrella.h"; sourceTree = "<group>"; }; 3B6258C4E2C1059AABC67D66F9314FE8 /* Pods-MiniScanner-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-MiniScanner-acknowledgements.markdown"; sourceTree = "<group>"; }; - 3B78794BA632342FFC447557E4671B16 /* CameraMan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CameraMan.swift; path = Source/CameraView/CameraMan.swift; sourceTree = "<group>"; }; - 3C28E959FA9C6343351C3EA1ED606EBA /* EPSignature-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "EPSignature-Info.plist"; sourceTree = "<group>"; }; - 3DB66972AE146B779F56CFD49B324220 /* IQTextFieldViewListener.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextFieldViewListener.swift; path = IQKeyboardManagerSwift/LIsteners/IQTextFieldViewListener.swift; sourceTree = "<group>"; }; - 3DF9BB8A2089DB5AEEA4B43132D0B074 /* IQUIView+IQKeyboardToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIView+IQKeyboardToolbar.swift"; path = "IQKeyboardManagerSwift/IQToolbar/IQUIView+IQKeyboardToolbar.swift"; sourceTree = "<group>"; }; + 3D666C16AFD99E3736270D569B5DE2F1 /* EPSignature.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = EPSignature.modulemap; sourceTree = "<group>"; }; 3DFAC6F70B9CECADF5873F487AF082BA /* EPSignature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = EPSignature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3E9452E6ADBDB9FF5D00CEDC3ED637F3 /* FSPagerCollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FSPagerCollectionView.swift; path = Sources/FSPagerCollectionView.swift; sourceTree = "<group>"; }; - 4105CD9664E76F34242222CF357D24ED /* FSPagerView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FSPagerView-prefix.pch"; sourceTree = "<group>"; }; - 4138C0C249C44F4ED4EF526B81270B66 /* LanguageManager-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LanguageManager-iOS-prefix.pch"; sourceTree = "<group>"; }; - 47978E33AA1FE786BB675EA3F66DE381 /* ImageStack.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageStack.swift; path = Source/BottomView/ImageStack.swift; sourceTree = "<group>"; }; - 47A7457CB008481373FBC626968AD770 /* IQUIView+IQKeyboardToolbarDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIView+IQKeyboardToolbarDeprecated.swift"; path = "IQKeyboardManagerSwift/IQToolbar/IQUIView+IQKeyboardToolbarDeprecated.swift"; sourceTree = "<group>"; }; - 490673E82DCDC51D3CF4E4936D75E6F6 /* FSPagerView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FSPagerView-Info.plist"; sourceTree = "<group>"; }; - 4A4F7BDE573EF1AD77F082087EBBC731 /* BottomContainerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BottomContainerView.swift; path = Source/BottomView/BottomContainerView.swift; sourceTree = "<group>"; }; - 4A5338232CA701AD47A2EA3B534BD224 /* IQKeyboardManager+UIKeyboardNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+UIKeyboardNotification.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+UIKeyboardNotification.swift"; sourceTree = "<group>"; }; - 4AAF24BB95964A47FF71115DCACE5CC1 /* ImagePicker-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ImagePicker-dummy.m"; sourceTree = "<group>"; }; - 4CEB26DB8656A60C8AE2B83EF56A1149 /* IQKeyboardManager+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Debug.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Debug.swift"; sourceTree = "<group>"; }; - 4D0027E6314671B943C4497115466711 /* Storage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Storage.swift; path = "LanguageManager-iOS/Classes/Helpers/Storage.swift"; sourceTree = "<group>"; }; - 4DA62F8724EC161B523761C4D312EE6A /* IQBarButtonItemConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQBarButtonItemConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQBarButtonItemConfiguration.swift; sourceTree = "<group>"; }; - 4DB37A30323A7D2ED16581BA15B8351D /* IQTitleBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTitleBarButtonItem.swift; path = IQKeyboardManagerSwift/IQToolbar/IQTitleBarButtonItem.swift; sourceTree = "<group>"; }; - 4E8E62EE488350F66CC08D1D88AF14EE /* NBBottomSheet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = NBBottomSheet.release.xcconfig; sourceTree = "<group>"; }; - 4EEEA55AC9C261C1EABE60EC57A5021B /* ImagePicker-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ImagePicker-Info.plist"; sourceTree = "<group>"; }; - 4F2207491E92F152C27D2B4A764A6A93 /* IQKeyboardManager+Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Deprecated.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Deprecated.swift"; sourceTree = "<group>"; }; - 507C1B0C545DAAFE25BB8DD789F224EF /* FSPagerView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FSPagerView.release.xcconfig; sourceTree = "<group>"; }; - 50F1C0F59A45281CE2D310673AE0571F /* NBBottomSheet-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NBBottomSheet-prefix.pch"; sourceTree = "<group>"; }; - 545688259B1D4CD8A59AF3D7E0AFE7B9 /* IQScrollViewConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQScrollViewConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQScrollViewConfiguration.swift; sourceTree = "<group>"; }; - 54A9B08BB29EC7935F6A8F8ACD56BEB0 /* ImageGalleryLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageGalleryLayout.swift; path = Source/ImageGallery/ImageGalleryLayout.swift; sourceTree = "<group>"; }; + 3FD2850880C4A8033AED333F5DFAE328 /* ImagePicker-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ImagePicker-dummy.m"; sourceTree = "<group>"; }; + 400224F8C71E7053C79E8D5E509534F4 /* IQKeyboardListener.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardListener.swift; path = IQKeyboardManagerSwift/LIsteners/IQKeyboardListener.swift; sourceTree = "<group>"; }; + 419AB69B674D6C318AC58EE6D9AFF102 /* IQBarButtonItemConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQBarButtonItemConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQBarButtonItemConfiguration.swift; sourceTree = "<group>"; }; + 452182903F9A76184461CC377DB62A70 /* EPSignatureView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EPSignatureView.swift; path = Pod/Classes/EPSignatureView.swift; sourceTree = "<group>"; }; + 45865163BC96B7A2B481C17A0EC1D4F8 /* IQKeyboardManagerSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManagerSwift-prefix.pch"; sourceTree = "<group>"; }; + 45B232DE9D6710FE8BF7DC25C2C80333 /* NBBottomSheet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = NBBottomSheet.debug.xcconfig; sourceTree = "<group>"; }; + 45C50C21EF30A0239628BA0E14464BCE /* video@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "video@3x.png"; path = "Images/video@3x.png"; sourceTree = "<group>"; }; + 467961922684B2F4C4295CBE0C9CD940 /* StackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StackView.swift; path = Source/BottomView/StackView.swift; sourceTree = "<group>"; }; + 472E9223ECD1656D4CD5CD1BDC50D9CA /* ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist"; sourceTree = "<group>"; }; + 486835CC5D14C1EA193F8575CA89FDCC /* IQScrollViewConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQScrollViewConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQScrollViewConfiguration.swift; sourceTree = "<group>"; }; + 48FAE289F4B7A5D4D99BDB1F74A1C163 /* LanguageManager-iOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "LanguageManager-iOS-Info.plist"; sourceTree = "<group>"; }; + 49FC6FE3F43F76CA598D3253A1731EEB /* IQKeyboardManagerCompatible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManagerCompatible.swift; path = IQKeyboardManagerSwift/IQKeyboardManagerCompatible/IQKeyboardManagerCompatible.swift; sourceTree = "<group>"; }; + 4B432B6773BE3F0B4A6976820602F07A /* UIView+Direction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Direction.swift"; path = "LanguageManager-iOS/Classes/Helpers/Extensions/UIView+Direction.swift"; sourceTree = "<group>"; }; + 4D01E52DE74EF3C733B94F1E045CCD77 /* String+Localiz.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Localiz.swift"; path = "LanguageManager-iOS/Classes/Helpers/Extensions/String+Localiz.swift"; sourceTree = "<group>"; }; + 4FE3DE7F264E30C392DCECA7921DAEF2 /* IQActiveConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQActiveConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQActiveConfiguration.swift; sourceTree = "<group>"; }; + 54323777101C6AB180A413C0B2DB23B9 /* NBBottomSheetController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBBottomSheetController.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheetController.swift; sourceTree = "<group>"; }; 56B28C4E9F718651E6E1B010F31566EB /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/AVFoundation.framework; sourceTree = DEVELOPER_DIR; }; - 5761D7B5C5A856ED4D8A03F284C8771F /* UIImageView+Direction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+Direction.swift"; path = "LanguageManager-iOS/Classes/Helpers/Extensions/UIImageView+Direction.swift"; sourceTree = "<group>"; }; - 586B6FC37EB8231AC7C24C1CC2776384 /* UIView+Direction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Direction.swift"; path = "LanguageManager-iOS/Classes/Helpers/Extensions/UIView+Direction.swift"; sourceTree = "<group>"; }; - 5D646977F7C0DA29D63C4E18D9DD6630 /* video@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "video@3x.png"; path = "Images/video@3x.png"; sourceTree = "<group>"; }; - 5FF2B9AD02F97A175585504BA5B7F448 /* TopView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TopView.swift; path = Source/TopView/TopView.swift; sourceTree = "<group>"; }; - 615EB6B3844737F49004E6E4A8F968A0 /* DefaultsKeys.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultsKeys.swift; path = "LanguageManager-iOS/Classes/Constants/DefaultsKeys.swift"; sourceTree = "<group>"; }; + 56C1C453B74E770D4AC56A090051BCF5 /* EPSignatureViewController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = EPSignatureViewController.xib; path = Pod/Classes/EPSignatureViewController.xib; sourceTree = "<group>"; }; + 5A6291B42FA169A1C1919CB49B0B8509 /* IQTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextView.swift; path = IQKeyboardManagerSwift/IQTextView/IQTextView.swift; sourceTree = "<group>"; }; + 5B1D47B8C43A0DA0A05A410655A28153 /* IQKeyboardManager+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Debug.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Debug.swift"; sourceTree = "<group>"; }; + 5F8E6400E281B0FB397224FDE9690416 /* IQKeyboardManagerSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardManagerSwift-Info.plist"; sourceTree = "<group>"; }; + 619978A0C0036454C22A81173BAA5A6A /* IQUITableView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUITableView+Additions.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQUITableView+Additions.swift"; sourceTree = "<group>"; }; + 62160BE00E3966D4D52808B89DE0B1B3 /* IQNSArray+Sort.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQNSArray+Sort.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQNSArray+Sort.swift"; sourceTree = "<group>"; }; + 6224FD5F7C95061A57CAFA73995B3002 /* ImagePicker.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ImagePicker.debug.xcconfig; sourceTree = "<group>"; }; 6473C16F43F7217C13AEA5FBA6C8247F /* LanguageManager_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LanguageManager_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 65E35E2A8DCF85A60B0EF9389B0495AE /* NBBottomSheet-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NBBottomSheet-umbrella.h"; sourceTree = "<group>"; }; - 664FCD8539D02C2C7ABBA15E9666F2B9 /* AUTO@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "AUTO@3x.png"; path = "Images/AUTO@3x.png"; sourceTree = "<group>"; }; - 689EF9768E3E18B833DD776EAD893408 /* ImageGalleryViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageGalleryViewCell.swift; path = Source/ImageGallery/ImageGalleryViewCell.swift; sourceTree = "<group>"; }; - 69FC816770553B761090561AE8707674 /* IQKeyboardInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardInfo.swift; path = IQKeyboardManagerSwift/LIsteners/Info/IQKeyboardInfo.swift; sourceTree = "<group>"; }; - 6C5B4DA5F338896C639DBDA08FCCC486 /* NBBottomSheetPresentationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBBottomSheetPresentationController.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheetPresentationController.swift; sourceTree = "<group>"; }; - 7136D2DF9E35BE04AE50612BF8809136 /* IQKeyboardReturnKeyHandler+TextFieldDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardReturnKeyHandler+TextFieldDelegate.swift"; path = "IQKeyboardManagerSwift/ReturnKeyHandler/IQKeyboardReturnKeyHandler+TextFieldDelegate.swift"; sourceTree = "<group>"; }; - 79655C283B54B5F907790F4E79C388EF /* IQUITextFieldView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUITextFieldView+Additions.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQUITextFieldView+Additions.swift"; sourceTree = "<group>"; }; + 6B5E1D310DD754E122DEEE009481A2D6 /* IQUIScrollView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIScrollView+Additions.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQUIScrollView+Additions.swift"; sourceTree = "<group>"; }; + 6F6826627BFA6A69002524426F8CFFB7 /* IQTextFieldViewListener.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextFieldViewListener.swift; path = IQKeyboardManagerSwift/LIsteners/IQTextFieldViewListener.swift; sourceTree = "<group>"; }; + 7488E11EF92CBFCB3965EA6F8020E701 /* ON@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ON@3x.png"; path = "Images/ON@3x.png"; sourceTree = "<group>"; }; + 7927C464AC094A95C8B864DF6A0B1D06 /* UIImageView+Direction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+Direction.swift"; path = "LanguageManager-iOS/Classes/Helpers/Extensions/UIImageView+Direction.swift"; sourceTree = "<group>"; }; 798C61760B9BC4B07BC60D42FCC09855 /* Pods-MiniScanner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MiniScanner.release.xcconfig"; sourceTree = "<group>"; }; - 7A54F7427340E254B559EC1244CA2E45 /* FSPagerView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FSPagerView-dummy.m"; sourceTree = "<group>"; }; - 7BB12D707BA745ED62C48151519D0E76 /* IQKeyboardManagerSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardManagerSwift.modulemap; sourceTree = "<group>"; }; + 7C9ABFFD091844286C2E85A20189BF7A /* IQKeyboardManagerSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.debug.xcconfig; sourceTree = "<group>"; }; 7CC191E7994C3C7161A6641B457C9166 /* Pods-MiniScanner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MiniScanner.debug.xcconfig"; sourceTree = "<group>"; }; - 7F23D0E0AE3BDC7AE6A7D331A0FF5AF6 /* IQKeyboardManager+ToolbarActions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+ToolbarActions.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ToolbarActions.swift"; sourceTree = "<group>"; }; - 7F6DD614B85D0662209A3ADCFA367295 /* AssetManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssetManager.swift; path = Source/AssetManager.swift; sourceTree = "<group>"; }; - 8059AF588641259180B6DAD45BEF496B /* NBBottomSheetConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBBottomSheetConfiguration.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheetConfiguration.swift; sourceTree = "<group>"; }; - 82E4B4BB461879C2730CD6E789150CB8 /* ImagePicker-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ImagePicker-prefix.pch"; sourceTree = "<group>"; }; - 831781174B420BA2000C5A20F9B1A155 /* IQActiveConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQActiveConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQActiveConfiguration.swift; sourceTree = "<group>"; }; - 842BA45676E86EFC650EFC7B33D1572F /* FSPagerViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FSPagerViewCell.swift; path = Sources/FSPagerViewCell.swift; sourceTree = "<group>"; }; - 8434491D5623794FFD75623AC5720E3C /* LanguageManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LanguageManager.swift; path = "LanguageManager-iOS/Classes/Main/LanguageManager.swift"; sourceTree = "<group>"; }; - 86D4965F304A9370159F8BEE0D0951D5 /* IQKeyboardManagerSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.debug.xcconfig; sourceTree = "<group>"; }; - 88DFD4B8DC15592A7CD38D8AD9C01668 /* IQKeyboardManager+Toolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Toolbar.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Toolbar.swift"; sourceTree = "<group>"; }; + 8016BAC4075F40E70BE2133125B01BF5 /* Helper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Helper.swift; path = Source/Helper.swift; sourceTree = "<group>"; }; + 8147290C4A326DADC3F305533BD64023 /* IQKeyboardManagerSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManagerSwift-umbrella.h"; sourceTree = "<group>"; }; + 843CD6046BA80BCDF11AE4FAC807D29B /* cameraIcon@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "cameraIcon@3x.png"; path = "Images/cameraIcon@3x.png"; sourceTree = "<group>"; }; + 84969C2137D2629DFFC29942F8B97FEB /* ImageGalleryLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageGalleryLayout.swift; path = Source/ImageGallery/ImageGalleryLayout.swift; sourceTree = "<group>"; }; + 878EC7606D056CAB26A578762AF922D7 /* IQRootControllerConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQRootControllerConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQRootControllerConfiguration.swift; sourceTree = "<group>"; }; 89194C84FD5E62D9D2C9F2157676FF5C /* Pods-MiniScanner-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MiniScanner-acknowledgements.plist"; sourceTree = "<group>"; }; - 891FABB9A51285F499148E921B1A8E24 /* FSPagerViewLayoutAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FSPagerViewLayoutAttributes.swift; path = Sources/FSPagerViewLayoutAttributes.swift; sourceTree = "<group>"; }; - 8A9AA0FBABA9E9EEF6521C23B2031158 /* IQToolbarConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQToolbarConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQToolbarConfiguration.swift; sourceTree = "<group>"; }; - 8B5D88BFE14997FA9B22FA4A4B8CD6DA /* IQTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextView.swift; path = IQKeyboardManagerSwift/IQTextView/IQTextView.swift; sourceTree = "<group>"; }; - 8C6B2F7653C95633BB9449F87EB6DBD9 /* LanguageManager-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "LanguageManager-iOS.release.xcconfig"; sourceTree = "<group>"; }; + 8BA50CB662E7C23406F0B83501BA32D7 /* LanguageManager-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "LanguageManager-iOS.debug.xcconfig"; sourceTree = "<group>"; }; 8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IQKeyboardManagerSwift.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - 8EA72F0B0DD57B9D078AF8EFCE412455 /* ViewDirection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewDirection.swift; path = "LanguageManager-iOS/Classes/Constants/ViewDirection.swift"; sourceTree = "<group>"; }; - 8F9A6C68497A6CFFB3FAA52682750752 /* cameraIcon@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "cameraIcon@3x.png"; path = "Images/cameraIcon@3x.png"; sourceTree = "<group>"; }; - 9027793C7414B308134453884A6716FD /* ImagePicker.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ImagePicker.debug.xcconfig; sourceTree = "<group>"; }; - 90C7704EF389F83C731970D2CDF6595B /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Source/Configuration.swift; sourceTree = "<group>"; }; + 8E6FDE31134B7541747D1E89E52E225A /* IQUIView+IQKeyboardToolbarDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIView+IQKeyboardToolbarDeprecated.swift"; path = "IQKeyboardManagerSwift/IQToolbar/IQUIView+IQKeyboardToolbarDeprecated.swift"; sourceTree = "<group>"; }; + 8F0A5164AA0CCC729C8EA5166760BA9E /* IQKeyboardReturnKeyHandler+TextFieldDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardReturnKeyHandler+TextFieldDelegate.swift"; path = "IQKeyboardManagerSwift/ReturnKeyHandler/IQKeyboardReturnKeyHandler+TextFieldDelegate.swift"; sourceTree = "<group>"; }; + 8F3317C2A83E43FF75DFCFD3FAEB3669 /* IQKeyboardInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardInfo.swift; path = IQKeyboardManagerSwift/LIsteners/Info/IQKeyboardInfo.swift; sourceTree = "<group>"; }; + 8F84A913AFEF518DF42A997F74EC8260 /* BottomContainerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BottomContainerView.swift; path = Source/BottomView/BottomContainerView.swift; sourceTree = "<group>"; }; + 9067705903BD2E8C3EC9BD8EBF709221 /* ImagePickerController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePickerController.swift; path = Source/ImagePickerController.swift; sourceTree = "<group>"; }; 91BC4F27F2DA380ABC44B3609495F0E1 /* NBBottomSheet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NBBottomSheet.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 926EAAA6426204DE1DF8D36D2E13EA74 /* IQToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQToolbar.swift; path = IQKeyboardManagerSwift/IQToolbar/IQToolbar.swift; sourceTree = "<group>"; }; - 92CEF8FFA7885B7EC96C4120D507A08F /* IQToolbarPlaceholderConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQToolbarPlaceholderConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQToolbarPlaceholderConfiguration.swift; sourceTree = "<group>"; }; + 92470A870676C63A27509F38301D521C /* IQUICollectionView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUICollectionView+Additions.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQUICollectionView+Additions.swift"; sourceTree = "<group>"; }; + 97037D70AD7F37FBCDB7561DA20D7D2D /* NBBottomSheetDismissalTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBBottomSheetDismissalTransition.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheetDismissalTransition.swift; sourceTree = "<group>"; }; 97AA160F23F0CBEDDAF212103E762FC7 /* ImagePicker.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ImagePicker.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 987CD19BC0CE18F2E00B0AD5ABF8670D /* ImagePicker.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ImagePicker.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9A0A414944257050868C6C9F38FA10DF /* FSPagerView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FSPagerView.modulemap; sourceTree = "<group>"; }; - 9B35CF76304163C551A5E4B592066D0D /* IQUIViewController+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIViewController+Additions.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQUIViewController+Additions.swift"; sourceTree = "<group>"; }; + 9AAA7A084DC8F453913C80DE1E243C39 /* LanguageManager-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "LanguageManager-iOS.release.xcconfig"; sourceTree = "<group>"; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9E44A8883A35E6A01365B1C682A1164D /* ConstraintsSetup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintsSetup.swift; path = Source/Extensions/ConstraintsSetup.swift; sourceTree = "<group>"; }; - A1BD1A58666D6C0FD408F4DB3ADC8107 /* IQKeyboardListener.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardListener.swift; path = IQKeyboardManagerSwift/LIsteners/IQKeyboardListener.swift; sourceTree = "<group>"; }; - A230ED28736A611DEEC851620E6444DE /* IQKeyboardManager+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Internal.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift"; sourceTree = "<group>"; }; - A2A1F3E9AD6E574C81576EFC109E4F56 /* focusIcon@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "focusIcon@3x.png"; path = "Images/focusIcon@3x.png"; sourceTree = "<group>"; }; - A4D36302D2F7234AEEC28003C3244EB4 /* UIButton+Direction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+Direction.swift"; path = "LanguageManager-iOS/Classes/Helpers/Extensions/UIButton+Direction.swift"; sourceTree = "<group>"; }; - A60D99B014C4219B8F7BF725B9648E36 /* NBBottomSheetController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBBottomSheetController.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheetController.swift; sourceTree = "<group>"; }; - A7BA040D977C503D2A8C2D9BF404E21C /* EPSignature-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "EPSignature-umbrella.h"; sourceTree = "<group>"; }; - A8A8D208D764CFAC89604E6813F1444E /* IQUIScrollView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIScrollView+Additions.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQUIScrollView+Additions.swift"; sourceTree = "<group>"; }; - A8D2ABDB4E2F157885C7BEE654CF6FC4 /* IQKeyboardManagerSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManagerSwift-prefix.pch"; sourceTree = "<group>"; }; + 9DDA4537FCBE11326C1D65EA43B3CC6D /* DefaultsKeys.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultsKeys.swift; path = "LanguageManager-iOS/Classes/Constants/DefaultsKeys.swift"; sourceTree = "<group>"; }; + 9FC1B2AF5635D8020B43F30629EC2712 /* focusIcon@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "focusIcon@3x.png"; path = "Images/focusIcon@3x.png"; sourceTree = "<group>"; }; + A0DA73612FA4F954FCE02EA0ADACE634 /* IQKeyboardManager+UITextFieldViewNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+UITextFieldViewNotification.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+UITextFieldViewNotification.swift"; sourceTree = "<group>"; }; + A100F9EA89810A00541755ECD7BBB307 /* IQTitleBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTitleBarButtonItem.swift; path = IQKeyboardManagerSwift/IQToolbar/IQTitleBarButtonItem.swift; sourceTree = "<group>"; }; + A1229814968DD5876FBA87DDA81C5B8F /* IQKeyboardManager+Toolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Toolbar.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Toolbar.swift"; sourceTree = "<group>"; }; + A12B5A63F2CB09B7D22B7E2F4A2210EB /* IQInvocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQInvocation.swift; path = IQKeyboardManagerSwift/IQToolbar/IQInvocation.swift; sourceTree = "<group>"; }; + A353C25676960291A3718B5AFDB81A33 /* IQKeyboardManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManager.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift; sourceTree = "<group>"; }; + A3B5F550C3AA900D117E22291DE5D67C /* IQToolbarPlaceholderConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQToolbarPlaceholderConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQToolbarPlaceholderConfiguration.swift; sourceTree = "<group>"; }; + A532EFEAAE9EEAA7CFA7DF04C7E1808B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = IQKeyboardManagerSwift/PrivacyInfo.xcprivacy; sourceTree = "<group>"; }; + A72C2CB61DAC20DBF7210307C41485C5 /* NBBottomSheetConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBBottomSheetConfiguration.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheetConfiguration.swift; sourceTree = "<group>"; }; A8E950A16D00F649C54FFB30F81D7842 /* IQKeyboardManagerSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IQKeyboardManagerSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AC43EDC562847626ACF7B4E93E5462EF /* IQKeyboardManagerConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManagerConstants.swift; path = IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstants.swift; sourceTree = "<group>"; }; - AC7F01FAC278F9B096CFFD78497206CF /* UIImage+NextPrevious.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+NextPrevious.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/UIImage+NextPrevious.swift"; sourceTree = "<group>"; }; - AF61B6A70C39B0ACDA33B583642A26EE /* EPSignatureViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EPSignatureViewController.swift; path = Pod/Classes/EPSignatureViewController.swift; sourceTree = "<group>"; }; - B021EB40B85B76049C30C2D063F0870D /* ButtonPicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ButtonPicker.swift; path = Source/BottomView/ButtonPicker.swift; sourceTree = "<group>"; }; + AB5F2D5DFB52DE92C94A23801BAC451C /* IQUIView+IQKeyboardToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIView+IQKeyboardToolbar.swift"; path = "IQKeyboardManagerSwift/IQToolbar/IQUIView+IQKeyboardToolbar.swift"; sourceTree = "<group>"; }; + AB94CC5B3F453AA0801700167152FCA1 /* IQKeyboardManager+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Internal.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift"; sourceTree = "<group>"; }; + AC259076A4D444F235DABE44D7425021 /* ViewDirection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewDirection.swift; path = "LanguageManager-iOS/Classes/Constants/ViewDirection.swift"; sourceTree = "<group>"; }; + AD71C20FAD4FE7E08FA8091857A2FDCB /* NBBottomSheet-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NBBottomSheet-dummy.m"; sourceTree = "<group>"; }; B2968141E72EA49CC006DD4020E3386D /* Pods-MiniScanner-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-MiniScanner-frameworks.sh"; sourceTree = "<group>"; }; - B3FCB83859385DB3694F04D44B40FE18 /* EPSignature-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "EPSignature-dummy.m"; sourceTree = "<group>"; }; - B5A83B1987A0D179A3EAE24B6183FF37 /* ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist"; sourceTree = "<group>"; }; - B638343F1BC71A9A9CD3A6D6CA749DC7 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = IQKeyboardManagerSwift/PrivacyInfo.xcprivacy; sourceTree = "<group>"; }; - B6C332B0108C87436290C293E043023A /* IQKeyboardReturnKeyHandler+TextViewDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardReturnKeyHandler+TextViewDelegate.swift"; path = "IQKeyboardManagerSwift/ReturnKeyHandler/IQKeyboardReturnKeyHandler+TextViewDelegate.swift"; sourceTree = "<group>"; }; - B700D2C4CED5ED22050429C7997CF1FE /* IQKeyboardConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardConfiguration.swift; path = IQKeyboardManagerSwift/Configuration/IQKeyboardConfiguration.swift; sourceTree = "<group>"; }; - B7F2D378ED96DA779D964000E6DECED9 /* FSPagerViewObjcCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FSPagerViewObjcCompat.m; path = Sources/FSPagerViewObjcCompat.m; sourceTree = "<group>"; }; - B909C40450F7213C478AE50F7E2D18A9 /* FSPageViewTransformer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FSPageViewTransformer.swift; path = Sources/FSPageViewTransformer.swift; sourceTree = "<group>"; }; - BA1D8FBFBA4E4BE6EC7D55255DE3EFBC /* VideoInfoView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoInfoView.swift; path = Source/ImageGallery/VideoInfoView.swift; sourceTree = "<group>"; }; - BA790DC54E7A009FDDBBC07056093C41 /* IQKeyboardManagerSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardManagerSwift-dummy.m"; sourceTree = "<group>"; }; - BAA72CEA94002E53D03EC7DCC0E59413 /* LocationManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LocationManager.swift; path = Source/LocationManager.swift; sourceTree = "<group>"; }; - BC0F20E077483A5E6339C4C6304E6507 /* ON@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ON@3x.png"; path = "Images/ON@3x.png"; sourceTree = "<group>"; }; - BE1348270A5A7F3FDEFAC32D8E89686A /* IQUIView+Hierarchy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIView+Hierarchy.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQUIView+Hierarchy.swift"; sourceTree = "<group>"; }; - BE559964BD58119769FB19BB95144A6A /* EPSignatureView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EPSignatureView.swift; path = Pod/Classes/EPSignatureView.swift; sourceTree = "<group>"; }; - C1DC2A0ED79E1179E28CE75BFECCDA82 /* IQNSArray+Sort.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQNSArray+Sort.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQNSArray+Sort.swift"; sourceTree = "<group>"; }; + B4E6D4AE8BCE2646794F28F0E24A08D1 /* UIButton+Direction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+Direction.swift"; path = "LanguageManager-iOS/Classes/Helpers/Extensions/UIButton+Direction.swift"; sourceTree = "<group>"; }; + B5598E57D63117C1B54ADBB7A187B232 /* IQUIViewController+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIViewController+Additions.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQUIViewController+Additions.swift"; sourceTree = "<group>"; }; + B5EDE1D4720CA7A048A32667F968ED10 /* IQKeyboardReturnKeyHandler+TextViewDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardReturnKeyHandler+TextViewDelegate.swift"; path = "IQKeyboardManagerSwift/ReturnKeyHandler/IQKeyboardReturnKeyHandler+TextViewDelegate.swift"; sourceTree = "<group>"; }; + B6C5E34F15E4BBDA3480406FF35C1903 /* IQKeyboardManager+Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Deprecated.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Deprecated.swift"; sourceTree = "<group>"; }; + B710E28309BEA5C002164BD008CFB6C0 /* ImagePicker-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ImagePicker-prefix.pch"; sourceTree = "<group>"; }; + B71FD6B5A8AC626259BE6B97226F81FB /* TopView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TopView.swift; path = Source/TopView/TopView.swift; sourceTree = "<group>"; }; + B7EA56260324998EC43B70CD2092E1FB /* ImageStack.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageStack.swift; path = Source/BottomView/ImageStack.swift; sourceTree = "<group>"; }; + BF809679D3CFFBC72878EC9BFEA90F5E /* LanguageManager-iOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "LanguageManager-iOS-dummy.m"; sourceTree = "<group>"; }; + C1A5BF586C35098EC908E7870B407170 /* EPSignatureViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EPSignatureViewController.swift; path = Pod/Classes/EPSignatureViewController.swift; sourceTree = "<group>"; }; + C2B28EA5FE2C09FCEF4DF47D34186FB7 /* Languages.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Languages.swift; path = "LanguageManager-iOS/Classes/Constants/Languages.swift"; sourceTree = "<group>"; }; + C5054DCBC2013F1894FA0EE7D6D99005 /* ImageGalleryViewDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageGalleryViewDataSource.swift; path = Source/ImageGallery/ImageGalleryViewDataSource.swift; sourceTree = "<group>"; }; C54FCF3DBFE97D4603C0EACF18FA0D04 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - C6214DC5E72470BE3105210D7465B90A /* selectedImageGallery@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "selectedImageGallery@3x.png"; path = "Images/selectedImageGallery@3x.png"; sourceTree = "<group>"; }; - C698FD30D248D272DAE2F242C5D62EA2 /* NBConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBConfiguration.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBConfiguration.swift; sourceTree = "<group>"; }; - C6F5B0BFC63CD2F3B0DF56912D4F54E8 /* IQUITableView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUITableView+Additions.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQUITableView+Additions.swift"; sourceTree = "<group>"; }; - C94B5C4512123F377D23B93F1FA23097 /* IQKeyboardManagerSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManagerSwift-umbrella.h"; sourceTree = "<group>"; }; - CA39A57EEAD9575350DCFB2377E01DD9 /* NBBottomSheet-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "NBBottomSheet-Info.plist"; sourceTree = "<group>"; }; - CACF959977B91C5F65F381B36C452B6D /* Languages.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Languages.swift; path = "LanguageManager-iOS/Classes/Constants/Languages.swift"; sourceTree = "<group>"; }; - CE58805A3FAC71C6A5782C1B1BB08069 /* IQPlaceholderable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQPlaceholderable.swift; path = IQKeyboardManagerSwift/IQTextView/IQPlaceholderable.swift; sourceTree = "<group>"; }; - CE5D7D46BA438C135B812D0C145CBE6C /* ImageGalleryView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageGalleryView.swift; path = Source/ImageGallery/ImageGalleryView.swift; sourceTree = "<group>"; }; - D2E621AE82FB76EEF79C8A2D0102AAF7 /* EPSignature-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "EPSignature-prefix.pch"; sourceTree = "<group>"; }; - D4C85B9AE116359EBFD1959406B32999 /* IQUICollectionView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUICollectionView+Additions.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQUICollectionView+Additions.swift"; sourceTree = "<group>"; }; - D5F711A94EB088CF457F893E60C568B4 /* FSPageViewLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FSPageViewLayout.swift; path = Sources/FSPageViewLayout.swift; sourceTree = "<group>"; }; - D6D6492D4AE05CD36F797199E44F1805 /* FSPageControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FSPageControl.swift; path = Sources/FSPageControl.swift; sourceTree = "<group>"; }; - D8CA0DD8AA6C4033E65CAA6FE83870F1 /* StackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StackView.swift; path = Source/BottomView/StackView.swift; sourceTree = "<group>"; }; - DA4B76FEC2A143DA2EFFC6D3F7FB7B5A /* LanguageManager-iOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "LanguageManager-iOS-dummy.m"; sourceTree = "<group>"; }; - DB2BF5C6F33D3DA91B2EB11B23EEE3FE /* Helper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Helper.swift; path = Source/Helper.swift; sourceTree = "<group>"; }; - DBE740FF0A3373F56E7AF2A4000D6D8C /* ImagePicker.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ImagePicker.release.xcconfig; sourceTree = "<group>"; }; - DD48D4FC5BD3A99772F4FE6FDB643898 /* ImagePicker-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ImagePicker-umbrella.h"; sourceTree = "<group>"; }; - DE7235727A466A9B7BF8342CC42C4B91 /* IQPreviousNextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQPreviousNextView.swift; path = IQKeyboardManagerSwift/IQToolbar/IQPreviousNextView.swift; sourceTree = "<group>"; }; - E1DF93E2C3692DABCE7DF9D4735D2645 /* NBBottomSheetDismissalTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBBottomSheetDismissalTransition.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheetDismissalTransition.swift; sourceTree = "<group>"; }; - E21781AECFBC7371F2118155ACE5C3C7 /* IQKeyboardReturnKeyHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardReturnKeyHandler.swift; path = IQKeyboardManagerSwift/ReturnKeyHandler/IQKeyboardReturnKeyHandler.swift; sourceTree = "<group>"; }; - E3703BDC76205E7D102F2BF32B3D8ACC /* FSPagerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FSPagerView.swift; path = Sources/FSPagerView.swift; sourceTree = "<group>"; }; - E3DA260DCB001D3DF844896311887A56 /* EPSignature.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = EPSignature.release.xcconfig; sourceTree = "<group>"; }; - E6049E937091EF3FC850CDC4BEF9B925 /* EPSignature.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = EPSignature.modulemap; sourceTree = "<group>"; }; - E62A4882567E433682E9D7925C2BDA73 /* ImageGalleryViewDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageGalleryViewDataSource.swift; path = Source/ImageGallery/ImageGalleryViewDataSource.swift; sourceTree = "<group>"; }; - E711836675BD919C63BEB7A0930B72B4 /* NBBottomSheet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NBBottomSheet.h; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheet.h; sourceTree = "<group>"; }; - EA5483FEE1B87041C4751EA1D4F3EF54 /* IQKeyboardManagerCompatible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManagerCompatible.swift; path = IQKeyboardManagerSwift/IQKeyboardManagerCompatible/IQKeyboardManagerCompatible.swift; sourceTree = "<group>"; }; - ED50ABC97C7298629CFFE2835E5645AE /* LanguageManager-iOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LanguageManager-iOS-umbrella.h"; sourceTree = "<group>"; }; + C6AEEFA5613E0B7BF8F6425A154D6EC9 /* NBBottomSheet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NBBottomSheet.h; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheet.h; sourceTree = "<group>"; }; + CD46A963E6CCE8CD900BA8A7331D7D8C /* NBConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBConfiguration.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBConfiguration.swift; sourceTree = "<group>"; }; + CD55E5F51909EE297A2AC039F257AF6F /* EPSignature-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "EPSignature-prefix.pch"; sourceTree = "<group>"; }; + D2DB0BCD57E720CE97C1C3CE74B75024 /* IQKeyboardManager+UIKeyboardNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+UIKeyboardNotification.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+UIKeyboardNotification.swift"; sourceTree = "<group>"; }; + D3DC4A4D35E057E5F76427C838E3E495 /* IQPlaceholderable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQPlaceholderable.swift; path = IQKeyboardManagerSwift/IQTextView/IQPlaceholderable.swift; sourceTree = "<group>"; }; + D4270A3541F22B881BD953A68F6E73F9 /* IQKeyboardManagerSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardManagerSwift-dummy.m"; sourceTree = "<group>"; }; + D4648CA1088D11129C0BDD49912D6FAB /* ButtonPicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ButtonPicker.swift; path = Source/BottomView/ButtonPicker.swift; sourceTree = "<group>"; }; + D55EBF017F6625B593286F47CFEB1FA3 /* IQUIView+Hierarchy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIView+Hierarchy.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/IQUIView+Hierarchy.swift"; sourceTree = "<group>"; }; + D9651F46100B3C105EE27B92C1DFFCEC /* IQKeyboardManager+ToolbarActions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+ToolbarActions.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ToolbarActions.swift"; sourceTree = "<group>"; }; + D9F19506C84032240A21541F9EFCA895 /* IQKeyboardManagerConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManagerConstants.swift; path = IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstants.swift; sourceTree = "<group>"; }; + DC9A64B83C916D4FC5C9CE722E697819 /* LanguageManager-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LanguageManager-iOS-prefix.pch"; sourceTree = "<group>"; }; + DCB418B4C0BF451B734FFA48AAD9ADF6 /* Storage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Storage.swift; path = "LanguageManager-iOS/Classes/Helpers/Storage.swift"; sourceTree = "<group>"; }; + E1D47766C4492BAF84E069DF6E3DD758 /* NBBottomSheetPresentationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBBottomSheetPresentationController.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheetPresentationController.swift; sourceTree = "<group>"; }; + E24E6B8D32E615F0FEF0A78F3C181A09 /* EPSignature-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "EPSignature-dummy.m"; sourceTree = "<group>"; }; + E34B4735C7461EBF9AEEC896DEB27C33 /* IQTextFieldViewInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextFieldViewInfo.swift; path = IQKeyboardManagerSwift/LIsteners/Info/IQTextFieldViewInfo.swift; sourceTree = "<group>"; }; + E68A22DD9E65EF800882452842690AE1 /* NBBottomSheet.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = NBBottomSheet.modulemap; sourceTree = "<group>"; }; + E7F7A4EA7A5659C2F78D04CC218E1440 /* NBBottomSheetTransitioningDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NBBottomSheetTransitioningDelegate.swift; path = NBBottomSheet/NBBottomSheet/Sources/NBBottomSheetTransitioningDelegate.swift; sourceTree = "<group>"; }; + E91F93F84E9AB640A2333FBBF6CCB877 /* EPSignature.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = EPSignature.debug.xcconfig; sourceTree = "<group>"; }; + E9E511B375EE87D380DE8D4B00AE28F4 /* AssetManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssetManager.swift; path = Source/AssetManager.swift; sourceTree = "<group>"; }; + EB8D9081C43164E02C60F65C02702B8E /* AUTO@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "AUTO@3x.png"; path = "Images/AUTO@3x.png"; sourceTree = "<group>"; }; + EC2ECE9C7A88988A534C8F7590F3AB64 /* CameraView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CameraView.swift; path = Source/CameraView/CameraView.swift; sourceTree = "<group>"; }; + EC4B66ABF37EFD118BC08264BBCA6461 /* IQKeyboardReturnKeyHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardReturnKeyHandler.swift; path = IQKeyboardManagerSwift/ReturnKeyHandler/IQKeyboardReturnKeyHandler.swift; sourceTree = "<group>"; }; ED8E7C0ED656254925E918D5509B655C /* Pods-MiniScanner-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MiniScanner-Info.plist"; sourceTree = "<group>"; }; - EE009617DB5A966C6E58EFC97D17875C /* EPSignature.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = EPSignature.debug.xcconfig; sourceTree = "<group>"; }; - F047971CD665BC407A8DAA32AD3A9B98 /* FSPagerViewObjcCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FSPagerViewObjcCompat.h; path = Sources/FSPagerViewObjcCompat.h; sourceTree = "<group>"; }; F3DF46AD6E25D68DB361974528992221 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - FD60805FB0B777848E7DD77214586E88 /* FSPagerView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FSPagerView.debug.xcconfig; sourceTree = "<group>"; }; + F76805C9416BA1FC318E025ACA3B95EF /* IQToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQToolbar.swift; path = IQKeyboardManagerSwift/IQToolbar/IQToolbar.swift; sourceTree = "<group>"; }; + F8292FC683D8C22C77C5F637AF2836FA /* LanguageManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LanguageManager.swift; path = "LanguageManager-iOS/Classes/Main/LanguageManager.swift"; sourceTree = "<group>"; }; + F88000230AEFE1CF1FC184347AAE598B /* IQBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQBarButtonItem.swift; path = IQKeyboardManagerSwift/IQToolbar/IQBarButtonItem.swift; sourceTree = "<group>"; }; + FAE9E39FF0684DBEA572BB783B3A18F7 /* IQKeyboardManagerSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.release.xcconfig; sourceTree = "<group>"; }; + FC40942321CA219791F79BDB4C72DA52 /* LanguageManager-iOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "LanguageManager-iOS.modulemap"; sourceTree = "<group>"; }; + FDF5381B2554B2BB1D7949E3B9A7DF79 /* ImagePicker-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ImagePicker-umbrella.h"; sourceTree = "<group>"; }; + FEB8E045AED5393DCC7FA1C76AB59AB8 /* UIImage+NextPrevious.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+NextPrevious.swift"; path = "IQKeyboardManagerSwift/UIKitExtensions/UIImage+NextPrevious.swift"; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 1F8DF3016F5E08F65F63559E2A2A827B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 2067457DB9BF3FC9BFE99C90B602174A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -389,26 +359,26 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 4D23CB6E5CEA9796267913468D4A3CD3 /* Frameworks */ = { + 356D6AE3CB46F510D123D125D9B58B7C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5D35C19C362961F919BE9820991D761E /* Foundation.framework in Frameworks */, + 8AE718666177B657AE0BBD08AF829DD1 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 60A6157C9520B77A0217CF22A787E99D /* Frameworks */ = { + 4D23CB6E5CEA9796267913468D4A3CD3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 5D35C19C362961F919BE9820991D761E /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7AF0B4E0EB5D8A901728672A5277DAFC /* Frameworks */ = { + 8D97E7F0E48EF9F505EED4D818710D20 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 14638F89550DD287F122C4C8968289F4 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -429,41 +399,9 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - CE9AC41D181266461331A2C974AEA95B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E5ACBBCF353041B05D869DB1467D16B1 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7399F0854271981516AA79727A0A06C8 /* Foundation.framework in Frameworks */, - 2E4A914423BA1B263C96C3BBC43E2245 /* UIKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0113FD3C8FD8AA93BDC06466006587F3 /* NBBottomSheet */ = { - isa = PBXGroup; - children = ( - E711836675BD919C63BEB7A0930B72B4 /* NBBottomSheet.h */, - 8059AF588641259180B6DAD45BEF496B /* NBBottomSheetConfiguration.swift */, - A60D99B014C4219B8F7BF725B9648E36 /* NBBottomSheetController.swift */, - E1DF93E2C3692DABCE7DF9D4735D2645 /* NBBottomSheetDismissalTransition.swift */, - 6C5B4DA5F338896C639DBDA08FCCC486 /* NBBottomSheetPresentationController.swift */, - 3AA92C612F872EADC2BC40A15E01DB23 /* NBBottomSheetPresentationTransition.swift */, - 1BB9A00426C7107F694592F19527BE69 /* NBBottomSheetTransitioningDelegate.swift */, - C698FD30D248D272DAE2F242C5D62EA2 /* NBConfiguration.swift */, - A7F75D63C62A3641741549AB252E760C /* Support Files */, - ); - path = NBBottomSheet; - sourceTree = "<group>"; - }; 0285214F24466DADA9DB9AC0EF8966F0 /* iOS */ = { isa = PBXGroup; children = ( @@ -476,129 +414,175 @@ name = iOS; sourceTree = "<group>"; }; - 033ACCB632D94A95AEEF9DCA045558CA /* Resources */ = { + 0B10F170B5D638262F3C7F41888F7AC7 /* Resources */ = { isa = PBXGroup; children = ( - 2D93C4B3BEDE27E7A936E76984B03C35 /* EPSignatureViewController.xib */, + EB8D9081C43164E02C60F65C02702B8E /* AUTO@3x.png */, + 843CD6046BA80BCDF11AE4FAC807D29B /* cameraIcon@3x.png */, + 9FC1B2AF5635D8020B43F30629EC2712 /* focusIcon@3x.png */, + 18CC4F437D7A0F3454C4F89BD6CE0AEC /* OFF@3x.png */, + 7488E11EF92CBFCB3965EA6F8020E701 /* ON@3x.png */, + 081BAFFE15D81F33E77489E60A036BE7 /* selectedImageGallery@3x.png */, + 45C50C21EF30A0239628BA0E14464BCE /* video@3x.png */, ); name = Resources; sourceTree = "<group>"; }; - 14228F2D01F944CCB04C42A76EB1DBBB /* Support Files */ = { + 1377F47D0ECC009D7BEFB14769F14316 /* ImagePicker */ = { + isa = PBXGroup; + children = ( + E9E511B375EE87D380DE8D4B00AE28F4 /* AssetManager.swift */, + 8F84A913AFEF518DF42A997F74EC8260 /* BottomContainerView.swift */, + D4648CA1088D11129C0BDD49912D6FAB /* ButtonPicker.swift */, + 297D96869095AA06F276F3DA5DD575B7 /* CameraMan.swift */, + EC2ECE9C7A88988A534C8F7590F3AB64 /* CameraView.swift */, + 2A6AE173040683BAF2BF0ACE7CB13A0A /* Configuration.swift */, + 290501CF6F70FA1835207284AF05BEE5 /* ConstraintsSetup.swift */, + 8016BAC4075F40E70BE2133125B01BF5 /* Helper.swift */, + 84969C2137D2629DFFC29942F8B97FEB /* ImageGalleryLayout.swift */, + 21D53725C7625527BF97643CF7655C26 /* ImageGalleryView.swift */, + 2AC4CEA5F2332B5B286CA6B73D2643EF /* ImageGalleryViewCell.swift */, + C5054DCBC2013F1894FA0EE7D6D99005 /* ImageGalleryViewDataSource.swift */, + 9067705903BD2E8C3EC9BD8EBF709221 /* ImagePickerController.swift */, + B7EA56260324998EC43B70CD2092E1FB /* ImageStack.swift */, + 1D01404D467A420F82D2829CE6CD8BB4 /* LocationManager.swift */, + 467961922684B2F4C4295CBE0C9CD940 /* StackView.swift */, + B71FD6B5A8AC626259BE6B97226F81FB /* TopView.swift */, + 02E924FDDE7F7B51AEC552C94D9C9AD6 /* VideoInfoView.swift */, + 0B10F170B5D638262F3C7F41888F7AC7 /* Resources */, + 69769D414834BD844C659CFA8A148FDF /* Support Files */, + ); + path = ImagePicker; + sourceTree = "<group>"; + }; + 1CD1A4CC34821855EE0B47C1DB7536BD /* LanguageManager-iOS */ = { + isa = PBXGroup; + children = ( + 9DDA4537FCBE11326C1D65EA43B3CC6D /* DefaultsKeys.swift */, + F8292FC683D8C22C77C5F637AF2836FA /* LanguageManager.swift */, + C2B28EA5FE2C09FCEF4DF47D34186FB7 /* Languages.swift */, + DCB418B4C0BF451B734FFA48AAD9ADF6 /* Storage.swift */, + 4D01E52DE74EF3C733B94F1E045CCD77 /* String+Localiz.swift */, + B4E6D4AE8BCE2646794F28F0E24A08D1 /* UIButton+Direction.swift */, + 7927C464AC094A95C8B864DF6A0B1D06 /* UIImageView+Direction.swift */, + 4B432B6773BE3F0B4A6976820602F07A /* UIView+Direction.swift */, + 252B706186B99322E0DA5829FCC7D43C /* UIView+Swizzling.swift */, + AC259076A4D444F235DABE44D7425021 /* ViewDirection.swift */, + 4B36B2F6BD2CAF18A7FFFF0D7E1E84E6 /* Support Files */, + ); + path = "LanguageManager-iOS"; + sourceTree = "<group>"; + }; + 26BC96ABCD3829D81C157FA2F5CD0DCE /* Support Files */ = { isa = PBXGroup; children = ( - 085D4171A3F780C04EFB71FBC8E635E1 /* LanguageManager-iOS.modulemap */, - DA4B76FEC2A143DA2EFFC6D3F7FB7B5A /* LanguageManager-iOS-dummy.m */, - 13CD760B3298D3E6B007FC21AEFDEF16 /* LanguageManager-iOS-Info.plist */, - 4138C0C249C44F4ED4EF526B81270B66 /* LanguageManager-iOS-prefix.pch */, - ED50ABC97C7298629CFFE2835E5645AE /* LanguageManager-iOS-umbrella.h */, - 2EEF70A7586548C9681199386735B949 /* LanguageManager-iOS.debug.xcconfig */, - 8C6B2F7653C95633BB9449F87EB6DBD9 /* LanguageManager-iOS.release.xcconfig */, + 3D666C16AFD99E3736270D569B5DE2F1 /* EPSignature.modulemap */, + E24E6B8D32E615F0FEF0A78F3C181A09 /* EPSignature-dummy.m */, + 1DA09D0759A4DDF814A83483F582ADB1 /* EPSignature-Info.plist */, + CD55E5F51909EE297A2AC039F257AF6F /* EPSignature-prefix.pch */, + 0A36BA6D882CE68172CAE63D99BCB5BA /* EPSignature-umbrella.h */, + E91F93F84E9AB640A2333FBBF6CCB877 /* EPSignature.debug.xcconfig */, + 2006321B115FD55474FD1B985C1979FA /* EPSignature.release.xcconfig */, ); name = "Support Files"; - path = "../Target Support Files/LanguageManager-iOS"; + path = "../Target Support Files/EPSignature"; sourceTree = "<group>"; }; - 159345AC740753E09FF1E49D7B342203 /* Resources */ = { + 32620674ED381C186389FA1D871AFD24 /* NBBottomSheet */ = { isa = PBXGroup; children = ( - 664FCD8539D02C2C7ABBA15E9666F2B9 /* AUTO@3x.png */, - 8F9A6C68497A6CFFB3FAA52682750752 /* cameraIcon@3x.png */, - A2A1F3E9AD6E574C81576EFC109E4F56 /* focusIcon@3x.png */, - 2E2B400DD678EA303FAFFBEF32CBCA41 /* OFF@3x.png */, - BC0F20E077483A5E6339C4C6304E6507 /* ON@3x.png */, - C6214DC5E72470BE3105210D7465B90A /* selectedImageGallery@3x.png */, - 5D646977F7C0DA29D63C4E18D9DD6630 /* video@3x.png */, + C6AEEFA5613E0B7BF8F6425A154D6EC9 /* NBBottomSheet.h */, + A72C2CB61DAC20DBF7210307C41485C5 /* NBBottomSheetConfiguration.swift */, + 54323777101C6AB180A413C0B2DB23B9 /* NBBottomSheetController.swift */, + 97037D70AD7F37FBCDB7561DA20D7D2D /* NBBottomSheetDismissalTransition.swift */, + E1D47766C4492BAF84E069DF6E3DD758 /* NBBottomSheetPresentationController.swift */, + 00B378319A98BB422CBDBE14796C501A /* NBBottomSheetPresentationTransition.swift */, + E7F7A4EA7A5659C2F78D04CC218E1440 /* NBBottomSheetTransitioningDelegate.swift */, + CD46A963E6CCE8CD900BA8A7331D7D8C /* NBConfiguration.swift */, + 82B9E590AF4CA104F25BE686066D17D4 /* Support Files */, ); - name = Resources; + path = NBBottomSheet; sourceTree = "<group>"; }; - 2524B6CA73749FE91A5B77026AB9E48B /* Support Files */ = { + 3EA95E4CF3A010D9796C8FD8B665C566 /* Support Files */ = { isa = PBXGroup; children = ( - 7BB12D707BA745ED62C48151519D0E76 /* IQKeyboardManagerSwift.modulemap */, - BA790DC54E7A009FDDBBC07056093C41 /* IQKeyboardManagerSwift-dummy.m */, - 01FB3E845976BA7356CB95994A0420CD /* IQKeyboardManagerSwift-Info.plist */, - A8D2ABDB4E2F157885C7BEE654CF6FC4 /* IQKeyboardManagerSwift-prefix.pch */, - C94B5C4512123F377D23B93F1FA23097 /* IQKeyboardManagerSwift-umbrella.h */, - 86D4965F304A9370159F8BEE0D0951D5 /* IQKeyboardManagerSwift.debug.xcconfig */, - 04420AA069E60E2676B1C8145D489AFE /* IQKeyboardManagerSwift.release.xcconfig */, - B5A83B1987A0D179A3EAE24B6183FF37 /* ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist */, + 32CC609D1546AF3789419217412783D0 /* IQKeyboardManagerSwift.modulemap */, + D4270A3541F22B881BD953A68F6E73F9 /* IQKeyboardManagerSwift-dummy.m */, + 5F8E6400E281B0FB397224FDE9690416 /* IQKeyboardManagerSwift-Info.plist */, + 45865163BC96B7A2B481C17A0EC1D4F8 /* IQKeyboardManagerSwift-prefix.pch */, + 8147290C4A326DADC3F305533BD64023 /* IQKeyboardManagerSwift-umbrella.h */, + 7C9ABFFD091844286C2E85A20189BF7A /* IQKeyboardManagerSwift.debug.xcconfig */, + FAE9E39FF0684DBEA572BB783B3A18F7 /* IQKeyboardManagerSwift.release.xcconfig */, + 472E9223ECD1656D4CD5CD1BDC50D9CA /* ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist */, ); name = "Support Files"; path = "../Target Support Files/IQKeyboardManagerSwift"; sourceTree = "<group>"; }; - 26A3C923FF2FC3BF84BADEC1E731C9D1 /* Support Files */ = { + 4A4B14A5B6B233355F4F15CA6F41639D /* EPSignature */ = { isa = PBXGroup; children = ( - E6049E937091EF3FC850CDC4BEF9B925 /* EPSignature.modulemap */, - B3FCB83859385DB3694F04D44B40FE18 /* EPSignature-dummy.m */, - 3C28E959FA9C6343351C3EA1ED606EBA /* EPSignature-Info.plist */, - D2E621AE82FB76EEF79C8A2D0102AAF7 /* EPSignature-prefix.pch */, - A7BA040D977C503D2A8C2D9BF404E21C /* EPSignature-umbrella.h */, - EE009617DB5A966C6E58EFC97D17875C /* EPSignature.debug.xcconfig */, - E3DA260DCB001D3DF844896311887A56 /* EPSignature.release.xcconfig */, + 2E9D8E28679896AEA1627BA66F8580C2 /* EPExtensions.swift */, + 452182903F9A76184461CC377DB62A70 /* EPSignatureView.swift */, + C1A5BF586C35098EC908E7870B407170 /* EPSignatureViewController.swift */, + A2352D8C906BE3FB6FAD9C1888ABF323 /* Resources */, + 26BC96ABCD3829D81C157FA2F5CD0DCE /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/EPSignature"; + path = EPSignature; sourceTree = "<group>"; }; - 2A17FA4F601F6E648A9D9E4A00514B43 /* FSPagerView */ = { + 4B36B2F6BD2CAF18A7FFFF0D7E1E84E6 /* Support Files */ = { isa = PBXGroup; children = ( - D6D6492D4AE05CD36F797199E44F1805 /* FSPageControl.swift */, - 3E9452E6ADBDB9FF5D00CEDC3ED637F3 /* FSPagerCollectionView.swift */, - E3703BDC76205E7D102F2BF32B3D8ACC /* FSPagerView.swift */, - 842BA45676E86EFC650EFC7B33D1572F /* FSPagerViewCell.swift */, - 891FABB9A51285F499148E921B1A8E24 /* FSPagerViewLayoutAttributes.swift */, - F047971CD665BC407A8DAA32AD3A9B98 /* FSPagerViewObjcCompat.h */, - B7F2D378ED96DA779D964000E6DECED9 /* FSPagerViewObjcCompat.m */, - D5F711A94EB088CF457F893E60C568B4 /* FSPageViewLayout.swift */, - B909C40450F7213C478AE50F7E2D18A9 /* FSPageViewTransformer.swift */, - 3012AAA80F07B88F99FF98BFC49DEB12 /* Support Files */, - ); - path = FSPagerView; + FC40942321CA219791F79BDB4C72DA52 /* LanguageManager-iOS.modulemap */, + BF809679D3CFFBC72878EC9BFEA90F5E /* LanguageManager-iOS-dummy.m */, + 48FAE289F4B7A5D4D99BDB1F74A1C163 /* LanguageManager-iOS-Info.plist */, + DC9A64B83C916D4FC5C9CE722E697819 /* LanguageManager-iOS-prefix.pch */, + 3510141CBBD30B465F757E0A8E2B1097 /* LanguageManager-iOS-umbrella.h */, + 8BA50CB662E7C23406F0B83501BA32D7 /* LanguageManager-iOS.debug.xcconfig */, + 9AAA7A084DC8F453913C80DE1E243C39 /* LanguageManager-iOS.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/LanguageManager-iOS"; sourceTree = "<group>"; }; - 2E7A5EFE117E058AC986DCE2A08D9981 /* LanguageManager-iOS */ = { + 67EA5FFBCFCDDED6A445407A917EE0A1 /* Targets Support Files */ = { isa = PBXGroup; children = ( - 615EB6B3844737F49004E6E4A8F968A0 /* DefaultsKeys.swift */, - 8434491D5623794FFD75623AC5720E3C /* LanguageManager.swift */, - CACF959977B91C5F65F381B36C452B6D /* Languages.swift */, - 4D0027E6314671B943C4497115466711 /* Storage.swift */, - 398208613C39BD5EF043841FA4CBF884 /* String+Localiz.swift */, - A4D36302D2F7234AEEC28003C3244EB4 /* UIButton+Direction.swift */, - 5761D7B5C5A856ED4D8A03F284C8771F /* UIImageView+Direction.swift */, - 586B6FC37EB8231AC7C24C1CC2776384 /* UIView+Direction.swift */, - 1EF3F9326AE21BCEED16E14D0872FE9C /* UIView+Swizzling.swift */, - 8EA72F0B0DD57B9D078AF8EFCE412455 /* ViewDirection.swift */, - 14228F2D01F944CCB04C42A76EB1DBBB /* Support Files */, + EC99F10DC5C191754BE16B2F6AC739A8 /* Pods-MiniScanner */, ); - path = "LanguageManager-iOS"; + name = "Targets Support Files"; sourceTree = "<group>"; }; - 3012AAA80F07B88F99FF98BFC49DEB12 /* Support Files */ = { + 69769D414834BD844C659CFA8A148FDF /* Support Files */ = { isa = PBXGroup; children = ( - 9A0A414944257050868C6C9F38FA10DF /* FSPagerView.modulemap */, - 7A54F7427340E254B559EC1244CA2E45 /* FSPagerView-dummy.m */, - 490673E82DCDC51D3CF4E4936D75E6F6 /* FSPagerView-Info.plist */, - 4105CD9664E76F34242222CF357D24ED /* FSPagerView-prefix.pch */, - 01ACC366C89CCCD7C9CF3E69462AC2A7 /* FSPagerView-umbrella.h */, - FD60805FB0B777848E7DD77214586E88 /* FSPagerView.debug.xcconfig */, - 507C1B0C545DAAFE25BB8DD789F224EF /* FSPagerView.release.xcconfig */, + 17EF00C659AFF94B598E7501E2992350 /* ImagePicker.modulemap */, + 3FD2850880C4A8033AED333F5DFAE328 /* ImagePicker-dummy.m */, + 180962FC6F75908EC73049ADB28FC887 /* ImagePicker-Info.plist */, + B710E28309BEA5C002164BD008CFB6C0 /* ImagePicker-prefix.pch */, + FDF5381B2554B2BB1D7949E3B9A7DF79 /* ImagePicker-umbrella.h */, + 6224FD5F7C95061A57CAFA73995B3002 /* ImagePicker.debug.xcconfig */, + 0CBC68B38C0421EC0AE36B43FB2C7636 /* ImagePicker.release.xcconfig */, + 0AF6D83B6BEECA27C12EB10E96CF4A52 /* ResourceBundle-ImagePicker-ImagePicker-Info.plist */, ); name = "Support Files"; - path = "../Target Support Files/FSPagerView"; + path = "../Target Support Files/ImagePicker"; sourceTree = "<group>"; }; - 39D6CDB78D2E7EAED2CBF8A76DC770A5 /* Products */ = { + 74EBBEDBF3B9E91A60E18ADBE0893A25 /* Resources */ = { + isa = PBXGroup; + children = ( + A532EFEAAE9EEAA7CFA7DF04C7E1808B /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = "<group>"; + }; + 7FE4C9AB96A6A8E628751776D1D495CB /* Products */ = { isa = PBXGroup; children = ( 3DFAC6F70B9CECADF5873F487AF082BA /* EPSignature.framework */, - 0F47FB5E28EE8C8342B1776D813D1A4C /* FSPagerView.framework */, 987CD19BC0CE18F2E00B0AD5ABF8670D /* ImagePicker.framework */, 97AA160F23F0CBEDDAF212103E762FC7 /* ImagePicker.bundle */, A8E950A16D00F649C54FFB30F81D7842 /* IQKeyboardManagerSwift.framework */, @@ -610,66 +594,79 @@ name = Products; sourceTree = "<group>"; }; - 3CA2F37400AD74A8892927594B43C307 /* ImagePicker */ = { + 80AD8CA2B1725CE71EDD106621961603 /* IQKeyboardManagerSwift */ = { isa = PBXGroup; children = ( - 7F6DD614B85D0662209A3ADCFA367295 /* AssetManager.swift */, - 4A4F7BDE573EF1AD77F082087EBBC731 /* BottomContainerView.swift */, - B021EB40B85B76049C30C2D063F0870D /* ButtonPicker.swift */, - 3B78794BA632342FFC447557E4671B16 /* CameraMan.swift */, - 343F83F1A08E56F19D01674A9BA4DC53 /* CameraView.swift */, - 90C7704EF389F83C731970D2CDF6595B /* Configuration.swift */, - 9E44A8883A35E6A01365B1C682A1164D /* ConstraintsSetup.swift */, - DB2BF5C6F33D3DA91B2EB11B23EEE3FE /* Helper.swift */, - 54A9B08BB29EC7935F6A8F8ACD56BEB0 /* ImageGalleryLayout.swift */, - CE5D7D46BA438C135B812D0C145CBE6C /* ImageGalleryView.swift */, - 689EF9768E3E18B833DD776EAD893408 /* ImageGalleryViewCell.swift */, - E62A4882567E433682E9D7925C2BDA73 /* ImageGalleryViewDataSource.swift */, - 21142CC27FC93E41241CC8948B1EE25C /* ImagePickerController.swift */, - 47978E33AA1FE786BB675EA3F66DE381 /* ImageStack.swift */, - BAA72CEA94002E53D03EC7DCC0E59413 /* LocationManager.swift */, - D8CA0DD8AA6C4033E65CAA6FE83870F1 /* StackView.swift */, - 5FF2B9AD02F97A175585504BA5B7F448 /* TopView.swift */, - BA1D8FBFBA4E4BE6EC7D55255DE3EFBC /* VideoInfoView.swift */, - 159345AC740753E09FF1E49D7B342203 /* Resources */, - F77F18FFC2A0B514B85F4840876DA397 /* Support Files */, + 4FE3DE7F264E30C392DCECA7921DAEF2 /* IQActiveConfiguration.swift */, + F88000230AEFE1CF1FC184347AAE598B /* IQBarButtonItem.swift */, + 419AB69B674D6C318AC58EE6D9AFF102 /* IQBarButtonItemConfiguration.swift */, + A12B5A63F2CB09B7D22B7E2F4A2210EB /* IQInvocation.swift */, + 297848FCF8FE33D0DA0FDA6C8B1F5CC3 /* IQKeyboardConfiguration.swift */, + 8F3317C2A83E43FF75DFCFD3FAEB3669 /* IQKeyboardInfo.swift */, + 400224F8C71E7053C79E8D5E509534F4 /* IQKeyboardListener.swift */, + A353C25676960291A3718B5AFDB81A33 /* IQKeyboardManager.swift */, + 5B1D47B8C43A0DA0A05A410655A28153 /* IQKeyboardManager+Debug.swift */, + B6C5E34F15E4BBDA3480406FF35C1903 /* IQKeyboardManager+Deprecated.swift */, + AB94CC5B3F453AA0801700167152FCA1 /* IQKeyboardManager+Internal.swift */, + 05DDE99E61633BB77D72F46FD10F71BC /* IQKeyboardManager+Position.swift */, + A1229814968DD5876FBA87DDA81C5B8F /* IQKeyboardManager+Toolbar.swift */, + D9651F46100B3C105EE27B92C1DFFCEC /* IQKeyboardManager+ToolbarActions.swift */, + D2DB0BCD57E720CE97C1C3CE74B75024 /* IQKeyboardManager+UIKeyboardNotification.swift */, + A0DA73612FA4F954FCE02EA0ADACE634 /* IQKeyboardManager+UITextFieldViewNotification.swift */, + 49FC6FE3F43F76CA598D3253A1731EEB /* IQKeyboardManagerCompatible.swift */, + D9F19506C84032240A21541F9EFCA895 /* IQKeyboardManagerConstants.swift */, + EC4B66ABF37EFD118BC08264BBCA6461 /* IQKeyboardReturnKeyHandler.swift */, + 8F0A5164AA0CCC729C8EA5166760BA9E /* IQKeyboardReturnKeyHandler+TextFieldDelegate.swift */, + B5EDE1D4720CA7A048A32667F968ED10 /* IQKeyboardReturnKeyHandler+TextViewDelegate.swift */, + 62160BE00E3966D4D52808B89DE0B1B3 /* IQNSArray+Sort.swift */, + D3DC4A4D35E057E5F76427C838E3E495 /* IQPlaceholderable.swift */, + 187B8EDBE8957C190B1EB7C8F949ED80 /* IQPreviousNextView.swift */, + 878EC7606D056CAB26A578762AF922D7 /* IQRootControllerConfiguration.swift */, + 486835CC5D14C1EA193F8575CA89FDCC /* IQScrollViewConfiguration.swift */, + E34B4735C7461EBF9AEEC896DEB27C33 /* IQTextFieldViewInfo.swift */, + 00AA2070B1A7F8ECC88B6E7F0EEB2167 /* IQTextFieldViewInfoModel.swift */, + 6F6826627BFA6A69002524426F8CFFB7 /* IQTextFieldViewListener.swift */, + 5A6291B42FA169A1C1919CB49B0B8509 /* IQTextView.swift */, + A100F9EA89810A00541755ECD7BBB307 /* IQTitleBarButtonItem.swift */, + F76805C9416BA1FC318E025ACA3B95EF /* IQToolbar.swift */, + 3243FB397BF2AFE225A1FC09542DBF5D /* IQToolbarConfiguration.swift */, + A3B5F550C3AA900D117E22291DE5D67C /* IQToolbarPlaceholderConfiguration.swift */, + 92470A870676C63A27509F38301D521C /* IQUICollectionView+Additions.swift */, + 6B5E1D310DD754E122DEEE009481A2D6 /* IQUIScrollView+Additions.swift */, + 619978A0C0036454C22A81173BAA5A6A /* IQUITableView+Additions.swift */, + 116DA05004680C76EAB707C0943392EB /* IQUITextFieldView+Additions.swift */, + D55EBF017F6625B593286F47CFEB1FA3 /* IQUIView+Hierarchy.swift */, + AB5F2D5DFB52DE92C94A23801BAC451C /* IQUIView+IQKeyboardToolbar.swift */, + 8E6FDE31134B7541747D1E89E52E225A /* IQUIView+IQKeyboardToolbarDeprecated.swift */, + B5598E57D63117C1B54ADBB7A187B232 /* IQUIViewController+Additions.swift */, + FEB8E045AED5393DCC7FA1C76AB59AB8 /* UIImage+NextPrevious.swift */, + 74EBBEDBF3B9E91A60E18ADBE0893A25 /* Resources */, + 3EA95E4CF3A010D9796C8FD8B665C566 /* Support Files */, ); - path = ImagePicker; - sourceTree = "<group>"; - }; - 3E464AC9EEFEEE8C0975B029E5B7418E /* EPSignature */ = { - isa = PBXGroup; - children = ( - 1E288979D79A43A7925DB41055CDD376 /* EPExtensions.swift */, - BE559964BD58119769FB19BB95144A6A /* EPSignatureView.swift */, - AF61B6A70C39B0ACDA33B583642A26EE /* EPSignatureViewController.swift */, - 033ACCB632D94A95AEEF9DCA045558CA /* Resources */, - 26A3C923FF2FC3BF84BADEC1E731C9D1 /* Support Files */, - ); - path = EPSignature; + path = IQKeyboardManagerSwift; sourceTree = "<group>"; }; - 67EA5FFBCFCDDED6A445407A917EE0A1 /* Targets Support Files */ = { + 82B9E590AF4CA104F25BE686066D17D4 /* Support Files */ = { isa = PBXGroup; children = ( - EC99F10DC5C191754BE16B2F6AC739A8 /* Pods-MiniScanner */, + E68A22DD9E65EF800882452842690AE1 /* NBBottomSheet.modulemap */, + AD71C20FAD4FE7E08FA8091857A2FDCB /* NBBottomSheet-dummy.m */, + 0B1626D50D1FBDF5976CCCE6F16928A1 /* NBBottomSheet-Info.plist */, + 0CB32F67F5B5E9A2C263A017E98041AC /* NBBottomSheet-prefix.pch */, + 389AA43304A03366FC2510859AA7DCBA /* NBBottomSheet-umbrella.h */, + 45B232DE9D6710FE8BF7DC25C2C80333 /* NBBottomSheet.debug.xcconfig */, + 26EDF88E14046AAC34BFF99F97D23B05 /* NBBottomSheet.release.xcconfig */, ); - name = "Targets Support Files"; + name = "Support Files"; + path = "../Target Support Files/NBBottomSheet"; sourceTree = "<group>"; }; - A7F75D63C62A3641741549AB252E760C /* Support Files */ = { + A2352D8C906BE3FB6FAD9C1888ABF323 /* Resources */ = { isa = PBXGroup; children = ( - 23A10D783B0ECA5BA75D4E94BDA01957 /* NBBottomSheet.modulemap */, - 1935C8E9966B3C94DD69B219D3DBFBD0 /* NBBottomSheet-dummy.m */, - CA39A57EEAD9575350DCFB2377E01DD9 /* NBBottomSheet-Info.plist */, - 50F1C0F59A45281CE2D310673AE0571F /* NBBottomSheet-prefix.pch */, - 65E35E2A8DCF85A60B0EF9389B0495AE /* NBBottomSheet-umbrella.h */, - 22FCBFA0E2A7651B248460AD3CB4DE32 /* NBBottomSheet.debug.xcconfig */, - 4E8E62EE488350F66CC08D1D88AF14EE /* NBBottomSheet.release.xcconfig */, + 56C1C453B74E770D4AC56A090051BCF5 /* EPSignatureViewController.xib */, ); - name = "Support Files"; - path = "../Target Support Files/NBBottomSheet"; + name = Resources; sourceTree = "<group>"; }; B94D7768568A9992200DB461E8CF687F /* Frameworks */ = { @@ -680,90 +677,29 @@ name = Frameworks; sourceTree = "<group>"; }; - CDA83A613FCB366E70C92238C360E636 /* IQKeyboardManagerSwift */ = { - isa = PBXGroup; - children = ( - 831781174B420BA2000C5A20F9B1A155 /* IQActiveConfiguration.swift */, - 065FDC013F6128B451B9F622F8A98C11 /* IQBarButtonItem.swift */, - 4DA62F8724EC161B523761C4D312EE6A /* IQBarButtonItemConfiguration.swift */, - 32A5E10DAD7E67CBAFB25E12CF020274 /* IQInvocation.swift */, - B700D2C4CED5ED22050429C7997CF1FE /* IQKeyboardConfiguration.swift */, - 69FC816770553B761090561AE8707674 /* IQKeyboardInfo.swift */, - A1BD1A58666D6C0FD408F4DB3ADC8107 /* IQKeyboardListener.swift */, - 1B4086624F01B0B30DDB90F23478F288 /* IQKeyboardManager.swift */, - 4CEB26DB8656A60C8AE2B83EF56A1149 /* IQKeyboardManager+Debug.swift */, - 4F2207491E92F152C27D2B4A764A6A93 /* IQKeyboardManager+Deprecated.swift */, - A230ED28736A611DEEC851620E6444DE /* IQKeyboardManager+Internal.swift */, - 2209E8AC4BD6C9607BD14A1D48B3FBB3 /* IQKeyboardManager+Position.swift */, - 88DFD4B8DC15592A7CD38D8AD9C01668 /* IQKeyboardManager+Toolbar.swift */, - 7F23D0E0AE3BDC7AE6A7D331A0FF5AF6 /* IQKeyboardManager+ToolbarActions.swift */, - 4A5338232CA701AD47A2EA3B534BD224 /* IQKeyboardManager+UIKeyboardNotification.swift */, - 0EFB4A164AE952F817BA0A6FCE622791 /* IQKeyboardManager+UITextFieldViewNotification.swift */, - EA5483FEE1B87041C4751EA1D4F3EF54 /* IQKeyboardManagerCompatible.swift */, - AC43EDC562847626ACF7B4E93E5462EF /* IQKeyboardManagerConstants.swift */, - E21781AECFBC7371F2118155ACE5C3C7 /* IQKeyboardReturnKeyHandler.swift */, - 7136D2DF9E35BE04AE50612BF8809136 /* IQKeyboardReturnKeyHandler+TextFieldDelegate.swift */, - B6C332B0108C87436290C293E043023A /* IQKeyboardReturnKeyHandler+TextViewDelegate.swift */, - C1DC2A0ED79E1179E28CE75BFECCDA82 /* IQNSArray+Sort.swift */, - CE58805A3FAC71C6A5782C1B1BB08069 /* IQPlaceholderable.swift */, - DE7235727A466A9B7BF8342CC42C4B91 /* IQPreviousNextView.swift */, - 24533AECDB8F27FACE2D96631FC3F307 /* IQRootControllerConfiguration.swift */, - 545688259B1D4CD8A59AF3D7E0AFE7B9 /* IQScrollViewConfiguration.swift */, - 309F127A50B023B6041C44942C9079DE /* IQTextFieldViewInfo.swift */, - 23B7EBFBD51FC4710CDE4AFAE46E8860 /* IQTextFieldViewInfoModel.swift */, - 3DB66972AE146B779F56CFD49B324220 /* IQTextFieldViewListener.swift */, - 8B5D88BFE14997FA9B22FA4A4B8CD6DA /* IQTextView.swift */, - 4DB37A30323A7D2ED16581BA15B8351D /* IQTitleBarButtonItem.swift */, - 926EAAA6426204DE1DF8D36D2E13EA74 /* IQToolbar.swift */, - 8A9AA0FBABA9E9EEF6521C23B2031158 /* IQToolbarConfiguration.swift */, - 92CEF8FFA7885B7EC96C4120D507A08F /* IQToolbarPlaceholderConfiguration.swift */, - D4C85B9AE116359EBFD1959406B32999 /* IQUICollectionView+Additions.swift */, - A8A8D208D764CFAC89604E6813F1444E /* IQUIScrollView+Additions.swift */, - C6F5B0BFC63CD2F3B0DF56912D4F54E8 /* IQUITableView+Additions.swift */, - 79655C283B54B5F907790F4E79C388EF /* IQUITextFieldView+Additions.swift */, - BE1348270A5A7F3FDEFAC32D8E89686A /* IQUIView+Hierarchy.swift */, - 3DF9BB8A2089DB5AEEA4B43132D0B074 /* IQUIView+IQKeyboardToolbar.swift */, - 47A7457CB008481373FBC626968AD770 /* IQUIView+IQKeyboardToolbarDeprecated.swift */, - 9B35CF76304163C551A5E4B592066D0D /* IQUIViewController+Additions.swift */, - AC7F01FAC278F9B096CFFD78497206CF /* UIImage+NextPrevious.swift */, - D83F449675FA61063F04877699E1FBD8 /* Resources */, - 2524B6CA73749FE91A5B77026AB9E48B /* Support Files */, - ); - path = IQKeyboardManagerSwift; - sourceTree = "<group>"; - }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, B94D7768568A9992200DB461E8CF687F /* Frameworks */, - CF40832A62CD5EA22B643D00EBBD9BFD /* Pods */, - 39D6CDB78D2E7EAED2CBF8A76DC770A5 /* Products */, + D3C95BBF75043277050186353459BC4F /* Pods */, + 7FE4C9AB96A6A8E628751776D1D495CB /* Products */, 67EA5FFBCFCDDED6A445407A917EE0A1 /* Targets Support Files */, ); sourceTree = "<group>"; }; - CF40832A62CD5EA22B643D00EBBD9BFD /* Pods */ = { + D3C95BBF75043277050186353459BC4F /* Pods */ = { isa = PBXGroup; children = ( - 3E464AC9EEFEEE8C0975B029E5B7418E /* EPSignature */, - 2A17FA4F601F6E648A9D9E4A00514B43 /* FSPagerView */, - 3CA2F37400AD74A8892927594B43C307 /* ImagePicker */, - CDA83A613FCB366E70C92238C360E636 /* IQKeyboardManagerSwift */, - 2E7A5EFE117E058AC986DCE2A08D9981 /* LanguageManager-iOS */, - 0113FD3C8FD8AA93BDC06466006587F3 /* NBBottomSheet */, + 4A4B14A5B6B233355F4F15CA6F41639D /* EPSignature */, + 1377F47D0ECC009D7BEFB14769F14316 /* ImagePicker */, + 80AD8CA2B1725CE71EDD106621961603 /* IQKeyboardManagerSwift */, + 1CD1A4CC34821855EE0B47C1DB7536BD /* LanguageManager-iOS */, + 32620674ED381C186389FA1D871AFD24 /* NBBottomSheet */, ); name = Pods; sourceTree = "<group>"; }; - D83F449675FA61063F04877699E1FBD8 /* Resources */ = { - isa = PBXGroup; - children = ( - B638343F1BC71A9A9CD3A6D6CA749DC7 /* PrivacyInfo.xcprivacy */, - ); - name = Resources; - sourceTree = "<group>"; - }; EC99F10DC5C191754BE16B2F6AC739A8 /* Pods-MiniScanner */ = { isa = PBXGroup; children = ( @@ -781,34 +717,9 @@ path = "Target Support Files/Pods-MiniScanner"; sourceTree = "<group>"; }; - F77F18FFC2A0B514B85F4840876DA397 /* Support Files */ = { - isa = PBXGroup; - children = ( - 30A55721765A033C43BEE85DF167DC60 /* ImagePicker.modulemap */, - 4AAF24BB95964A47FF71115DCACE5CC1 /* ImagePicker-dummy.m */, - 4EEEA55AC9C261C1EABE60EC57A5021B /* ImagePicker-Info.plist */, - 82E4B4BB461879C2730CD6E789150CB8 /* ImagePicker-prefix.pch */, - DD48D4FC5BD3A99772F4FE6FDB643898 /* ImagePicker-umbrella.h */, - 9027793C7414B308134453884A6716FD /* ImagePicker.debug.xcconfig */, - DBE740FF0A3373F56E7AF2A4000D6D8C /* ImagePicker.release.xcconfig */, - 317125123DFF6A76FF8664EF536038C2 /* ResourceBundle-ImagePicker-ImagePicker-Info.plist */, - ); - name = "Support Files"; - path = "../Target Support Files/ImagePicker"; - sourceTree = "<group>"; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 0608DA1408F82CC4ADBFAF480D0FA2B4 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - CE2C6FD104092EA3F2F0A357C72460A8 /* FSPagerView-umbrella.h in Headers */, - 91611428D06F5E61CECF70A53E6DA6C6 /* FSPagerViewObjcCompat.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 11370304D07B86BF4935D7D5A612503A /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -825,28 +736,28 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 63F686C3D19F8A097B95FBAA087727D3 /* Headers */ = { + 77150D3DA409E22AAAE3AC967B0FDC17 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 9517FE286FAA3C856DC6C1B6F91F48CF /* Pods-MiniScanner-umbrella.h in Headers */, + 3573FA382FBE08F99039CED491DB9FF0 /* IQKeyboardManagerSwift-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 77150D3DA409E22AAAE3AC967B0FDC17 /* Headers */ = { + 9C1E51FBB23B8F5AC126898FEDD00F52 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 3573FA382FBE08F99039CED491DB9FF0 /* IQKeyboardManagerSwift-umbrella.h in Headers */, + 797DF46337EAC66E47C5ADAF32515524 /* NBBottomSheet.h in Headers */, + FE4936BFE1B6B6A9E8136010E413A24B /* NBBottomSheet-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9C1E51FBB23B8F5AC126898FEDD00F52 /* Headers */ = { + E1A4DFD94B34CD656D047F2CE55E141E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 797DF46337EAC66E47C5ADAF32515524 /* NBBottomSheet.h in Headers */, - FE4936BFE1B6B6A9E8136010E413A24B /* NBBottomSheet-umbrella.h in Headers */, + C884AFFEC6B0F6540E8A5593250D5741 /* Pods-MiniScanner-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -873,7 +784,7 @@ buildRules = ( ); dependencies = ( - E9327F4979BAC249AD227EFB65293BB7 /* PBXTargetDependency */, + 7907CFE4C755F2FC455B6FB6B982A84E /* PBXTargetDependency */, ); name = ImagePicker; productName = ImagePicker; @@ -900,22 +811,21 @@ }; 4372AB6A3C495222906A1ABFD39A4463 /* Pods-MiniScanner */ = { isa = PBXNativeTarget; - buildConfigurationList = 4E37980CDFA92572E6955A05C6C57717 /* Build configuration list for PBXNativeTarget "Pods-MiniScanner" */; + buildConfigurationList = 21E40E7EF4A668720A0BC4974A414686 /* Build configuration list for PBXNativeTarget "Pods-MiniScanner" */; buildPhases = ( - 63F686C3D19F8A097B95FBAA087727D3 /* Headers */, - 809C6F992289D71DBD1D7BFA4B05305A /* Sources */, - 7AF0B4E0EB5D8A901728672A5277DAFC /* Frameworks */, - 9078164A79E8D5740BDAFCB454C8B826 /* Resources */, + E1A4DFD94B34CD656D047F2CE55E141E /* Headers */, + AA10E1444171443C0B5BCA1096353377 /* Sources */, + 356D6AE3CB46F510D123D125D9B58B7C /* Frameworks */, + 7548C4739E6BCE23ABB1B5BD57E7ED73 /* Resources */, ); buildRules = ( ); dependencies = ( - 4AE52BA60D1AEFF2B1AFFE147C779165 /* PBXTargetDependency */, - 40292EA58C6CD288650B534FC0E7FCDC /* PBXTargetDependency */, - 0139628E2EDB9A6AD2B119DE4D1B092B /* PBXTargetDependency */, - B1DD8053C35D0B44F2268CAB89353885 /* PBXTargetDependency */, - D836F926DCF33106AFD6E73977095C38 /* PBXTargetDependency */, - D341CBE09A66072A9CD356EF2EB37FF7 /* PBXTargetDependency */, + 6D816E6D698E10FDBE40764CC34D49B2 /* PBXTargetDependency */, + 29743ED8B9772E83B55B66D15C7751B6 /* PBXTargetDependency */, + 41BDC0B4C02D2F478CF6E580BB0ED276 /* PBXTargetDependency */, + 1F155C5185BA60981E950C8356C10505 /* PBXTargetDependency */, + 090A4DADA36A746FDB7C115750022A52 /* PBXTargetDependency */, ); name = "Pods-MiniScanner"; productName = Pods_MiniScanner; @@ -924,11 +834,11 @@ }; 614D1818852890AC7D3CDF68D512C370 /* ImagePicker-ImagePicker */ = { isa = PBXNativeTarget; - buildConfigurationList = CB7A73EFBC09495176FD10B3C82A8767 /* Build configuration list for PBXNativeTarget "ImagePicker-ImagePicker" */; + buildConfigurationList = 61E5E465E4EBDC7192A60BDB29B54904 /* Build configuration list for PBXNativeTarget "ImagePicker-ImagePicker" */; buildPhases = ( - C361A7756A2D12C04F9F6C0F631D4AFB /* Sources */, - CE9AC41D181266461331A2C974AEA95B /* Frameworks */, - 469AC1D9DADBAC72A4A8876068211A6A /* Resources */, + 557CE2F544FA412F5D8D59F28849E31F /* Sources */, + 8D97E7F0E48EF9F505EED4D818710D20 /* Frameworks */, + 48F3F81CFBD0387B6D359B8E5102FC29 /* Resources */, ); buildRules = ( ); @@ -977,11 +887,11 @@ }; 982A68D37F5DCBC1FC1FDC0BB2F0EB8E /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */ = { isa = PBXNativeTarget; - buildConfigurationList = 1851179FA635C20329E7C7D49A253636 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift-IQKeyboardManagerSwift" */; + buildConfigurationList = 768672492BEBD11B2982745D1B777D28 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift-IQKeyboardManagerSwift" */; buildPhases = ( - C4304AA8E683E2F927FF7940A08EB4D2 /* Sources */, - 60A6157C9520B77A0217CF22A787E99D /* Frameworks */, - F489B4E141527BB75F5BADD2297267D0 /* Resources */, + DA4A3E8A0AB0D7E287665A709E56EC36 /* Sources */, + 1F8DF3016F5E08F65F63559E2A2A827B /* Frameworks */, + 2F6648C27D9805F9F5D062160BDC0EBB /* Resources */, ); buildRules = ( ); @@ -1004,31 +914,13 @@ buildRules = ( ); dependencies = ( - 89C0A28CA8B1E42AE61ADCA14C031FED /* PBXTargetDependency */, + 0451FAFE12B598AE56109360B5127611 /* PBXTargetDependency */, ); name = IQKeyboardManagerSwift; productName = IQKeyboardManagerSwift; productReference = A8E950A16D00F649C54FFB30F81D7842 /* IQKeyboardManagerSwift.framework */; productType = "com.apple.product-type.framework"; }; - D4F8239FB329387A8476B964D92D92E7 /* FSPagerView */ = { - isa = PBXNativeTarget; - buildConfigurationList = 98343682D690F1F5CF2596A899F35F57 /* Build configuration list for PBXNativeTarget "FSPagerView" */; - buildPhases = ( - 0608DA1408F82CC4ADBFAF480D0FA2B4 /* Headers */, - 5F08C52D6C5CBA958747935FFDA1DFC2 /* Sources */, - E5ACBBCF353041B05D869DB1467D16B1 /* Frameworks */, - C51D8DC25EB55BC76B82A9E61C8BE832 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = FSPagerView; - productName = FSPagerView; - productReference = 0F47FB5E28EE8C8342B1776D813D1A4C /* FSPagerView.framework */; - productType = "com.apple.product-type.framework"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -1047,12 +939,11 @@ en, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = 39D6CDB78D2E7EAED2CBF8A76DC770A5 /* Products */; + productRefGroup = 7FE4C9AB96A6A8E628751776D1D495CB /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 3CAF5EBFE5D1550CFF58AEC93594990A /* EPSignature */, - D4F8239FB329387A8476B964D92D92E7 /* FSPagerView */, 01CB8D6098C21E12CE735619344DE81E /* ImagePicker */, 614D1818852890AC7D3CDF68D512C370 /* ImagePicker-ImagePicker */, B490E7485944099E16C9CBD79119D1D4 /* IQKeyboardManagerSwift */, @@ -1065,62 +956,63 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 3B58EC4259531E84AFA63D59D1133D3E /* Resources */ = { + 2F6648C27D9805F9F5D062160BDC0EBB /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5C4E571F3ADE020356DAF5143816FC55 /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 469AC1D9DADBAC72A4A8876068211A6A /* Resources */ = { + 3B58EC4259531E84AFA63D59D1133D3E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 61A0C05934861A0EACC1549F2419289A /* AUTO@3x.png in Resources */, - 71B7397ADA300CDE41CB406BE694A8A2 /* cameraIcon@3x.png in Resources */, - 047539EBA967BC7505B53F36E1A2836A /* focusIcon@3x.png in Resources */, - 4695B952627B345252A52CB26B7747CC /* OFF@3x.png in Resources */, - 2F7AE7DED85C12F45995DA2DF033641C /* ON@3x.png in Resources */, - 0C99571A708CA382A984BDEDA5AE25D5 /* selectedImageGallery@3x.png in Resources */, - C116540980BCB8D0E54215D9E8C7AD78 /* video@3x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4A72A323CCD420112722EDFB4439C184 /* Resources */ = { + 48F3F81CFBD0387B6D359B8E5102FC29 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4CDBAE55660ED186441E9E4EDE6B3D31 /* IQKeyboardManagerSwift.bundle in Resources */, + 8D935C83E5D7B42A4C6439FFA767CE24 /* AUTO@3x.png in Resources */, + 28658B67B33D0AF1A396F70CF4C416FD /* cameraIcon@3x.png in Resources */, + FF74A846B2EEC0D52379B48D7963D8C0 /* focusIcon@3x.png in Resources */, + A213B981B47C6B4734589B6ED9469132 /* OFF@3x.png in Resources */, + 19BA03143F6B7CCC7F6D3A5000333763 /* ON@3x.png in Resources */, + 09F4E3A6DED312368CE8E037A171BD70 /* selectedImageGallery@3x.png in Resources */, + 1B1937CEB4E9DF65238702771B4232B4 /* video@3x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 500BEBDB28E9B664CEB4A237CBAE1EC8 /* Resources */ = { + 4A72A323CCD420112722EDFB4439C184 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1BBD42E84E62842B6EA186CEF24BBF45 /* ImagePicker.bundle in Resources */, + 4CDBAE55660ED186441E9E4EDE6B3D31 /* IQKeyboardManagerSwift.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7F8929911997B177FECDE1757E47C40B /* Resources */ = { + 500BEBDB28E9B664CEB4A237CBAE1EC8 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1A7787DB0275CF4A44CA312DD3BA5D33 /* EPSignatureViewController.xib in Resources */, + 1BBD42E84E62842B6EA186CEF24BBF45 /* ImagePicker.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9078164A79E8D5740BDAFCB454C8B826 /* Resources */ = { + 7548C4739E6BCE23ABB1B5BD57E7ED73 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - C51D8DC25EB55BC76B82A9E61C8BE832 /* Resources */ = { + 7F8929911997B177FECDE1757E47C40B /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1A7787DB0275CF4A44CA312DD3BA5D33 /* EPSignatureViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1131,14 +1023,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F489B4E141527BB75F5BADD2297267D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 960957461D403847E92AF1825B4D8506 /* PrivacyInfo.xcprivacy in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1219,27 +1103,10 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 5F08C52D6C5CBA958747935FFDA1DFC2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F2562CFCEC42E2989BADC7E823F2C9C3 /* FSPageControl.swift in Sources */, - ECA11CD4E20DFCA3327CB006B10A3DB8 /* FSPagerCollectionView.swift in Sources */, - 29C03EAF5C27DC851118AEC88ABEC151 /* FSPagerView.swift in Sources */, - F6702D89104E55C112FE16943BE7D41A /* FSPagerView-dummy.m in Sources */, - 69C7244F5E0D41CF59E5ADC8952F8D0D /* FSPagerViewCell.swift in Sources */, - C85C11573FFE927A84AD0C8BE456AD81 /* FSPagerViewLayoutAttributes.swift in Sources */, - EA89DFEFE15FAD82868C74E94F6F1B75 /* FSPagerViewObjcCompat.m in Sources */, - 40987E046BAD603A58CA00B9A7648588 /* FSPageViewLayout.swift in Sources */, - 488A767CF7494D169BFB886EDC470F5D /* FSPageViewTransformer.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 809C6F992289D71DBD1D7BFA4B05305A /* Sources */ = { + 557CE2F544FA412F5D8D59F28849E31F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 014ADEB344680FBC5C6D76E16B255CAC /* Pods-MiniScanner-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1254,14 +1121,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - C361A7756A2D12C04F9F6C0F631D4AFB /* Sources */ = { + AA10E1444171443C0B5BCA1096353377 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1ECC8F5583B658DA5BC4F8D29132213F /* Pods-MiniScanner-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - C4304AA8E683E2F927FF7940A08EB4D2 /* Sources */ = { + DA4A3E8A0AB0D7E287665A709E56EC36 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -1304,77 +1172,54 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 0139628E2EDB9A6AD2B119DE4D1B092B /* PBXTargetDependency */ = { + 0451FAFE12B598AE56109360B5127611 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = IQKeyboardManagerSwift; - target = B490E7485944099E16C9CBD79119D1D4 /* IQKeyboardManagerSwift */; - targetProxy = C3EEE11D57DF83B4A602A0BB6B6D5420 /* PBXContainerItemProxy */; + name = "IQKeyboardManagerSwift-IQKeyboardManagerSwift"; + target = 982A68D37F5DCBC1FC1FDC0BB2F0EB8E /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */; + targetProxy = 6CD75698768741DC0335DCB2F06CB5BC /* PBXContainerItemProxy */; }; - 40292EA58C6CD288650B534FC0E7FCDC /* PBXTargetDependency */ = { + 090A4DADA36A746FDB7C115750022A52 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FSPagerView; - target = D4F8239FB329387A8476B964D92D92E7 /* FSPagerView */; - targetProxy = AE6E02E3D311CB4AEC5F673F47B2F7DE /* PBXContainerItemProxy */; + name = NBBottomSheet; + target = 727C2007A89D1AD73613E3E2E22998E5 /* NBBottomSheet */; + targetProxy = 19D95F1858EF2D6E80811860CFD6BF92 /* PBXContainerItemProxy */; }; - 4AE52BA60D1AEFF2B1AFFE147C779165 /* PBXTargetDependency */ = { + 1F155C5185BA60981E950C8356C10505 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = EPSignature; - target = 3CAF5EBFE5D1550CFF58AEC93594990A /* EPSignature */; - targetProxy = 195F278E699A41C19ED473B0310CAC62 /* PBXContainerItemProxy */; + name = "LanguageManager-iOS"; + target = 75F1EA88CB9544AB5CBE20DEC9A011AE /* LanguageManager-iOS */; + targetProxy = 8292BF480C5137113C3A6C342933F986 /* PBXContainerItemProxy */; }; - 89C0A28CA8B1E42AE61ADCA14C031FED /* PBXTargetDependency */ = { + 29743ED8B9772E83B55B66D15C7751B6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "IQKeyboardManagerSwift-IQKeyboardManagerSwift"; - target = 982A68D37F5DCBC1FC1FDC0BB2F0EB8E /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */; - targetProxy = 368B8A0D7A211FB1D8031E50553E22B1 /* PBXContainerItemProxy */; + name = IQKeyboardManagerSwift; + target = B490E7485944099E16C9CBD79119D1D4 /* IQKeyboardManagerSwift */; + targetProxy = D96B4C07AAAD52B947C6F8CFEF7E8807 /* PBXContainerItemProxy */; }; - B1DD8053C35D0B44F2268CAB89353885 /* PBXTargetDependency */ = { + 41BDC0B4C02D2F478CF6E580BB0ED276 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ImagePicker; target = 01CB8D6098C21E12CE735619344DE81E /* ImagePicker */; - targetProxy = 0473CB2089AEB22D5A94042369CBE127 /* PBXContainerItemProxy */; - }; - D341CBE09A66072A9CD356EF2EB37FF7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = NBBottomSheet; - target = 727C2007A89D1AD73613E3E2E22998E5 /* NBBottomSheet */; - targetProxy = F39E3FCE8EA4C0F8CBCC8FCA9435B319 /* PBXContainerItemProxy */; + targetProxy = FBE5961EEB250DF2DACF4F88C36BCC1E /* PBXContainerItemProxy */; }; - D836F926DCF33106AFD6E73977095C38 /* PBXTargetDependency */ = { + 6D816E6D698E10FDBE40764CC34D49B2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "LanguageManager-iOS"; - target = 75F1EA88CB9544AB5CBE20DEC9A011AE /* LanguageManager-iOS */; - targetProxy = 35F75C3FB936C4BE71A7B3A5CE8352DE /* PBXContainerItemProxy */; + name = EPSignature; + target = 3CAF5EBFE5D1550CFF58AEC93594990A /* EPSignature */; + targetProxy = F3097459B372082D9C20BEF06209FBD6 /* PBXContainerItemProxy */; }; - E9327F4979BAC249AD227EFB65293BB7 /* PBXTargetDependency */ = { + 7907CFE4C755F2FC455B6FB6B982A84E /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "ImagePicker-ImagePicker"; target = 614D1818852890AC7D3CDF68D512C370 /* ImagePicker-ImagePicker */; - targetProxy = 86BCB3533B3E4CC4A62FDD4F9D7AEF5C /* PBXContainerItemProxy */; + targetProxy = D06F098EB5FE1B281549C568AA85EEA9 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 191972B2CD0BAA4D702859FFE72BED96 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DBE740FF0A3373F56E7AF2A4000D6D8C /* ImagePicker.release.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ImagePicker"; - IBSC_MODULE = ImagePicker; - INFOPLIST_FILE = "Target Support Files/ImagePicker/ResourceBundle-ImagePicker-ImagePicker-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_NAME = ImagePicker; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; 21302220AA8668082E71583ECE31B7CA /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DBE740FF0A3373F56E7AF2A4000D6D8C /* ImagePicker.release.xcconfig */; + baseConfigurationReference = 0CBC68B38C0421EC0AE36B43FB2C7636 /* ImagePicker.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1387,7 +1232,7 @@ GCC_PREFIX_HEADER = "Target Support Files/ImagePicker/ImagePicker-prefix.pch"; INFOPLIST_FILE = "Target Support Files/ImagePicker/ImagePicker-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1407,7 +1252,7 @@ }; name = Release; }; - 2E083683897CAD4CAFE6027BFB9CB404 /* Debug */ = { + 265E4B8B0199C32122BBAF162B6A7A3B /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7CC191E7994C3C7161A6641B457C9166 /* Pods-MiniScanner.debug.xcconfig */; buildSettings = { @@ -1444,44 +1289,9 @@ }; name = Debug; }; - 31731D2A96C7FF5AA4EE56EC2EB0AE2F /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 507C1B0C545DAAFE25BB8DD789F224EF /* FSPagerView.release.xcconfig */; - buildSettings = { - "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/FSPagerView/FSPagerView-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/FSPagerView/FSPagerView-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/FSPagerView/FSPagerView.modulemap"; - PRODUCT_MODULE_NAME = FSPagerView; - PRODUCT_NAME = FSPagerView; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; 39440596D0B39AE8ECC2717121684FEC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8C6B2F7653C95633BB9449F87EB6DBD9 /* LanguageManager-iOS.release.xcconfig */; + baseConfigurationReference = 9AAA7A084DC8F453913C80DE1E243C39 /* LanguageManager-iOS.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1494,7 +1304,7 @@ GCC_PREFIX_HEADER = "Target Support Files/LanguageManager-iOS/LanguageManager-iOS-prefix.pch"; INFOPLIST_FILE = "Target Support Files/LanguageManager-iOS/LanguageManager-iOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1516,7 +1326,7 @@ }; 40133D3EB8F5F41DEF101CB7F221DB6B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EE009617DB5A966C6E58EFC97D17875C /* EPSignature.debug.xcconfig */; + baseConfigurationReference = E91F93F84E9AB640A2333FBBF6CCB877 /* EPSignature.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1548,43 +1358,9 @@ }; name = Debug; }; - 434E4A52CBC9F74FA2D8CDD170442C4A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FD60805FB0B777848E7DD77214586E88 /* FSPagerView.debug.xcconfig */; - buildSettings = { - "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/FSPagerView/FSPagerView-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/FSPagerView/FSPagerView-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/FSPagerView/FSPagerView.modulemap"; - PRODUCT_MODULE_NAME = FSPagerView; - PRODUCT_NAME = FSPagerView; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; 57F5390C26CAC63BC7DC9F3A897AD41C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9027793C7414B308134453884A6716FD /* ImagePicker.debug.xcconfig */; + baseConfigurationReference = 6224FD5F7C95061A57CAFA73995B3002 /* ImagePicker.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1616,9 +1392,9 @@ }; name = Debug; }; - 7357A4E2D538EC50B39381993F57DBCC /* Release */ = { + 74A42B7360C7CAE64024B006CBA43A1A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 04420AA069E60E2676B1C8145D489AFE /* IQKeyboardManagerSwift.release.xcconfig */; + baseConfigurationReference = FAE9E39FF0684DBEA572BB783B3A18F7 /* IQKeyboardManagerSwift.release.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardManagerSwift"; @@ -1635,7 +1411,7 @@ }; 8C7488EEB2FF7D44EDD6A1FBA48C75CC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E3DA260DCB001D3DF844896311887A56 /* EPSignature.release.xcconfig */; + baseConfigurationReference = 2006321B115FD55474FD1B985C1979FA /* EPSignature.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1648,7 +1424,7 @@ GCC_PREFIX_HEADER = "Target Support Files/EPSignature/EPSignature-prefix.pch"; INFOPLIST_FILE = "Target Support Files/EPSignature/EPSignature-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1668,6 +1444,23 @@ }; name = Release; }; + 8D94357D87747513B8B34AAE89096A03 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7C9ABFFD091844286C2E85A20189BF7A /* IQKeyboardManagerSwift.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardManagerSwift"; + IBSC_MODULE = IQKeyboardManagerSwift; + INFOPLIST_FILE = "Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + PRODUCT_NAME = IQKeyboardManagerSwift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; 90D4D09BCB6A4660E43ACBE9ECB6FE9A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1796,64 +1589,9 @@ }; name = Release; }; - 9FC6A9858115F41C4CEF565EBDE56CA8 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 798C61760B9BC4B07BC60D42FCC09855 /* Pods-MiniScanner.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - "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-MiniScanner/Pods-MiniScanner-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-MiniScanner/Pods-MiniScanner.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; - }; - A4D604173E31DBC1FE5B805782D66A58 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9027793C7414B308134453884A6716FD /* ImagePicker.debug.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ImagePicker"; - IBSC_MODULE = ImagePicker; - INFOPLIST_FILE = "Target Support Files/ImagePicker/ResourceBundle-ImagePicker-ImagePicker-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - PRODUCT_NAME = ImagePicker; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; A73A28CEE205ACFB6072250615C7D39D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2EEF70A7586548C9681199386735B949 /* LanguageManager-iOS.debug.xcconfig */; + baseConfigurationReference = 8BA50CB662E7C23406F0B83501BA32D7 /* LanguageManager-iOS.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1887,7 +1625,7 @@ }; B3CF11682A60F02B60820C17EE93D35E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86D4965F304A9370159F8BEE0D0951D5 /* IQKeyboardManagerSwift.debug.xcconfig */; + baseConfigurationReference = 7C9ABFFD091844286C2E85A20189BF7A /* IQKeyboardManagerSwift.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1920,9 +1658,26 @@ }; name = Debug; }; + B7F72126190288DAACE0F880A0CE87C7 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6224FD5F7C95061A57CAFA73995B3002 /* ImagePicker.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ImagePicker"; + IBSC_MODULE = ImagePicker; + INFOPLIST_FILE = "Target Support Files/ImagePicker/ResourceBundle-ImagePicker-ImagePicker-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + PRODUCT_NAME = ImagePicker; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; B89AE063F35BBC5F3358209AF37E6D16 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 22FCBFA0E2A7651B248460AD3CB4DE32 /* NBBottomSheet.debug.xcconfig */; + baseConfigurationReference = 45B232DE9D6710FE8BF7DC25C2C80333 /* NBBottomSheet.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1956,7 +1711,7 @@ }; C15C4E31ADF19556825A2743AEF62A77 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 04420AA069E60E2676B1C8145D489AFE /* IQKeyboardManagerSwift.release.xcconfig */; + baseConfigurationReference = FAE9E39FF0684DBEA572BB783B3A18F7 /* IQKeyboardManagerSwift.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1990,26 +1745,64 @@ }; name = Release; }; - C6749BA8DAA3DB384D4F9A84D744AD3D /* Debug */ = { + D39ECFFD29F8C3DA103F61A69C7BDEC1 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86D4965F304A9370159F8BEE0D0951D5 /* IQKeyboardManagerSwift.debug.xcconfig */; + baseConfigurationReference = 0CBC68B38C0421EC0AE36B43FB2C7636 /* ImagePicker.release.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardManagerSwift"; - IBSC_MODULE = IQKeyboardManagerSwift; - INFOPLIST_FILE = "Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ImagePicker"; + IBSC_MODULE = ImagePicker; + INFOPLIST_FILE = "Target Support Files/ImagePicker/ResourceBundle-ImagePicker-ImagePicker-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - PRODUCT_NAME = IQKeyboardManagerSwift; + PRODUCT_NAME = ImagePicker; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = bundle; }; - name = Debug; + name = Release; + }; + E8CC8D3FD98540B83395885C5533CEE1 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 798C61760B9BC4B07BC60D42FCC09855 /* Pods-MiniScanner.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "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-MiniScanner/Pods-MiniScanner-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-MiniScanner/Pods-MiniScanner.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; }; F8AD79C5141E28EAE67B8011B5C3B8F5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4E8E62EE488350F66CC08D1D88AF14EE /* NBBottomSheet.release.xcconfig */; + baseConfigurationReference = 26EDF88E14046AAC34BFF99F97D23B05 /* NBBottomSheet.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -2022,7 +1815,7 @@ GCC_PREFIX_HEADER = "Target Support Files/NBBottomSheet/NBBottomSheet-prefix.pch"; INFOPLIST_FILE = "Target Support Files/NBBottomSheet/NBBottomSheet-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2045,11 +1838,11 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 1851179FA635C20329E7C7D49A253636 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift-IQKeyboardManagerSwift" */ = { + 21E40E7EF4A668720A0BC4974A414686 /* Build configuration list for PBXNativeTarget "Pods-MiniScanner" */ = { isa = XCConfigurationList; buildConfigurations = ( - C6749BA8DAA3DB384D4F9A84D744AD3D /* Debug */, - 7357A4E2D538EC50B39381993F57DBCC /* Release */, + 265E4B8B0199C32122BBAF162B6A7A3B /* Debug */, + E8CC8D3FD98540B83395885C5533CEE1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2081,15 +1874,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4E37980CDFA92572E6955A05C6C57717 /* Build configuration list for PBXNativeTarget "Pods-MiniScanner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2E083683897CAD4CAFE6027BFB9CB404 /* Debug */, - 9FC6A9858115F41C4CEF565EBDE56CA8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 5D7A5BCA6DF599B98DA57AB77B8B2795 /* Build configuration list for PBXNativeTarget "NBBottomSheet" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -2099,20 +1883,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 98343682D690F1F5CF2596A899F35F57 /* Build configuration list for PBXNativeTarget "FSPagerView" */ = { + 61E5E465E4EBDC7192A60BDB29B54904 /* Build configuration list for PBXNativeTarget "ImagePicker-ImagePicker" */ = { isa = XCConfigurationList; buildConfigurations = ( - 434E4A52CBC9F74FA2D8CDD170442C4A /* Debug */, - 31731D2A96C7FF5AA4EE56EC2EB0AE2F /* Release */, + B7F72126190288DAACE0F880A0CE87C7 /* Debug */, + D39ECFFD29F8C3DA103F61A69C7BDEC1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - CB7A73EFBC09495176FD10B3C82A8767 /* Build configuration list for PBXNativeTarget "ImagePicker-ImagePicker" */ = { + 768672492BEBD11B2982745D1B777D28 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift-IQKeyboardManagerSwift" */ = { isa = XCConfigurationList; buildConfigurations = ( - A4D604173E31DBC1FE5B805782D66A58 /* Debug */, - 191972B2CD0BAA4D702859FFE72BED96 /* Release */, + 8D94357D87747513B8B34AAE89096A03 /* Debug */, + 74A42B7360C7CAE64024B006CBA43A1A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Pods.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/FSPagerView.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/FSPagerView.xcscheme deleted file mode 100644 index 96fef6ec2caf644c63718eda5f8f3b3b1ca45e56..0000000000000000000000000000000000000000 --- a/Pods/Pods.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/FSPagerView.xcscheme +++ /dev/null @@ -1,58 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<Scheme - LastUpgradeVersion = "1500" - version = "1.3"> - <BuildAction - parallelizeBuildables = "YES" - buildImplicitDependencies = "YES"> - <BuildActionEntries> - <BuildActionEntry - buildForTesting = "YES" - buildForRunning = "YES" - buildForProfiling = "YES" - buildForArchiving = "YES" - buildForAnalyzing = "YES"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "D4F8239FB329387A8476B964D92D92E7" - BuildableName = "FSPagerView.framework" - BlueprintName = "FSPagerView" - ReferencedContainer = "container:Pods.xcodeproj"> - </BuildableReference> - </BuildActionEntry> - </BuildActionEntries> - </BuildAction> - <TestAction - buildConfiguration = "Debug" - selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" - selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES"> - <Testables> - </Testables> - </TestAction> - <LaunchAction - buildConfiguration = "Debug" - selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" - selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - launchStyle = "0" - useCustomWorkingDirectory = "NO" - ignoresPersistentStateOnLaunch = "NO" - debugDocumentVersioning = "YES" - debugServiceExtension = "internal" - allowLocationSimulation = "YES"> - </LaunchAction> - <ProfileAction - buildConfiguration = "Release" - shouldUseLaunchSchemeArgsEnv = "YES" - savedToolIdentifier = "" - useCustomWorkingDirectory = "NO" - debugDocumentVersioning = "YES"> - </ProfileAction> - <AnalyzeAction - buildConfiguration = "Debug"> - </AnalyzeAction> - <ArchiveAction - buildConfiguration = "Release" - revealArchiveInOrganizer = "YES"> - </ArchiveAction> -</Scheme> diff --git a/Pods/Pods.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/xcschememanagement.plist index afdf3cb5e2bc0f8c0d15192e4e716bfc3a294fba..fefa7d33afe780a2becc463fb0a320ac0eec6317 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Pods/Pods.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/xcschememanagement.plist @@ -11,61 +11,54 @@ <key>orderHint</key> <integer>0</integer> </dict> - <key>FSPagerView.xcscheme</key> - <dict> - <key>isShown</key> - <false/> - <key>orderHint</key> - <integer>1</integer> - </dict> <key>IQKeyboardManagerSwift-IQKeyboardManagerSwift.xcscheme</key> <dict> <key>isShown</key> <false/> <key>orderHint</key> - <integer>5</integer> + <integer>4</integer> </dict> <key>IQKeyboardManagerSwift.xcscheme</key> <dict> <key>isShown</key> <false/> <key>orderHint</key> - <integer>4</integer> + <integer>3</integer> </dict> <key>ImagePicker-ImagePicker.xcscheme</key> <dict> <key>isShown</key> <false/> <key>orderHint</key> - <integer>3</integer> + <integer>2</integer> </dict> <key>ImagePicker.xcscheme</key> <dict> <key>isShown</key> <false/> <key>orderHint</key> - <integer>2</integer> + <integer>1</integer> </dict> <key>LanguageManager-iOS.xcscheme</key> <dict> <key>isShown</key> <false/> <key>orderHint</key> - <integer>6</integer> + <integer>5</integer> </dict> <key>NBBottomSheet.xcscheme</key> <dict> <key>isShown</key> <false/> <key>orderHint</key> - <integer>7</integer> + <integer>6</integer> </dict> <key>Pods-MiniScanner.xcscheme</key> <dict> <key>isShown</key> <false/> <key>orderHint</key> - <integer>8</integer> + <integer>7</integer> </dict> </dict> <key>SuppressBuildableAutocreation</key> diff --git a/Pods/FSPagerView/LICENSE b/Pods/TLPhotoPicker/LICENSE similarity index 93% rename from Pods/FSPagerView/LICENSE rename to Pods/TLPhotoPicker/LICENSE index a1e3bb343253eb82a5fd78604af8c7c14be3bb4b..2d3f131252424de0a9a7254bde558f0c52880d43 100644 --- a/Pods/FSPagerView/LICENSE +++ b/Pods/TLPhotoPicker/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017 FSPagerView (https://github.com/WenchaoD/FSPagerView) +Copyright (c) 2017 wade.hawk <junhyi.park@gmail.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Pods/TLPhotoPicker/README.md b/Pods/TLPhotoPicker/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e5987538ed1faf9cbff9f37782abf9b28096ca4b --- /dev/null +++ b/Pods/TLPhotoPicker/README.md @@ -0,0 +1,408 @@ +<img src="./Images/tlphotologo.png"> + +[](http://cocoapods.org/pods/TLPhotoPicker) +[](http://cocoapods.org/pods/TLPhotoPicker) +[](http://cocoapods.org/pods/TLPhotoPicker) + + +## Written in Swift 5.0 + +TLPhotoPicker enables application to pick images and videos from multiple smart album in iOS, similar to the current facebook app. + +## Demo 🙉 + +| Facebook Picker | TLPhotoPicker | +| ------------- | ------------- | +|  |  | + +## Features + +- support smart album collection. + - camera roll, selfies, panoramas, favorites, videos, custom users album +- selected order index. +- playback video and live photos. + - just one. playback first video or live Photo in bounds of visible cell. +- display video duration. +- async phasset request and displayed cell. + - scrolling performance is better than facebook in displaying video assets collection. +- custom cell +- custom display and selection rules +- reload of changes that occur in the Photos library. +- support iCloud Photo Library +- adds long press preview to images. ( to @smeshko ) [Preview](https://github.com/tilltue/TLPhotoPicker/pull/252#issue-362005178) + +| Smart album collection | LivePhotoCell | VideoPhotoCell | PhotoCell | CustomCell(instagram) | +| ------------- | ------------- | ------------- | ------------- | ------------- | +|  |  |  |  |  | + +Custom Camera Cell + +| Live CameraCell | +| ------------- | +|  + +## Installation + +### Requirements + +- Swift 5.0 ( Swift 4.2 -> use 'version 1.8.3' ) +- iOS 9.1 (for use live photos) + +### Cocoapods + +TLPhotoPicker is available through [CocoaPods](http://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +platform :ios, '9.1' +pod "TLPhotoPicker" +``` + +### Carthage + +Carthage is a simple, decentralized dependency manager for Cocoa. + +Specify TLPhotoPicker into your project's Cartfile: + +``` +github "tilltue/TLPhotoPicker" +``` + +### Swift Package Manager + +The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift compiler. It is in early development, but TLPhotoPicker does support its use on supported platforms. + +Once you have your Swift package set up, adding Alamofire as a dependency is as easy as adding it to the dependencies value of your Package.swift. + +``` +dependencies: [ + .package(url: "https://github.com/tilltue/TLPhotoPicker.git", .upToNextMajor(from: "2.1.0")) +] +``` + +> Don't forget the Privacy Description in `info.plist`. +<img src="./Images/Privacy.png"> + +> iOS 14 +> You can suppress the automatic prompting from the system by setting this key to yes in your apps info plist. +> PHPhotoLibraryPreventAutomaticLimitedAccessAlert = YES +https://developer.apple.com/videos/play/wwdc2020/10641/ + +## Usage + +**use delegate** + +You can choose delegate method or closure for handle picker event. + +```swift +class ViewController: UIViewController,TLPhotosPickerViewControllerDelegate { + var selectedAssets = [TLPHAsset]() + @IBAction func pickerButtonTap() { + let viewController = TLPhotosPickerViewController() + viewController.delegate = self + var configure = TLPhotosPickerConfigure() + //configure.nibSet = (nibName: "CustomCell_Instagram", bundle: Bundle.main) // If you want use your custom cell.. + self.present(viewController, animated: true, completion: nil) + } + //TLPhotosPickerViewControllerDelegate + func shouldDismissPhotoPicker(withTLPHAssets: [TLPHAsset]) -> Bool { + // use selected order, fullresolution image + self.selectedAssets = withTLPHAssets + return true + } + func dismissPhotoPicker(withPHAssets: [PHAsset]) { + // if you want to used phasset. + } + func photoPickerDidCancel() { + // cancel + } + func dismissComplete() { + // picker viewcontroller dismiss completion + } + func canSelectAsset(phAsset: PHAsset) -> Bool { + //Custom Rules & Display + //You can decide in which case the selection of the cell could be forbidden. + } + func didExceedMaximumNumberOfSelection(picker: TLPhotosPickerViewController) { + // exceed max selection + } + func handleNoAlbumPermissions(picker: TLPhotosPickerViewController) { + // handle denied albums permissions case + } + func handleNoCameraPermissions(picker: TLPhotosPickerViewController) { + // handle denied camera permissions case + } +} + +``` +**use closure** + +```swift + init(withPHAssets: (([PHAsset]) -> Void)? = nil, didCancel: ((Void) -> Void)? = nil) + init(withTLPHAssets: (([TLPHAsset]) -> Void)? = nil, didCancel: ((Void) -> Void)? = nil) + var canSelectAsset: ((PHAsset) -> Bool)? = nil + var didExceedMaximumNumberOfSelection: ((TLPhotosPickerViewController) -> Void)? = nil + var handleNoAlbumPermissions: ((TLPhotosPickerViewController) -> Void)? = nil + var handleNoCameraPermissions: ((TLPhotosPickerViewController) -> Void)? = nil + var dismissCompletion: (() -> Void)? = nil +``` +```swift +class ViewController: UIViewController,TLPhotosPickerViewControllerDelegate { + var selectedAssets = [TLPHAsset]() + @IBAction func pickerButtonTap() { + let viewController = TLPhotosPickerViewController(withTLPHAssets: { [weak self] (assets) in // TLAssets + self?.selectedAssets = assets + }, didCancel: nil) + viewController.didExceedMaximumNumberOfSelection = { [weak self] (picker) in + //exceed max selection + } + viewController.handleNoAlbumPermissions = { [weak self] (picker) in + // handle denied albums permissions case + } + viewController.handleNoCameraPermissions = { [weak self] (picker) in + // handle denied camera permissions case + } + viewController.selectedAssets = self.selectedAssets + self.present(viewController, animated: true, completion: nil) + } +} + +``` + +**Custom Cell** +Custom Cell must subclass TLPhotoCollectionViewCell +```Swift +class CustomCell_Instagram: TLPhotoCollectionViewCell { + +} + +//If you want custom camera cell? +//only used camera cell +[Sample](https://github.com/tilltue/TLPhotoPicker/blob/master/Example/TLPhotoPicker/CustomCameraCell.swift) + +//Adding the possibility to handle cell display according to a specific conditions +func update(with phAsset: PHAsset) +func selectedCell() +func willDisplayCell() +func endDisplayingCell() +``` + +**Custom Rules & Display** + +You can implement your own rules to handle the cell display. You can decide in which case the selection of the cell could be forbidden. + +For example, if you want to disable the selection of a cell if its width is under 300, you can follow these steps: + +- Override the update method of your custom cell and add your own display rule + +```swift +override func update(with phAsset: PHAsset) { + super.update(with: phAsset) + self.sizeRequiredOverlayView?.isHidden = !(phAsset.pixelHeight <= 300 && phAsset.pixelWidth <= 300) +} +``` +In this code, we show an overlay when the height and width required values are not satisified. + +- When you instanciate a `TLPhotosPickerViewController` subclass, you can pass a closure called `canSelectAsset` to handle the selection according to some rules. ( or delegate) + +```Swift +//use delegate +public protocol TLPhotosPickerViewControllerDelegate: class { + ... + func canSelectAsset(phAsset: PHAsset) -> Bool + ... +} + +extension UserViewController: TLPhotosPickerViewControllerDelegate { + func canSelectAsset(phAsset: PHAsset) -> Bool { + if asset.pixelHeight < 100 || asset.pixelWidth < 100 { + self?.showUnsatisifiedSizeAlert(vc: viewController) + return false + } + return true + } +} + +//or use closure +viewController.canSelectAsset = { [weak self] asset -> Bool in + if asset.pixelHeight < 100 || asset.pixelWidth < 100 { + self?.showUnsatisifiedSizeAlert(vc: viewController) + return false + } + return true +} +``` +In this code, we show an alert when the condition in the closure are not satisfiied. + +**TLPHAsset** + +```swift +public struct TLPHAsset { + public enum AssetType { + case photo,video,livePhoto + } + // phasset + public var phAsset: PHAsset? = nil + // selected order index + public var selectedOrder: Int = 0 + // asset type + public var type: AssetType + // get full resolution image + public var fullResolutionImage: UIImage? + // get photo file size (async) + public func photoSize(options: PHImageRequestOptions? = nil ,completion: @escaping ((Int)->Void), livePhotoVideoSize: Bool = false) + // get video file size (async) + public func videoSize(options: PHVideoRequestOptions? = nil, completion: @escaping ((Int)->Void)) + // get async icloud image (download) + @discardableResult + public func cloudImageDownload(progressBlock: @escaping (Double) -> Void, completionBlock:@escaping (UIImage?)-> Void ) -> PHImageRequestID? + // get original media file async copy temporary media file ( photo(png,gif...etc.) and video ) -> Don't forget, You should delete temporary file. + // parmeter : convertLivePhotosToJPG + // false : If you want mov file at live photos + // true : If you want png file at live photos ( HEIC ) + public func tempCopyMediaFile(videoRequestOptions: PHVideoRequestOptions? = nil, + imageRequestOptions: PHImageRequestOptions? = nil, + livePhotoRequestOptions: PHLivePhotoRequestOptions? = nil, + exportPreset: String = AVAssetExportPresetHighestQuality, + convertLivePhotosToJPG: Bool = false, + progressBlock:((Double) -> Void)? = nil, + completionBlock:@escaping ((URL,String) -> Void)) -> PHImageRequestID? + //Apparently, This is not the only way to export video. + //There is many way that export a video. + //This method was one of them. + public func exportVideoFile(options: PHVideoRequestOptions? = nil, + outputURL: URL? = nil, + outputFileType: AVFileType = .mov, + progressBlock:((Double) -> Void)? = nil, + completionBlock:@escaping ((URL,String) -> Void)) + // get original asset file name + public var originalFileName: String? +} +``` +> Note: convenience export method +> fullResolutionImage, cloudImageDownload, tempCopyMediaFile, exportVideoFile +> It's not enough if you wanted to use more complicated export asset options. ( progress, export type, etc..) + +## Customize + +```swift +let viewController = TLPhotosPickerViewController() +var configure = TLPhotosPickerConfigure() +viewController.configure = configure + +public struct TLPhotosPickerConfigure { + public var customLocalizedTitle: [String: String] = ["Camera Roll": "Camera Roll"] // Set [:] if you want use default localized title of album + public var tapHereToChange = "Tap here to change" + public var cancelTitle = "Cancel" + public var doneTitle = "Done" + public var emptyMessage = "No albums" + public var emptyImage: UIImage? = nil + public var usedCameraButton = true + public var usedPrefetch = false + public var previewAtForceTouch = false + public var allowedLivePhotos = true + public var allowedVideo = true + public var allowedAlbumCloudShared = false + public var allowedPhotograph = true // for camera : allow this option when you want to take a photos + public var allowedVideoRecording = true //for camera : allow this option when you want to recording video. + public var recordingVideoQuality: UIImagePickerControllerQualityType = .typeMedium //for camera : recording video quality + public var maxVideoDuration:TimeInterval? = nil //for camera : max video recording duration + public var autoPlay = true + public var muteAudio = true + public var preventAutomaticLimitedAccessAlert = true // newest iOS 14 + public var mediaType: PHAssetMediaType? = nil + public var numberOfColumn = 3 + public var minimumLineSpacing: CGFloat = 5 + public var minimumInteritemSpacing: CGFloat = 5 + public var singleSelectedMode = false + public var maxSelectedAssets: Int? = nil //default: inf + public var fetchOption: PHFetchOptions? = nil //default: creationDate + public var fetchCollectionOption: [FetchCollectionType: PHFetchOptions] = [:] + public var singleSelectedMode = false + public var selectedColor = UIColor(red: 88/255, green: 144/255, blue: 255/255, alpha: 1.0) + public var cameraBgColor = UIColor(red: 221/255, green: 223/255, blue: 226/255, alpha: 1) + public var cameraIcon = TLBundle.podBundleImage(named: "camera") + public var videoIcon = TLBundle.podBundleImage(named: "video") + public var placeholderIcon = TLBundle.podBundleImage(named: "insertPhotoMaterial") + public var nibSet: (nibName: String, bundle:Bundle)? = nil // custom cell + public var cameraCellNibSet: (nibName: String, bundle:Bundle)? = nil // custom camera cell + public var fetchCollectionTypes: [(PHAssetCollectionType,PHAssetCollectionSubtype)]? = nil + public var groupByFetch: PHFetchedResultGroupedBy? = nil // cannot be used prefetch options + public var supportedInterfaceOrientations: UIInterfaceOrientationMask = .portrait + public var popup: [PopupConfigure] = [] + public init() { + } +} + +//Related issue: https://github.com/tilltue/TLPhotoPicker/issues/201 +//e.g. +//let option = PHFetchOptions() +//configure.fetchCollectionOption[.assetCollections(.smartAlbum)] = option +//configure.fetchCollectionOption[.assetCollections(.album)] = option +//configure.fetchCollectionOption[.topLevelUserCollections] = option + +public enum FetchCollectionType { + case assetCollections(PHAssetCollectionType) + case topLevelUserCollections +} + +public enum PopupConfigure { + //Popup album view animation duration + case animation(TimeInterval) +} + +// PHFetchedResultGroupedBy +// +// CGrouped by date, cannot be used prefetch options +// take about few seconds ( 5000 image iPhoneX: 1 ~ 1.5 sec ) +public enum PHFetchedResultGroupedBy { + case year + case month + case week + case day + case hour + case custom(dateFormat: String) +} + +//customizable photos picker viewcontroller +class CustomPhotoPickerViewController: TLPhotosPickerViewController { + override func makeUI() { + super.makeUI() + self.customNavItem.leftBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: .stop, target: nil, action: #selector(customAction)) + } + func customAction() { + self.dismiss(animated: true, completion: nil) + } +} + +//for log +public protocol TLPhotosPickerLogDelegate: class { + func selectedCameraCell(picker: TLPhotosPickerViewController) + func deselectedPhoto(picker: TLPhotosPickerViewController, at: Int) + func selectedPhoto(picker: TLPhotosPickerViewController, at: Int) + func selectedAlbum(picker: TLPhotosPickerViewController, title: String, at: Int) +} + +//for collection supplement view +let viewController = TLPhotosPickerViewController() +viewController.customDataSouces = CustomDataSources() // inherit TLPhotopickerDataSourcesProtocol + +public protocol TLPhotopickerDataSourcesProtocol { + func headerReferenceSize() -> CGSize + func footerReferenceSize() -> CGSize + func registerSupplementView(collectionView: UICollectionView) + func supplementIdentifier(kind: String) -> String + func configure(supplement view: UICollectionReusableView, section: (title: String, assets: [TLPHAsset])) +} + +``` + +## Author + +Does your organization or project use TLPhotoPicker? Please let me know by email. + +wade.hawk, junhyi.park@gmail.com + +## License + +TLPhotoPicker is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/SynchronizedDictionary.swift b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/SynchronizedDictionary.swift new file mode 100644 index 0000000000000000000000000000000000000000..34bba14d17a1f4b671fa572510e6c70042f1574e --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/SynchronizedDictionary.swift @@ -0,0 +1,54 @@ +// +// SynchronizedDictionary.swift +// TLPhotoPicker +// +// Created by wade.hawk on 30/03/2019. +// + +import Foundation + +public class SynchronizedDictionary<K:Hashable,V> { + private var dictionary: [K:V] = [:] + private let accessQueue = DispatchQueue(label: "SynchronizedDictionaryAccess", + attributes: .concurrent) + + deinit { + //print("deinit SynchronizedDictionary") + } + + public func removeAll() { + self.accessQueue.async(flags:.barrier) { + self.dictionary.removeAll() + } + } + + public func removeValue(forKey: K) { + self.accessQueue.async(flags:.barrier) { + self.dictionary.removeValue(forKey: forKey) + } + } + + public func forEach(_ closure: ((K,V) -> Void)) { + self.accessQueue.sync { + self.dictionary.forEach{ arg in + let (key, value) = arg + closure(key,value) + } + } + } + + public subscript(key: K) -> V? { + set { + self.accessQueue.async(flags:.barrier) { + self.dictionary[key] = newValue + } + } + get { + var element: V? + self.accessQueue.sync { + element = self.dictionary[key] + } + return element + } + } +} diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLAlbumPopView.swift b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLAlbumPopView.swift new file mode 100644 index 0000000000000000000000000000000000000000..3eaa92a3f7793f96b9bda917b43ee89441af5889 --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLAlbumPopView.swift @@ -0,0 +1,83 @@ +// +// TLAlbumPopView.swift +// TLPhotosPicker +// +// Created by wade.hawk on 2017. 4. 19.. +// Copyright © 2017ë…„ wade.hawk. All rights reserved. +// + +import UIKit + +protocol PopupViewProtocol: AnyObject { + var bgView: UIView! { get set } + var popupView: UIView! { get set } + var originalFrame: CGRect { get set } + var show: Bool { get set } + func setupPopupFrame() +} + +extension PopupViewProtocol where Self: UIView { + fileprivate func getFrame(scale: CGFloat) -> CGRect { + var frame = self.originalFrame + frame.size.width = frame.size.width * scale + frame.size.height = frame.size.height * scale + frame.origin.x = self.frame.width/2 - frame.width/2 + return frame + } + func setupPopupFrame() { + if self.originalFrame == CGRect.zero { + self.originalFrame = self.popupView.frame + }else { + self.originalFrame.size.height = self.popupView.frame.height + } + } + func show(_ show: Bool, duration: TimeInterval = 0.1) { + guard self.show != show else { return } + self.layer.removeAllAnimations() + self.isHidden = false + self.popupView.frame = show ? getFrame(scale: 0.1) : self.popupView.frame + self.bgView.alpha = show ? 0 : 1 + UIView.animate(withDuration: duration, animations: { + self.bgView.alpha = show ? 1 : 0 + self.popupView.transform = show ? CGAffineTransform(scaleX: 1.05, y: 1.05) : CGAffineTransform(scaleX: 0.1, y: 0.1) + self.popupView.frame = show ? self.getFrame(scale: 1.05) : self.getFrame(scale: 0.1) + }) { _ in + self.isHidden = show ? false : true + UIView.animate(withDuration: duration) { + if show { + self.popupView.transform = CGAffineTransform(scaleX: 1, y: 1) + self.popupView.frame = self.originalFrame + } + self.show = show + } + } + } +} + +open class TLAlbumPopView: UIView, PopupViewProtocol { + @IBOutlet open var bgView: UIView! + @IBOutlet open var popupView: UIView! + @IBOutlet var popupViewHeight: NSLayoutConstraint! + @IBOutlet open var tableView: UITableView! + @objc var originalFrame = CGRect.zero + @objc var show = false + + deinit { +// print("deinit TLAlbumPopView") + } + + override open func awakeFromNib() { + super.awakeFromNib() + self.popupView.layer.cornerRadius = 5.0 + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapBgView)) + self.bgView.addGestureRecognizer(tapGesture) + self.tableView.register(UINib(nibName: "TLCollectionTableViewCell", bundle: TLBundle.bundle()), forCellReuseIdentifier: "TLCollectionTableViewCell") + if #available(iOS 13.0, *) { + self.popupView.backgroundColor = .systemBackground + } + } + + @objc func tapBgView() { + self.show(false) + } +} diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLAssetCollection+Extension.swift b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLAssetCollection+Extension.swift new file mode 100644 index 0000000000000000000000000000000000000000..6d1b999d65c7b0f5aab3dd867cbe0a4fe2488385 --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLAssetCollection+Extension.swift @@ -0,0 +1,68 @@ +// +// TLAssetCollection+Extension.swift +// TLPhotoPicker +// +// Created by wade.hawk on 21/01/2019. +// + +import Foundation +import Photos + +public enum PHFetchedResultGroupedBy { + case year + case month + case week + case day + case hour + case custom(dateFormat: String) + var dateFormat: String { + switch self { + case .year: + return "yyyy" + case .month: + return "yyyyMM" + case .week: + return "yyyyMMW" + case .day: + return "yyyyMMdd" + case .hour: + return "yyyyMMddHH" + case let .custom(dateFormat): + return dateFormat + } + } +} + +extension TLAssetsCollection { + func enumarateFetchResult(groupedBy: PHFetchedResultGroupedBy) -> Dictionary<String,[TLPHAsset]> { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = groupedBy.dateFormat + var assets = [PHAsset]() + assets.reserveCapacity(self.fetchResult?.count ?? 0) + self.fetchResult?.enumerateObjects({ (phAsset, idx, stop) in + if phAsset.creationDate != nil { + assets.append(phAsset) + } + }) + let sections = Dictionary(grouping: assets.map{ TLPHAsset(asset: $0) }) { (element) -> String in + if let creationDate = element.phAsset?.creationDate { + let identifier = dateFormatter.string(from: creationDate) + return identifier + } + return "" + } + return sections + } + + func section(groupedBy: PHFetchedResultGroupedBy) -> [(String,[TLPHAsset])] { + let dict = enumarateFetchResult(groupedBy: groupedBy) + var sections = [(String,[TLPHAsset])]() + let sortedKeys = dict.keys.sorted(by: >) + for key in sortedKeys { + if let array = dict[key] { + sections.append((key, array)) + } + } + return sections + } +} diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLAssetPreviewViewController.swift b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLAssetPreviewViewController.swift new file mode 100644 index 0000000000000000000000000000000000000000..9f7c11a721ec077b635204ffcb771704f0a140c0 --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLAssetPreviewViewController.swift @@ -0,0 +1,204 @@ +import UIKit +import Photos +import PhotosUI + +open class TLAssetPreviewViewController: UIViewController { + + fileprivate var player: AVPlayer? + fileprivate var playerLayer: AVPlayerLayer? + + fileprivate let imageView: UIImageView = { + let view = UIImageView() + view.clipsToBounds = false + view.contentMode = .scaleAspectFill + return view + }() + + fileprivate let livePhotoView = PHLivePhotoView() + + open var asset: PHAsset? { + didSet { + guard let asset = self.asset else { + livePhotoView.livePhoto = nil + imageView.image = nil + return + } + + updatePreferredContentSize(for: asset, isPortrait: UIApplication.shared.orientation?.isPortrait == true) + + if asset.mediaType == .image { + previewImage(from: asset) + } else { + previewVideo(from: asset) + } + } + } + + override open func viewDidLoad() { + super.viewDidLoad() + setupViews() + } + + override open func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + playerLayer?.frame = imageView.bounds + } + + override open func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + if let asset = self.asset { + updatePreferredContentSize(for: asset, isPortrait: size.height > size.width) + } + } + + deinit { + player?.pause() + } +} + +private extension TLAssetPreviewViewController { + func setupViews() { + view.backgroundColor = .previewBackground + view.addAligned(imageView) + view.addAligned(livePhotoView) + } + + func fetchImage(for asset: PHAsset, canHandleDegraded: Bool = true, completion: @escaping ((UIImage?) -> Void)) { + let options = PHImageRequestOptions() + options.isNetworkAccessAllowed = true + options.deliveryMode = .opportunistic + PHCachingImageManager.default().requestImage( + for: asset, + targetSize: CGSize(width: asset.pixelWidth, height: asset.pixelHeight), + contentMode: .aspectFit, + options: options, + resultHandler: { (image, info) in + if !canHandleDegraded { + if let isDegraded = info?[PHImageResultIsDegradedKey] as? Bool, isDegraded { + return + } + } + completion(image) + }) + } + + func updatePreferredContentSize(for asset: PHAsset, isPortrait: Bool) { + guard asset.pixelWidth != 0 && asset.pixelHeight != 0 else { return } + + let contentScale: CGFloat = 1 + let assetWidth = CGFloat(asset.pixelWidth) + let assetHeight = CGFloat(asset.pixelHeight) + let assetRatio = assetHeight / assetWidth + let screenWidth = isPortrait ? UIScreen.main.bounds.width : UIScreen.main.bounds.height + let screenHeight = isPortrait ? UIScreen.main.bounds.height : UIScreen.main.bounds.width + let screenRatio = screenHeight / screenWidth + + if assetRatio > screenRatio { + let scale = screenHeight / assetHeight + preferredContentSize = CGSize(width: assetWidth * scale * contentScale, height: assetHeight * scale * contentScale) + } else { + let scale = screenWidth / assetWidth + preferredContentSize = CGSize(width: assetWidth * scale * contentScale, height: assetHeight * scale * contentScale) + } + } + + func previewVideo(from asset: PHAsset) { + livePhotoView.isHidden = true + PHCachingImageManager.default().requestAVAsset( + forVideo: asset, + options: nil, + resultHandler: { (avAsset, audio, info) in + DispatchQueue.main.async { [weak self] in + self?.imageView.isHidden = false + + if let avAsset = avAsset { + let playerItem = AVPlayerItem(asset: avAsset) + let player = AVPlayer(playerItem: playerItem) + let playerLayer = AVPlayerLayer(player: player) + playerLayer.videoGravity = AVLayerVideoGravity.resizeAspect + playerLayer.masksToBounds = true + playerLayer.frame = self?.imageView.bounds ?? .zero + + self?.imageView.layer.addSublayer(playerLayer) + self?.playerLayer = playerLayer + self?.player = player + + player.play() + } else { + self?.previewPhoto(from: asset) + } + } + }) + } + + func previewImage(from asset: PHAsset) { + imageView.isHidden = true + livePhotoView.isHidden = false + + if asset.mediaSubtypes == .photoLive { + previewLivePhoto(from: asset) + } else { + previewPhoto(from: asset) + } + } + + func previewLivePhoto(from asset: PHAsset) { + + let options = PHLivePhotoRequestOptions() + options.isNetworkAccessAllowed = true + options.deliveryMode = .opportunistic + + PHCachingImageManager.default().requestLivePhoto( + for: asset, + targetSize: CGSize(width: asset.pixelWidth, height: asset.pixelHeight), + contentMode: .aspectFill, + options: options, + resultHandler: { [weak self] (livePhoto, info) in + if let livePhoto = livePhoto, info?[PHImageErrorKey] == nil { + self?.livePhotoView.livePhoto = livePhoto + self?.livePhotoView.startPlayback(with: .full) + } else { + self?.previewPhoto(from: asset) + } + }) + } + + func previewPhoto(from asset: PHAsset) { + imageView.isHidden = false + fetchImage(for: asset, canHandleDegraded: false, completion: { self.imageView.image = $0 }) + } +} + +private extension UIColor { + static var previewBackground: UIColor { + if #available(iOS 13.0, *) { + return .systemBackground + } else { + return .white + } + } +} + +private extension UIView { + func addAligned(_ view: UIView) { + view.translatesAutoresizingMaskIntoConstraints = false + addSubview(view) + + NSLayoutConstraint.activate([ + view.leadingAnchor.constraint(equalTo: leadingAnchor), + view.trailingAnchor.constraint(equalTo: trailingAnchor), + view.topAnchor.constraint(equalTo: topAnchor), + view.bottomAnchor.constraint(equalTo: bottomAnchor) + ]) + } +} + +private extension UIApplication { + var orientation: UIInterfaceOrientation? { + if #available(iOS 13.0, *) { + return windows.first(where: { $0.isKeyWindow })?.windowScene?.interfaceOrientation + } else { + return statusBarOrientation + } + } +} diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLAssetsCollection.swift b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLAssetsCollection.swift new file mode 100644 index 0000000000000000000000000000000000000000..aede55f4a37ab973cb715d95dce45a6265554c30 --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLAssetsCollection.swift @@ -0,0 +1,430 @@ +// +// TLAssetsCollection.swift +// TLPhotosPicker +// +// Created by wade.hawk on 2017. 4. 18.. +// Copyright © 2017ë…„ wade.hawk. All rights reserved. +// + +import Foundation +import Photos +import PhotosUI +import MobileCoreServices + +public struct TLPHAsset { + enum CloudDownloadState { + case ready, progress, complete, failed + } + + public enum AssetType { + case photo, video, livePhoto + } + + public enum ImageExtType: String { + case png, jpg, gif, heic + } + + var state = CloudDownloadState.ready + public var phAsset: PHAsset? = nil + //Bool to check if TLPHAsset returned is created using camera. + public var isSelectedFromCamera = false + public var selectedOrder: Int = 0 + public var type: AssetType { + get { + guard let phAsset = self.phAsset else { return .photo } + if phAsset.mediaSubtypes.contains(.photoLive) { + return .livePhoto + }else if phAsset.mediaType == .video { + return .video + }else { + return .photo + } + } + } + + public var fullResolutionImage: UIImage? { + get { + guard let phAsset = self.phAsset else { return nil } + return TLPhotoLibrary.fullResolutionImageData(asset: phAsset) + } + } + + public func extType(defaultExt: ImageExtType = .png) -> ImageExtType { + guard let fileName = self.originalFileName, + let encodedFileName = fileName.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), + let extention = URL(string: encodedFileName)?.pathExtension.lowercased() else { + return defaultExt + } + return ImageExtType(rawValue: extention) ?? defaultExt + } + + @discardableResult + public func cloudImageDownload(progressBlock: @escaping (Double) -> Void, completionBlock:@escaping (UIImage?)-> Void ) -> PHImageRequestID? { + guard let phAsset = self.phAsset else { return nil } + return TLPhotoLibrary.cloudImageDownload(asset: phAsset, progressBlock: progressBlock, completionBlock: completionBlock) + } + + public var originalFileName: String? { + get { + guard let phAsset = self.phAsset,let resource = PHAssetResource.assetResources(for: phAsset).first else { return nil } + return resource.originalFilename + } + } + + public func photoSize(options: PHImageRequestOptions? = nil ,completion: @escaping ((Int)->Void), livePhotoVideoSize: Bool = false) { + guard let phAsset = self.phAsset, self.type == .photo || self.type == .livePhoto else { completion(-1); return } + var resource: PHAssetResource? = nil + if phAsset.mediaSubtypes.contains(.photoLive) == true, livePhotoVideoSize { + resource = PHAssetResource.assetResources(for: phAsset).filter { $0.type == .pairedVideo }.first + }else { + resource = PHAssetResource.assetResources(for: phAsset).filter { $0.type == .photo }.first + } + if let fileSize = resource?.value(forKey: "fileSize") as? Int { + completion(fileSize) + }else { + PHImageManager.default().requestImageData(for: phAsset, options: nil) { (data, uti, orientation, info) in + var fileSize = -1 + if let data = data { + let bcf = ByteCountFormatter() + bcf.countStyle = .file + fileSize = data.count + } + DispatchQueue.main.async { + completion(fileSize) + } + } + } + } + + public func videoSize(options: PHVideoRequestOptions? = nil, completion: @escaping ((Int)->Void)) { + guard let phAsset = self.phAsset, self.type == .video else { completion(-1); return } + let resource = PHAssetResource.assetResources(for: phAsset).filter { $0.type == .video }.first + if let fileSize = resource?.value(forKey: "fileSize") as? Int { + completion(fileSize) + }else { + PHImageManager.default().requestAVAsset(forVideo: phAsset, options: options) { (avasset, audioMix, info) in + func fileSize(_ url: URL?) -> Int? { + do { + guard let fileSize = try url?.resourceValues(forKeys: [.fileSizeKey]).fileSize else { return nil } + return fileSize + }catch { return nil } + } + var url: URL? = nil + if let urlAsset = avasset as? AVURLAsset { + url = urlAsset.url + }else if let sandboxKeys = info?["PHImageFileSandboxExtensionTokenKey"] as? String, let path = sandboxKeys.components(separatedBy: ";").last { + url = URL(fileURLWithPath: path) + } + let size = fileSize(url) ?? -1 + DispatchQueue.main.async { + completion(size) + } + } + } + } + + func MIMEType(_ url: URL?) -> String? { + guard let ext = url?.pathExtension else { return nil } + if !ext.isEmpty { + let UTIRef = UTTypeCreatePreferredIdentifierForTag("public.filename-extension" as CFString, ext as CFString, nil) + let UTI = UTIRef?.takeUnretainedValue() + UTIRef?.release() + if let UTI = UTI { + guard let MIMETypeRef = UTTypeCopyPreferredTagWithClass(UTI, kUTTagClassMIMEType) else { return nil } + let MIMEType = MIMETypeRef.takeUnretainedValue() + MIMETypeRef.release() + return MIMEType as String + } + } + return nil + } + + private func tempCopyLivePhotos(phAsset: PHAsset, + livePhotoRequestOptions: PHLivePhotoRequestOptions? = nil, + localURL: URL, + completionBlock:@escaping (() -> Void)) -> PHImageRequestID? { + var requestOptions = PHLivePhotoRequestOptions() + if let options = livePhotoRequestOptions { + requestOptions = options + }else { + requestOptions.isNetworkAccessAllowed = true + } + return PHImageManager.default().requestLivePhoto(for: phAsset, + targetSize: UIScreen.main.bounds.size, + contentMode: .default, + options: requestOptions) + { (livePhotos, infoDict) in + if let livePhotos = livePhotos { + let assetResources = PHAssetResource.assetResources(for: livePhotos) + assetResources.forEach { (resource) in + if resource.type == .pairedVideo { + PHAssetResourceManager.default().writeData(for: resource, toFile: localURL, options: nil) { (error) in + DispatchQueue.main.async { + completionBlock() + } + } + } + } + } + } + } + + @discardableResult + //convertLivePhotosToJPG + // false : If you want mov file at live photos + // true : If you want png file at live photos ( HEIC ) + public func tempCopyMediaFile(videoRequestOptions: PHVideoRequestOptions? = nil, + imageRequestOptions: PHImageRequestOptions? = nil, + livePhotoRequestOptions: PHLivePhotoRequestOptions? = nil, + exportPreset: String = AVAssetExportPresetHighestQuality, + convertLivePhotosToJPG: Bool = false, + progressBlock:((Double) -> Void)? = nil, + completionBlock:@escaping ((URL,String) -> Void)) -> PHImageRequestID? { + guard let phAsset = self.phAsset else { return nil } + var type: PHAssetResourceType? = nil + if phAsset.mediaSubtypes.contains(.photoLive) == true, convertLivePhotosToJPG == false { + type = .pairedVideo + }else { + type = phAsset.mediaType == .video ? .video : .photo + } + guard let resource = (PHAssetResource.assetResources(for: phAsset).filter{ $0.type == type }).first else { return nil } + let fileName = resource.originalFilename + var writeURL: URL? = nil + if #available(iOS 10.0, *) { + writeURL = FileManager.default.temporaryDirectory.appendingPathComponent("\(fileName)") + } else { + writeURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true).appendingPathComponent("\(fileName)") + } + guard var localURL = writeURL,var mimetype = MIMEType(writeURL) else { return nil } + if type == .pairedVideo { + return tempCopyLivePhotos(phAsset: phAsset, + livePhotoRequestOptions: livePhotoRequestOptions, + localURL: localURL, + completionBlock: { completionBlock(localURL, mimetype) }) + } + switch phAsset.mediaType { + case .video: + var requestOptions = PHVideoRequestOptions() + if let options = videoRequestOptions { + requestOptions = options + }else { + requestOptions.isNetworkAccessAllowed = true + } + //iCloud download progress + requestOptions.progressHandler = { (progress, error, stop, info) in + DispatchQueue.main.async { + progressBlock?(progress) + } + } + return PHImageManager.default().requestExportSession(forVideo: phAsset, + options: requestOptions, + exportPreset: exportPreset) + { (session, infoDict) in + session?.outputURL = localURL + session?.outputFileType = AVFileType.mov + session?.exportAsynchronously(completionHandler: { + DispatchQueue.main.async { + completionBlock(localURL, mimetype) + } + }) + } + case .image: + var requestOptions = PHImageRequestOptions() + if let options = imageRequestOptions { + requestOptions = options + }else { + requestOptions.isNetworkAccessAllowed = true + } + //iCloud download progress + requestOptions.progressHandler = { (progress, error, stop, info) in + DispatchQueue.main.async { + progressBlock?(progress) + } + } + return PHImageManager.default().requestImageData(for: phAsset, + options: requestOptions) + { (data, uti, orientation, info) in + do { + var data = data + let needConvertLivePhotoToJPG = phAsset.mediaSubtypes.contains(.photoLive) == true && convertLivePhotosToJPG == true + if needConvertLivePhotoToJPG { + let name = localURL.deletingPathExtension().lastPathComponent + localURL.deleteLastPathComponent() + localURL.appendPathComponent("\(name).jpg") + mimetype = "image/jpeg" + } + if needConvertLivePhotoToJPG, let imgData = data, let rawImage = UIImage(data: imgData)?.upOrientationImage() { + data = rawImage.jpegData(compressionQuality: 1) + } + try data?.write(to: localURL) + DispatchQueue.main.async { + completionBlock(localURL, mimetype) + } + }catch { } + } + default: + return nil + } + } + + private func videoFilename(phAsset: PHAsset) -> URL? { + guard let resource = (PHAssetResource.assetResources(for: phAsset).filter{ $0.type == .video }).first else { + return nil + } + var writeURL: URL? + let fileName = resource.originalFilename + if #available(iOS 10.0, *) { + writeURL = FileManager.default.temporaryDirectory.appendingPathComponent("\(fileName)") + } else { + writeURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true).appendingPathComponent("\(fileName)") + } + return writeURL + } + + //Apparently, This is not the only way to export video. + //There is many way that export a video. + //This method was one of them. + public func exportVideoFile(options: PHVideoRequestOptions? = nil, + outputURL: URL? = nil, + outputFileType: AVFileType = .mov, + progressBlock:((Double) -> Void)? = nil, + completionBlock:@escaping ((URL,String) -> Void)) { + guard + let phAsset = self.phAsset, + phAsset.mediaType == .video, + let writeURL = outputURL ?? videoFilename(phAsset: phAsset), + let mimetype = MIMEType(writeURL) + else { + return + } + var requestOptions = PHVideoRequestOptions() + if let options = options { + requestOptions = options + }else { + requestOptions.isNetworkAccessAllowed = true + } + requestOptions.progressHandler = { (progress, error, stop, info) in + DispatchQueue.main.async { + progressBlock?(progress) + } + } + PHImageManager.default().requestAVAsset(forVideo: phAsset, options: requestOptions) { (avasset, avaudioMix, infoDict) in + guard let avasset = avasset else { + return + } + let exportSession = AVAssetExportSession.init(asset: avasset, presetName: AVAssetExportPresetHighestQuality) + exportSession?.outputURL = writeURL + exportSession?.outputFileType = outputFileType + exportSession?.exportAsynchronously(completionHandler: { + completionBlock(writeURL, mimetype) + }) + } + } + + init(asset: PHAsset?) { + self.phAsset = asset + } + + public static func asset(with localIdentifier: String) -> TLPHAsset? { + let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [localIdentifier], options: nil) + return TLPHAsset(asset: fetchResult.firstObject) + } +} + +extension TLPHAsset: Equatable { + public static func ==(lhs: TLPHAsset, rhs: TLPHAsset) -> Bool { + guard let lphAsset = lhs.phAsset, let rphAsset = rhs.phAsset else { return false } + return lphAsset.localIdentifier == rphAsset.localIdentifier + } +} + +extension Array { + subscript (safe index: Int) -> Element? { + return indices ~= index ? self[index] : nil + } +} + +public struct TLAssetsCollection { + var phAssetCollection: PHAssetCollection? = nil + var fetchResult: PHFetchResult<PHAsset>? = nil + var useCameraButton: Bool = false + var recentPosition: CGPoint = CGPoint.zero + var title: String + var localIdentifier: String + public var sections: [(title: String, assets: [TLPHAsset])]? = nil + var count: Int { + get { + guard let count = self.fetchResult?.count, count > 0 else { return self.useCameraButton ? 1 : 0 } + return count + (self.useCameraButton ? 1 : 0) + } + } + + init(collection: PHAssetCollection) { + self.phAssetCollection = collection + self.title = collection.localizedTitle ?? "" + self.localIdentifier = collection.localIdentifier + } + + func getAsset(at index: Int) -> PHAsset? { + if self.useCameraButton && index == 0 { return nil } + let index = index - (self.useCameraButton ? 1 : 0) + guard let result = self.fetchResult, index < result.count else { return nil } + return result.object(at: max(index,0)) + } + + func getTLAsset(at indexPath: IndexPath) -> TLPHAsset? { + let isCameraRow = self.useCameraButton && indexPath.section == 0 && indexPath.row == 0 + if isCameraRow { + return nil + } + if let sections = self.sections { + let index = indexPath.row - ((self.useCameraButton && indexPath.section == 0) ? 1 : 0) + let result = sections[safe: indexPath.section] + return result?.assets[safe: index] + }else { + var index = indexPath.row + index = index - (self.useCameraButton ? 1 : 0) + guard let result = self.fetchResult, index < result.count else { return nil } + return TLPHAsset(asset: result.object(at: max(index,0))) + } + } + + func findIndex(phAsset: PHAsset) -> IndexPath? { + guard let sections = self.sections else { + return nil + } + for (offset, section) in sections.enumerated() { + if let index = section.assets.firstIndex(where: { $0.phAsset == phAsset }) { + return IndexPath(row: index, section: offset) + } + } + return nil + } + + mutating func reloadSection(groupedBy: PHFetchedResultGroupedBy) { + var groupedSections = self.section(groupedBy: groupedBy) + if self.useCameraButton { + groupedSections.insert(("camera",[TLPHAsset(asset: nil)]), at: 0) + } + self.sections = groupedSections + } + + static func ==(lhs: TLAssetsCollection, rhs: TLAssetsCollection) -> Bool { + return lhs.localIdentifier == rhs.localIdentifier + } +} + +extension UIImage { + func upOrientationImage() -> UIImage? { + switch imageOrientation { + case .up: + return self + default: + UIGraphicsBeginImageContextWithOptions(size, false, scale) + draw(in: CGRect(origin: .zero, size: size)) + let result = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return result + } + } +} diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLBundle.swift b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLBundle.swift new file mode 100644 index 0000000000000000000000000000000000000000..46f23ea35d46dfefd9112d495090e87620e849e0 --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLBundle.swift @@ -0,0 +1,29 @@ +// +// TLBundle.swift +// Pods +// +// Created by wade.hawk on 2017. 5. 9.. +// +// + +import UIKit + +open class TLBundle { + open class func podBundleImage(named: String) -> UIImage? { + let podBundle = Bundle(for: TLBundle.self) + if let url = podBundle.url(forResource: "TLPhotoPickerController", withExtension: "bundle") { + let bundle = Bundle(url: url) + return UIImage(named: named, in: bundle, compatibleWith: nil) + } + return nil + } + + class func bundle() -> Bundle { + let podBundle = Bundle(for: TLBundle.self) + if let url = podBundle.url(forResource: "TLPhotoPicker", withExtension: "bundle") { + let bundle = Bundle(url: url) + return bundle ?? podBundle + } + return podBundle + } +} diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLCollectionTableViewCell.swift b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLCollectionTableViewCell.swift new file mode 100644 index 0000000000000000000000000000000000000000..bedd379b870e85f48e031b3e43ef44335bdf5abc --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLCollectionTableViewCell.swift @@ -0,0 +1,25 @@ +// +// TLCollectionTableViewCell.swift +// TLPhotosPicker +// +// Created by wade.hawk on 2017. 5. 3.. +// Copyright © 2017ë…„ wade.hawk. All rights reserved. +// + +import UIKit + +open class TLCollectionTableViewCell: UITableViewCell { + @IBOutlet open var thumbImageView: UIImageView! + @IBOutlet open var titleLabel: UILabel! + @IBOutlet open var subTitleLabel: UILabel! + + override open func awakeFromNib() { + super.awakeFromNib() + if #available(iOS 11.0, *) { + self.thumbImageView.accessibilityIgnoresInvertColors = true + } + if #available(iOS 13.0, *) { + self.contentView.backgroundColor = .systemBackground + } + } +} diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLCollectionTableViewCell.xib b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLCollectionTableViewCell.xib new file mode 100644 index 0000000000000000000000000000000000000000..e8c682c2ed401b8d76ae834a2e735d39638ed5aa --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLCollectionTableViewCell.xib @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES"> + <device id="retina4_7" orientation="portrait" appearance="light"/> + <dependencies> + <deployment identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17125"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <objects> + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="TLCollectionTableViewCell" id="9FY-S1-KKQ" customClass="TLCollectionTableViewCell" customModule="TLPhotoPicker"> + <rect key="frame" x="0.0" y="0.0" width="375" height="75"/> + <autoresizingMask key="autoresizingMask"/> + <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="9FY-S1-KKQ" id="UUZ-nI-xH1"> + <rect key="frame" x="0.0" y="0.0" width="375" height="75"/> + <autoresizingMask key="autoresizingMask"/> + <subviews> + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="4Dk-kD-sMy"> + <rect key="frame" x="15" y="12.5" width="50" height="50"/> + <constraints> + <constraint firstAttribute="height" constant="50" id="yiu-ZU-58w"/> + <constraint firstAttribute="width" constant="50" id="zAc-Fo-aGe"/> + </constraints> + </imageView> + <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="7nv-2U-xMp"> + <rect key="frame" x="75" y="19.5" width="234" height="36.5"/> + <subviews> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Camera Roll" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ES8-Tq-6Wz"> + <rect key="frame" x="0.0" y="0.0" width="234" height="17"/> + <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="9999" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="NuJ-3w-ZAP"> + <rect key="frame" x="0.0" y="22" width="234" height="14.5"/> + <fontDescription key="fontDescription" type="system" pointSize="12"/> + <color key="textColor" red="0.43137254901960786" green="0.43137254901960786" blue="0.43137254901960786" alpha="1" colorSpace="calibratedRGB"/> + <nil key="highlightedColor"/> + </label> + </subviews> + </stackView> + </subviews> + <constraints> + <constraint firstItem="4Dk-kD-sMy" firstAttribute="leading" secondItem="UUZ-nI-xH1" secondAttribute="leading" constant="15" id="7W9-hT-caE"/> + <constraint firstItem="7nv-2U-xMp" firstAttribute="centerY" secondItem="UUZ-nI-xH1" secondAttribute="centerY" id="E6U-ch-GDV"/> + <constraint firstAttribute="trailingMargin" secondItem="7nv-2U-xMp" secondAttribute="trailing" constant="50" id="T3U-hj-718"/> + <constraint firstItem="4Dk-kD-sMy" firstAttribute="centerY" secondItem="UUZ-nI-xH1" secondAttribute="centerY" id="ZHB-JZ-YKE"/> + <constraint firstItem="7nv-2U-xMp" firstAttribute="leading" secondItem="4Dk-kD-sMy" secondAttribute="trailing" constant="10" id="i0n-S1-xnn"/> + </constraints> + </tableViewCellContentView> + <connections> + <outlet property="subTitleLabel" destination="NuJ-3w-ZAP" id="vlD-VJ-e5z"/> + <outlet property="thumbImageView" destination="4Dk-kD-sMy" id="f8b-VP-j8s"/> + <outlet property="titleLabel" destination="ES8-Tq-6Wz" id="sYW-0b-o03"/> + </connections> + <point key="canvasLocation" x="9.5" y="-83"/> + </tableViewCell> + </objects> +</document> diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotoCollectionViewCell.swift b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotoCollectionViewCell.swift new file mode 100644 index 0000000000000000000000000000000000000000..8de0fc0fdf115dc2ddd83e0ae5aed95a173b6a8f --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotoCollectionViewCell.swift @@ -0,0 +1,182 @@ +// +// TLPhotoCollectionViewCell.swift +// TLPhotosPicker +// +// Created by wade.hawk on 2017. 5. 3.. +// Copyright © 2017ë…„ wade.hawk. All rights reserved. +// + +import UIKit +import PhotosUI + +open class TLPlayerView: UIView { + @objc open var player: AVPlayer? { + get { + return playerLayer.player + } + set { + playerLayer.player = newValue + } + } + + @objc open var playerLayer: AVPlayerLayer { + return layer as! AVPlayerLayer + } + + // Override UIView property + override open class var layerClass: AnyClass { + return AVPlayerLayer.self + } +} + +open class TLPhotoCollectionViewCell: UICollectionViewCell { + private var observer: NSObjectProtocol? + @IBOutlet open var imageView: UIImageView? + @IBOutlet open var playerView: TLPlayerView? + @IBOutlet open var livePhotoView: PHLivePhotoView? + @IBOutlet open var liveBadgeImageView: UIImageView? + @IBOutlet open var durationView: UIView? + @IBOutlet open var videoIconImageView: UIImageView? + @IBOutlet open var durationLabel: UILabel? + @IBOutlet open var indicator: UIActivityIndicatorView? + @IBOutlet open var selectedView: UIView? + @IBOutlet open var selectedHeight: NSLayoutConstraint? + @IBOutlet open var orderLabel: UILabel? + @IBOutlet open var orderBgView: UIView? + + var configure = TLPhotosPickerConfigure() { + didSet { + self.selectedView?.layer.borderColor = self.configure.selectedColor.cgColor + self.orderBgView?.backgroundColor = self.configure.selectedColor + self.videoIconImageView?.image = self.configure.videoIcon + self.orderBgView?.isHidden = self.configure.singleSelectedMode + self.orderLabel?.isHidden = self.configure.singleSelectedMode + } + } + + open internal(set) var asset: PHAsset? + + @objc open var isCameraCell = false + + open var duration: TimeInterval? { + didSet { + guard let duration = self.duration else { return } + self.selectedHeight?.constant = -10 + self.durationLabel?.text = timeFormatted(timeInterval: duration) + } + } + + @objc open var player: AVPlayer? = nil { + didSet { + if self.configure.autoPlay == false { return } + if self.player == nil { + self.playerView?.playerLayer.player = nil + if let observer = self.observer { + NotificationCenter.default.removeObserver(observer) + } + }else { + self.playerView?.playerLayer.player = self.player + self.observer = NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem, queue: nil, using: { [weak self] (_) in + DispatchQueue.main.async { + guard let `self` = self else { return } + self.player?.seek(to: CMTime.zero) + self.player?.play() + self.player?.isMuted = self.configure.muteAudio + } + }) + } + } + } + + @objc open var selectedAsset: Bool = false { + willSet(newValue) { + self.selectedView?.isHidden = !newValue + self.durationView?.backgroundColor = newValue ? self.configure.selectedColor : UIColor(red: 0, green: 0, blue: 0, alpha: 0.6) + if !newValue { + self.orderLabel?.text = "" + } + } + } + + @objc open func timeFormatted(timeInterval: TimeInterval) -> String { + let seconds: Int = lround(timeInterval) + var hour: Int = 0 + var minute: Int = Int(seconds/60) + let second: Int = seconds % 60 + if minute > 59 { + hour = minute / 60 + minute = minute % 60 + return String(format: "%d:%d:%02d", hour, minute, second) + } else { + return String(format: "%d:%02d", minute, second) + } + } + + @objc open func popScaleAnim() { + UIView.animate(withDuration: 0.1, animations: { + self.transform = CGAffineTransform(scaleX: 1.05, y: 1.05) + }) { _ in + UIView.animate(withDuration: 0.1, animations: { + self.transform = CGAffineTransform(scaleX: 1, y: 1) + }) + } + } + + @objc open func update(with phAsset: PHAsset) { + + } + + @objc open func selectedCell() { + + } + + @objc open func willDisplayCell() { + + } + + @objc open func endDisplayingCell() { + + } + + @objc func stopPlay() { + if let player = self.player { + player.pause() + self.player = nil + } + self.livePhotoView?.livePhoto = nil + self.livePhotoView?.isHidden = true + self.livePhotoView?.stopPlayback() + self.livePhotoView?.delegate = nil + } + + deinit { +// print("deinit TLPhotoCollectionViewCell") + } + + override open func awakeFromNib() { + super.awakeFromNib() + self.playerView?.playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill + self.livePhotoView?.isHidden = true + self.durationView?.isHidden = true + self.selectedView?.isHidden = true + self.selectedView?.layer.borderWidth = 10 + self.selectedView?.layer.cornerRadius = 15 + self.orderBgView?.layer.cornerRadius = 2 + self.videoIconImageView?.image = self.configure.videoIcon + if #available(iOS 11.0, *) { + self.imageView?.accessibilityIgnoresInvertColors = true + self.playerView?.accessibilityIgnoresInvertColors = true + self.livePhotoView?.accessibilityIgnoresInvertColors = true + self.videoIconImageView?.accessibilityIgnoresInvertColors = true + } + } + + override open func prepareForReuse() { + super.prepareForReuse() + stopPlay() + self.durationView?.isHidden = true + self.durationView?.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.6) + self.selectedHeight?.constant = 10 + self.selectedAsset = false + } +} diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotoCollectionViewCell.xib b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotoCollectionViewCell.xib new file mode 100644 index 0000000000000000000000000000000000000000..4110de9062395990ec2d3a66cdc3ef232011833d --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotoCollectionViewCell.xib @@ -0,0 +1,142 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES"> + <device id="retina4_7" orientation="portrait" appearance="light"/> + <dependencies> + <deployment identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17125"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <objects> + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> + <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="TLPhotoCollectionViewCell" id="IF3-4e-v0j" customClass="TLPhotoCollectionViewCell" customModule="TLPhotoPicker"> + <rect key="frame" x="0.0" y="0.0" width="100" height="100"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> + <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center"> + <rect key="frame" x="0.0" y="0.0" width="100" height="100"/> + <autoresizingMask key="autoresizingMask"/> + <subviews> + <imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="0cR-fZ-1bW"> + <rect key="frame" x="0.0" y="0.0" width="100" height="100"/> + </imageView> + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vfk-Ao-TKR" customClass="PHLivePhotoView"> + <rect key="frame" x="0.0" y="0.0" width="100" height="100"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> + </view> + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="TGh-wt-hcR"> + <rect key="frame" x="70" y="70" width="25" height="25"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> + <constraints> + <constraint firstAttribute="width" constant="25" id="NMA-SI-Idt"/> + <constraint firstAttribute="height" constant="25" id="XvY-Ee-EA2"/> + </constraints> + </imageView> + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="apl-2Q-Hz7" customClass="TLPlayerView" customModule="TLPhotoPicker"> + <rect key="frame" x="0.0" y="0.0" width="100" height="100"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> + </view> + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="d1a-KW-Ta4"> + <rect key="frame" x="-5" y="-5" width="110" height="110"/> + <subviews> + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hbA-dR-I09"> + <rect key="frame" x="75" y="5" width="30" height="30"/> + <subviews> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Weu-ef-IZ5"> + <rect key="frame" x="1.5" y="8" width="25" height="16"/> + <constraints> + <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="25" id="YMX-0Z-bfm"/> + </constraints> + <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="13"/> + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <nil key="highlightedColor"/> + </label> + </subviews> + <color key="backgroundColor" red="0.27843137254901962" green="0.47058823529411764" blue="0.85098039215686272" alpha="1" colorSpace="calibratedRGB"/> + <constraints> + <constraint firstAttribute="height" constant="30" id="8ln-g5-eHL"/> + <constraint firstItem="Weu-ef-IZ5" firstAttribute="leading" secondItem="hbA-dR-I09" secondAttribute="leading" constant="1.5" id="Yw3-zp-UZQ"/> + <constraint firstAttribute="trailing" secondItem="Weu-ef-IZ5" secondAttribute="trailing" constant="3.5" id="jsL-aw-IED"/> + <constraint firstItem="Weu-ef-IZ5" firstAttribute="centerY" secondItem="hbA-dR-I09" secondAttribute="centerY" constant="1" id="nUh-b3-s9s"/> + </constraints> + </view> + </subviews> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> + <constraints> + <constraint firstAttribute="trailing" secondItem="hbA-dR-I09" secondAttribute="trailing" constant="5" id="hjj-HC-A4B"/> + <constraint firstItem="hbA-dR-I09" firstAttribute="top" secondItem="d1a-KW-Ta4" secondAttribute="top" constant="5" id="xJ1-j7-RX7"/> + </constraints> + </view> + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aju-ob-KlZ"> + <rect key="frame" x="0.0" y="75" width="100" height="25"/> + <subviews> + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Uzf-HJ-aUY"> + <rect key="frame" x="5" y="2.5" width="20" height="20"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> + </imageView> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0:02" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zNx-FC-5V2"> + <rect key="frame" x="30" y="0.0" width="65" height="25"/> + <constraints> + <constraint firstAttribute="width" constant="65" id="3hi-82-ovQ"/> + </constraints> + <fontDescription key="fontDescription" type="system" pointSize="12"/> + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <nil key="highlightedColor"/> + </label> + </subviews> + <color key="backgroundColor" red="0.11109734326601028" green="0.57953345775604248" blue="0.96568840742111206" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + <constraints> + <constraint firstAttribute="height" constant="25" id="DzP-0j-1SD"/> + <constraint firstItem="zNx-FC-5V2" firstAttribute="top" secondItem="aju-ob-KlZ" secondAttribute="top" id="Lim-xf-cbx"/> + <constraint firstAttribute="bottom" secondItem="zNx-FC-5V2" secondAttribute="bottom" id="T0P-EH-uPu"/> + <constraint firstAttribute="trailing" secondItem="zNx-FC-5V2" secondAttribute="trailing" constant="5" id="uhl-Y8-3g5"/> + </constraints> + </view> + <activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="DZc-ag-e55"> + <rect key="frame" x="40" y="40" width="20" height="20"/> + </activityIndicatorView> + </subviews> + </view> + <constraints> + <constraint firstAttribute="bottom" secondItem="vfk-Ao-TKR" secondAttribute="bottom" id="2gw-cO-5bN"/> + <constraint firstAttribute="bottom" secondItem="aju-ob-KlZ" secondAttribute="bottom" id="2wo-Ki-15d"/> + <constraint firstAttribute="trailing" secondItem="aju-ob-KlZ" secondAttribute="trailing" id="2zm-kD-GPn"/> + <constraint firstAttribute="bottom" secondItem="apl-2Q-Hz7" secondAttribute="bottom" id="3zu-V3-EAd"/> + <constraint firstAttribute="trailing" secondItem="0cR-fZ-1bW" secondAttribute="trailing" id="9sd-Ea-EBO"/> + <constraint firstAttribute="trailing" secondItem="vfk-Ao-TKR" secondAttribute="trailing" id="BZ0-ZG-uW5"/> + <constraint firstAttribute="bottom" secondItem="TGh-wt-hcR" secondAttribute="bottom" constant="5" id="Ba1-Z6-ypz"/> + <constraint firstItem="0cR-fZ-1bW" firstAttribute="leading" secondItem="IF3-4e-v0j" secondAttribute="leading" id="DXe-M9-mxX"/> + <constraint firstItem="aju-ob-KlZ" firstAttribute="leading" secondItem="IF3-4e-v0j" secondAttribute="leading" id="FDl-UE-XVM"/> + <constraint firstItem="apl-2Q-Hz7" firstAttribute="top" secondItem="IF3-4e-v0j" secondAttribute="top" id="JlA-ya-cf3"/> + <constraint firstAttribute="trailing" secondItem="apl-2Q-Hz7" secondAttribute="trailing" id="KZg-oh-B11"/> + <constraint firstAttribute="trailing" secondItem="TGh-wt-hcR" secondAttribute="trailing" constant="5" id="Meo-q5-HyZ"/> + <constraint firstItem="vfk-Ao-TKR" firstAttribute="leading" secondItem="IF3-4e-v0j" secondAttribute="leading" id="NOQ-KU-fHD"/> + <constraint firstItem="vfk-Ao-TKR" firstAttribute="top" secondItem="IF3-4e-v0j" secondAttribute="top" id="NrV-wc-c3q"/> + <constraint firstItem="d1a-KW-Ta4" firstAttribute="height" secondItem="IF3-4e-v0j" secondAttribute="height" constant="10" id="VMJ-Qp-D4N"/> + <constraint firstItem="apl-2Q-Hz7" firstAttribute="leading" secondItem="IF3-4e-v0j" secondAttribute="leading" id="bsL-0J-0Y5"/> + <constraint firstItem="d1a-KW-Ta4" firstAttribute="width" secondItem="IF3-4e-v0j" secondAttribute="width" constant="10" id="clS-DI-jvL"/> + <constraint firstItem="d1a-KW-Ta4" firstAttribute="top" secondItem="IF3-4e-v0j" secondAttribute="top" constant="-5" id="d3r-HZ-6We"/> + <constraint firstItem="DZc-ag-e55" firstAttribute="centerX" secondItem="IF3-4e-v0j" secondAttribute="centerX" id="fnn-1c-fSn"/> + <constraint firstItem="DZc-ag-e55" firstAttribute="centerY" secondItem="IF3-4e-v0j" secondAttribute="centerY" id="qZc-2h-nOx"/> + <constraint firstItem="d1a-KW-Ta4" firstAttribute="leading" secondItem="IF3-4e-v0j" secondAttribute="leading" constant="-5" id="sOj-ms-Oo3"/> + <constraint firstItem="0cR-fZ-1bW" firstAttribute="top" secondItem="IF3-4e-v0j" secondAttribute="top" id="sSC-fd-MoT"/> + <constraint firstAttribute="bottom" secondItem="0cR-fZ-1bW" secondAttribute="bottom" id="xzA-tS-EVK"/> + </constraints> + <connections> + <outlet property="durationLabel" destination="zNx-FC-5V2" id="5SU-lD-AGm"/> + <outlet property="durationView" destination="aju-ob-KlZ" id="hiP-Ze-cbc"/> + <outlet property="imageView" destination="0cR-fZ-1bW" id="N3f-v5-K9b"/> + <outlet property="indicator" destination="DZc-ag-e55" id="R3y-XL-0SY"/> + <outlet property="liveBadgeImageView" destination="TGh-wt-hcR" id="cry-3P-rLI"/> + <outlet property="livePhotoView" destination="vfk-Ao-TKR" id="uvj-l1-wcp"/> + <outlet property="orderBgView" destination="hbA-dR-I09" id="cQo-BP-xh1"/> + <outlet property="orderLabel" destination="Weu-ef-IZ5" id="B3t-X5-o3a"/> + <outlet property="playerView" destination="apl-2Q-Hz7" id="vTI-ie-mcV"/> + <outlet property="selectedHeight" destination="VMJ-Qp-D4N" id="uVe-tQ-4q5"/> + <outlet property="selectedView" destination="d1a-KW-Ta4" id="c31-4y-72g"/> + <outlet property="videoIconImageView" destination="Uzf-HJ-aUY" id="d7e-Bl-181"/> + </connections> + <point key="canvasLocation" x="32" y="-10"/> + </collectionViewCell> + </objects> +</document> diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotoLibrary.swift b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotoLibrary.swift new file mode 100644 index 0000000000000000000000000000000000000000..cfba48597e4d0cad31f815f0d908c56801c98e09 --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotoLibrary.swift @@ -0,0 +1,293 @@ +// +// TLPhotoLibrary.swift +// TLPhotosPicker +// +// Created by wade.hawk on 2017. 5. 3.. +// Copyright © 2017ë…„ wade.hawk. All rights reserved. +// + +import UIKit +import Photos + +protocol TLPhotoLibraryDelegate: AnyObject { + func loadCameraRollCollection(collection: TLAssetsCollection) + func loadCompleteAllCollection(collections: [TLAssetsCollection]) +} + +class TLPhotoLibrary { + + weak var delegate: TLPhotoLibraryDelegate? = nil + + lazy var imageManager: PHCachingImageManager = { + return PHCachingImageManager() + }() + internal var limitMode: Bool = false + internal var assetCollections: [PHFetchResult<PHAssetCollection>] = [] + internal var albums: PHFetchResult<PHCollection>? = nil + + deinit { + // print("deinit TLPhotoLibrary") + } + + @discardableResult + func livePhotoAsset(asset: PHAsset, size: CGSize = CGSize(width: 720, height: 1280), progressBlock: Photos.PHAssetImageProgressHandler? = nil, completionBlock:@escaping (PHLivePhoto,Bool)-> Void ) -> PHImageRequestID { + let options = PHLivePhotoRequestOptions() + options.deliveryMode = .opportunistic + options.isNetworkAccessAllowed = true + options.progressHandler = progressBlock + let scale = min(UIScreen.main.scale,2) + let targetSize = CGSize(width: size.width*scale, height: size.height*scale) + let requestID = self.imageManager.requestLivePhoto(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: options) { (livePhoto, info) in + let complete = (info?["PHImageResultIsDegradedKey"] as? Bool) == false + if let livePhoto = livePhoto { + completionBlock(livePhoto,complete) + } + } + return requestID + } + + @discardableResult + func videoAsset(asset: PHAsset, size: CGSize = CGSize(width: 720, height: 1280), progressBlock: Photos.PHAssetImageProgressHandler? = nil, completionBlock:@escaping (AVPlayerItem?, [AnyHashable : Any]?) -> Void ) -> PHImageRequestID { + let options = PHVideoRequestOptions() + options.isNetworkAccessAllowed = true + options.deliveryMode = .automatic + options.progressHandler = progressBlock + let requestID = self.imageManager.requestPlayerItem(forVideo: asset, options: options, resultHandler: { playerItem, info in + completionBlock(playerItem,info) + }) + return requestID + } + + @discardableResult + func imageAsset(asset: PHAsset, size: CGSize = CGSize(width: 160, height: 160), options: PHImageRequestOptions? = nil, completionBlock:@escaping (UIImage,Bool)-> Void ) -> PHImageRequestID { + var options = options + if options == nil { + options = PHImageRequestOptions() + options?.isSynchronous = false + options?.resizeMode = .exact + options?.deliveryMode = .opportunistic + options?.isNetworkAccessAllowed = true + } + let scale = min(UIScreen.main.scale,2) + let targetSize = CGSize(width: size.width*scale, height: size.height*scale) + let requestID = self.imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: options) { image, info in + let complete = (info?["PHImageResultIsDegradedKey"] as? Bool) == false + if let image = image { + completionBlock(image,complete) + } + } + return requestID + } + + func cancelPHImageRequest(requestID: PHImageRequestID) { + self.imageManager.cancelImageRequest(requestID) + } + + @discardableResult + class func cloudImageDownload(asset: PHAsset, size: CGSize = PHImageManagerMaximumSize, progressBlock: @escaping (Double) -> Void, completionBlock:@escaping (UIImage?)-> Void ) -> PHImageRequestID { + let options = PHImageRequestOptions() + options.isSynchronous = false + options.isNetworkAccessAllowed = true + options.deliveryMode = .opportunistic + options.version = .current + options.resizeMode = .exact + options.progressHandler = { (progress,error,stop,info) in + progressBlock(progress) + } + let requestID = PHCachingImageManager().requestImageData(for: asset, options: options) { (imageData, dataUTI, orientation, info) in + if let data = imageData,let _ = info { + completionBlock(UIImage(data: data)) + }else{ + completionBlock(nil)//error + } + } + return requestID + } + + @discardableResult + class func fullResolutionImageData(asset: PHAsset) -> UIImage? { + let options = PHImageRequestOptions() + options.isSynchronous = true + options.resizeMode = .none + options.isNetworkAccessAllowed = true + options.version = .current + var image: UIImage? = nil + _ = PHCachingImageManager().requestImageData(for: asset, options: options) { (imageData, dataUTI, orientation, info) in + if let data = imageData { + image = UIImage(data: data) + } + } + return image + } +} + +extension PHFetchOptions { + func merge(predicate: NSPredicate) { + if let storePredicate = self.predicate { + self.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [storePredicate, predicate]) + }else { + self.predicate = predicate + } + } +} + +//MARK: - Load Collection +extension TLPhotoLibrary { + func getOption(configure: TLPhotosPickerConfigure) -> PHFetchOptions { + let options: PHFetchOptions + if let fetchOption = configure.fetchOption { + options = fetchOption + }else { + options = PHFetchOptions() + options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] + } + if let mediaType = configure.mediaType { + let mediaPredicate = NSPredicate(format: "mediaType = %i", mediaType.rawValue) + options.merge(predicate: mediaPredicate) + } + if configure.allowedVideo == false { + let notVideoPredicate = NSPredicate(format: "mediaType != %i", PHAssetMediaType.video.rawValue) + options.merge(predicate: notVideoPredicate) + } + if configure.allowedLivePhotos == false { + let notLivePhotoPredicate = NSPredicate(format: "NOT ((mediaSubtype & %d) != 0)", PHAssetMediaSubtype.photoLive.rawValue) + options.merge(predicate: notLivePhotoPredicate) + } + if let maxVideoDuration = configure.maxVideoDuration { + let durationPredicate = NSPredicate(format: "duration < %f", maxVideoDuration) + options.merge(predicate: durationPredicate) + } + return options + } + + func fetchResult(collection: TLAssetsCollection?, configure: TLPhotosPickerConfigure) -> PHFetchResult<PHAsset>? { + guard let phAssetCollection = collection?.phAssetCollection else { return nil } + let options = getOption(configure: configure) + return PHAsset.fetchAssets(in: phAssetCollection, options: options) + } + + func fetchCollection(configure: TLPhotosPickerConfigure) { + self.albums = nil + self.assetCollections = [] + let useCameraButton = configure.usedCameraButton + let options = getOption(configure: configure) + let fetchCollectionOption = configure.fetchCollectionOption + + func getAlbum(subType: PHAssetCollectionSubtype, result: inout [TLAssetsCollection]) { + let collectionOption = fetchCollectionOption[.assetCollections(.album)] + let fetchCollection = PHAssetCollection.fetchAssetCollections(with: .album, + subtype: subType, + options: collectionOption) + self.assetCollections.append(fetchCollection) + var collections = [PHAssetCollection]() + fetchCollection.enumerateObjects { (collection, index, _) in + if configure.allowedAlbumCloudShared == false && collection.assetCollectionSubtype == .albumCloudShared { + }else { + collections.append(collection) + } + } + for collection in collections { + if !result.contains(where: { $0.localIdentifier == collection.localIdentifier }) { + var assetsCollection = TLAssetsCollection(collection: collection) + assetsCollection.title = configure.customLocalizedTitle[assetsCollection.title] ?? assetsCollection.title + assetsCollection.fetchResult = PHAsset.fetchAssets(in: collection, options: options) + if assetsCollection.count > 0 { + result.append(assetsCollection) + } + } + } + } + + @discardableResult + func getSmartAlbum(subType: PHAssetCollectionSubtype, + useCameraButton: Bool = false, + result: inout [TLAssetsCollection]) + -> TLAssetsCollection? + { + let collectionOption = fetchCollectionOption[.assetCollections(.smartAlbum)] + let fetchCollection = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, + subtype: subType, + options: collectionOption) + self.assetCollections.append(fetchCollection) + if + let collection = fetchCollection.firstObject, + result.contains(where: { $0.localIdentifier == collection.localIdentifier }) == false + { + var assetsCollection = TLAssetsCollection(collection: collection) + assetsCollection.title = configure.customLocalizedTitle[assetsCollection.title] ?? assetsCollection.title + assetsCollection.fetchResult = PHAsset.fetchAssets(in: collection, options: options) + if assetsCollection.count > 0 || useCameraButton { + result.append(assetsCollection) + return assetsCollection + } + } + return nil + } + if let fetchCollectionTypes = configure.fetchCollectionTypes { + DispatchQueue.global(qos: .userInteractive).async { [weak self] in + var assetCollections = [TLAssetsCollection]() + for (type,subType) in fetchCollectionTypes { + if type == .smartAlbum { + getSmartAlbum(subType: subType, result: &assetCollections) + }else { + getAlbum(subType: subType, result: &assetCollections) + } + } + DispatchQueue.main.async { + self?.delegate?.loadCompleteAllCollection(collections: assetCollections) + } + } + }else { + DispatchQueue.global(qos: .userInteractive).async { [weak self] in + var assetCollections = [TLAssetsCollection]() + + //Recents + let recentsCollection = getSmartAlbum(subType: .smartAlbumUserLibrary, + useCameraButton: useCameraButton, + result: &assetCollections) + if var cameraRoll = recentsCollection { + cameraRoll.title = configure.customLocalizedTitle[cameraRoll.title] ?? cameraRoll.title + cameraRoll.useCameraButton = useCameraButton + assetCollections[0] = cameraRoll + DispatchQueue.main.async { + self?.delegate?.loadCameraRollCollection(collection: cameraRoll) + } + } + //Screenshots + getSmartAlbum(subType: .smartAlbumScreenshots, result: &assetCollections) + //Selfies + getSmartAlbum(subType: .smartAlbumSelfPortraits, result: &assetCollections) + //Panoramas + getSmartAlbum(subType: .smartAlbumPanoramas, result: &assetCollections) + //Favorites + getSmartAlbum(subType: .smartAlbumFavorites, result: &assetCollections) + //CloudShared + getSmartAlbum(subType: .albumCloudShared, result: &assetCollections) + //get all another albums + getAlbum(subType: .any, result: &assetCollections) + if configure.allowedVideo { + //Videos + getSmartAlbum(subType: .smartAlbumVideos, result: &assetCollections) + } + //Album + let collectionOption = fetchCollectionOption[.topLevelUserCollections] + let albumsResult = PHCollectionList.fetchTopLevelUserCollections(with: collectionOption) + self?.albums = albumsResult + albumsResult.enumerateObjects({ (collection, index, stop) -> Void in + guard let collection = collection as? PHAssetCollection else { return } + var assetsCollection = TLAssetsCollection(collection: collection) + assetsCollection.title = configure.customLocalizedTitle[assetsCollection.title] ?? assetsCollection.title + assetsCollection.fetchResult = PHAsset.fetchAssets(in: collection, options: options) + if assetsCollection.count > 0, !assetCollections.contains(where: { $0.localIdentifier == collection.localIdentifier }) { + assetCollections.append(assetsCollection) + } + }) + + DispatchQueue.main.async { + self?.delegate?.loadCompleteAllCollection(collections: assetCollections) + } + } + } + } +} + diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotopickerDataSourcesProtocol.swift b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotopickerDataSourcesProtocol.swift new file mode 100644 index 0000000000000000000000000000000000000000..58b97f25d9958f6e7be4dd90851c89ac329dcf2e --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotopickerDataSourcesProtocol.swift @@ -0,0 +1,17 @@ +// +// TLPhotopickerDataSourcesProtocol.swift +// TLPhotoPicker +// +// Created by wade.hawk on 21/01/2019. +// + +import UIKit +import Photos + +public protocol TLPhotopickerDataSourcesProtocol { + func headerReferenceSize() -> CGSize + func footerReferenceSize() -> CGSize + func registerSupplementView(collectionView: UICollectionView) + func supplementIdentifier(kind: String) -> String + func configure(supplement view: UICollectionReusableView, section: (title: String, assets: [TLPHAsset])) +} diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotosPickerViewController.swift b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotosPickerViewController.swift new file mode 100644 index 0000000000000000000000000000000000000000..1b0211e454229e88f3d9afb859b5da02c52436b1 --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotosPickerViewController.swift @@ -0,0 +1,1358 @@ +// +// TLPhotosPickerViewController.swift +// TLPhotosPicker +// +// Created by wade.hawk on 2017. 4. 14.. +// Copyright © 2017ë…„ wade.hawk. All rights reserved. +// + +import UIKit +import Photos +import PhotosUI +import MobileCoreServices + +public protocol TLPhotosPickerViewControllerDelegate: AnyObject { + func dismissPhotoPicker(withPHAssets: [PHAsset]) + func dismissPhotoPicker(withTLPHAssets: [TLPHAsset]) + func shouldDismissPhotoPicker(withTLPHAssets: [TLPHAsset]) -> Bool + func dismissComplete() + func photoPickerDidCancel() + func canSelectAsset(phAsset: PHAsset) -> Bool + func didExceedMaximumNumberOfSelection(picker: TLPhotosPickerViewController) + func handleNoAlbumPermissions(picker: TLPhotosPickerViewController) + func handleNoCameraPermissions(picker: TLPhotosPickerViewController) +} + +extension TLPhotosPickerViewControllerDelegate { + public func deninedAuthoization() { } + public func dismissPhotoPicker(withPHAssets: [PHAsset]) { } + public func dismissPhotoPicker(withTLPHAssets: [TLPHAsset]) { } + public func shouldDismissPhotoPicker(withTLPHAssets: [TLPHAsset]) -> Bool { return true } + public func dismissComplete() { } + public func photoPickerDidCancel() { } + public func canSelectAsset(phAsset: PHAsset) -> Bool { return true } + public func didExceedMaximumNumberOfSelection(picker: TLPhotosPickerViewController) { } + public func handleNoAlbumPermissions(picker: TLPhotosPickerViewController) { } + public func handleNoCameraPermissions(picker: TLPhotosPickerViewController) { } +} + +//for log +public protocol TLPhotosPickerLogDelegate: AnyObject { + func selectedCameraCell(picker: TLPhotosPickerViewController) + func deselectedPhoto(picker: TLPhotosPickerViewController, at: Int) + func selectedPhoto(picker: TLPhotosPickerViewController, at: Int) + func selectedAlbum(picker: TLPhotosPickerViewController, title: String, at: Int) +} + +extension TLPhotosPickerLogDelegate { + func selectedCameraCell(picker: TLPhotosPickerViewController) { } + func deselectedPhoto(picker: TLPhotosPickerViewController, at: Int) { } + func selectedPhoto(picker: TLPhotosPickerViewController, at: Int) { } + func selectedAlbum(picker: TLPhotosPickerViewController, collections: [TLAssetsCollection], at: Int) { } +} + +public struct TLPhotosPickerConfigure { + public var customLocalizedTitle: [String: String] = ["Camera Roll": "Camera Roll"] + public var tapHereToChange = "Tap here to change" + public var cancelTitle = "Cancel" + public var doneTitle = "Done" + public var emptyMessage = "No albums" + public var selectMessage = "Select" + public var deselectMessage = "Deselect" + public var emptyImage: UIImage? = nil + public var usedCameraButton = true + public var defaultToFrontFacingCamera = false + public var usedPrefetch = false + public var previewAtForceTouch = false + public var startplayBack: PHLivePhotoViewPlaybackStyle = .hint + public var allowedLivePhotos = true + public var allowedVideo = true + public var allowedAlbumCloudShared = false + public var allowedPhotograph = true + public var allowedVideoRecording = true + public var recordingVideoQuality: UIImagePickerController.QualityType = .typeMedium + public var maxVideoDuration:TimeInterval? = nil + public var autoPlay = true + public var muteAudio = true + public var preventAutomaticLimitedAccessAlert = true + public var mediaType: PHAssetMediaType? = nil + public var numberOfColumn = 3 + public var minimumLineSpacing: CGFloat = 5 + public var minimumInteritemSpacing: CGFloat = 5 + public var singleSelectedMode = false + public var maxSelectedAssets: Int? = nil + public var fetchOption: PHFetchOptions? = nil + public var fetchCollectionOption: [FetchCollectionType: PHFetchOptions] = [:] + public var selectedColor = UIColor(red: 88/255, green: 144/255, blue: 255/255, alpha: 1.0) + public var cameraBgColor = UIColor(red: 221/255, green: 223/255, blue: 226/255, alpha: 1) + public var cameraIcon = TLBundle.podBundleImage(named: "camera") + public var videoIcon = TLBundle.podBundleImage(named: "video") + public var placeholderIcon = TLBundle.podBundleImage(named: "insertPhotoMaterial") + public var nibSet: (nibName: String, bundle:Bundle)? = nil + public var cameraCellNibSet: (nibName: String, bundle:Bundle)? = nil + public var fetchCollectionTypes: [(PHAssetCollectionType,PHAssetCollectionSubtype)]? = nil + public var groupByFetch: PHFetchedResultGroupedBy? = nil + public var supportedInterfaceOrientations: UIInterfaceOrientationMask = .portrait + public var popup: [PopupConfigure] = [] + public init() { + + } +} + +public enum FetchCollectionType { + case assetCollections(PHAssetCollectionType) + case topLevelUserCollections +} + +extension FetchCollectionType: Hashable { + private var identifier: String { + switch self { + case let .assetCollections(collectionType): + return "assetCollections\(collectionType.rawValue)" + case .topLevelUserCollections: + return "topLevelUserCollections" + } + } + + public func hash(into hasher: inout Hasher) { + hasher.combine(self.identifier) + } +} + +public enum PopupConfigure { + case animation(TimeInterval) +} + +public struct Platform { + public static var isSimulator: Bool { + return TARGET_OS_SIMULATOR != 0 // Use this line in Xcode 7 or newer + } +} + + +open class TLPhotosPickerViewController: UIViewController { + @IBOutlet open var navigationBar: UINavigationBar! + @IBOutlet open var titleView: UIView! + @IBOutlet open var titleLabel: UILabel! + @IBOutlet open var subTitleStackView: UIStackView! + @IBOutlet open var subTitleLabel: UILabel! + @IBOutlet open var subTitleArrowImageView: UIImageView! + @IBOutlet open var albumPopView: TLAlbumPopView! + @IBOutlet open var collectionView: UICollectionView! + @IBOutlet open var indicator: UIActivityIndicatorView! + @IBOutlet open var popArrowImageView: UIImageView! + @IBOutlet open var customNavItem: UINavigationItem! + @IBOutlet open var doneButton: UIBarButtonItem! + @IBOutlet open var cancelButton: UIBarButtonItem! + @IBOutlet open var navigationBarTopConstraint: NSLayoutConstraint! + @IBOutlet open var emptyView: UIView! + @IBOutlet open var emptyImageView: UIImageView! + @IBOutlet open var emptyMessageLabel: UILabel! + @IBOutlet open var photosButton: UIBarButtonItem! + + public weak var delegate: TLPhotosPickerViewControllerDelegate? = nil + public weak var logDelegate: TLPhotosPickerLogDelegate? = nil + open var selectedAssets = [TLPHAsset]() + public var configure = TLPhotosPickerConfigure() + public var customDataSouces: TLPhotopickerDataSourcesProtocol? = nil + + private var usedCameraButton: Bool { + return self.configure.usedCameraButton + } + private var previewAtForceTouch: Bool { + return self.configure.previewAtForceTouch + } + private var allowedVideo: Bool { + return self.configure.allowedVideo + } + private var usedPrefetch: Bool { + get { + return self.configure.usedPrefetch + } + set { + self.configure.usedPrefetch = newValue + } + } + private var allowedLivePhotos: Bool { + get { + return self.configure.allowedLivePhotos + } + set { + self.configure.allowedLivePhotos = newValue + } + } + @objc open var canSelectAsset: ((PHAsset) -> Bool)? = nil + @objc open var didExceedMaximumNumberOfSelection: ((TLPhotosPickerViewController) -> Void)? = nil + @objc open var handleNoAlbumPermissions: ((TLPhotosPickerViewController) -> Void)? = nil + @objc open var handleNoCameraPermissions: ((TLPhotosPickerViewController) -> Void)? = nil + @objc open var dismissCompletion: (() -> Void)? = nil + private var completionWithPHAssets: (([PHAsset]) -> Void)? = nil + private var completionWithTLPHAssets: (([TLPHAsset]) -> Void)? = nil + private var didCancel: (() -> Void)? = nil + + private var collections = [TLAssetsCollection]() + private var focusedCollection: TLAssetsCollection? = nil + private var requestIDs = SynchronizedDictionary<IndexPath,PHImageRequestID>() + private var playRequestID: (indexPath: IndexPath, requestID: PHImageRequestID)? = nil + private var photoLibrary = TLPhotoLibrary() + private var queue = DispatchQueue(label: "tilltue.photos.pikcker.queue") + private var queueForGroupedBy = DispatchQueue(label: "tilltue.photos.pikcker.queue.for.groupedBy", qos: .utility) + private var thumbnailSize = CGSize.zero + private var placeholderThumbnail: UIImage? = nil + private var cameraImage: UIImage? = nil + + deinit { + //print("deinit TLPhotosPickerViewController") + PHPhotoLibrary.shared().unregisterChangeObserver(self) + } + + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public init() { + super.init(nibName: "TLPhotosPickerViewController", bundle: TLBundle.bundle()) + } + + @objc convenience public init(withPHAssets: (([PHAsset]) -> Void)? = nil, didCancel: (() -> Void)? = nil) { + self.init() + self.completionWithPHAssets = withPHAssets + self.didCancel = didCancel + } + + convenience public init(withTLPHAssets: (([TLPHAsset]) -> Void)? = nil, didCancel: (() -> Void)? = nil) { + self.init() + self.completionWithTLPHAssets = withTLPHAssets + self.didCancel = didCancel + } + + override open var supportedInterfaceOrientations: UIInterfaceOrientationMask { + return self.configure.supportedInterfaceOrientations + } + + open override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + + if traitCollection.forceTouchCapability == .available && self.previewAtForceTouch { + registerForPreviewing(with: self, sourceView: collectionView) + } + + updateUserInterfaceStyle() + } + + private func updateUserInterfaceStyle() { + if #available(iOS 13.0, *) { + let userInterfaceStyle = self.traitCollection.userInterfaceStyle + let image = TLBundle.podBundleImage(named: "pop_arrow") + let subImage = TLBundle.podBundleImage(named: "arrow") + if userInterfaceStyle.rawValue == 2 { + self.popArrowImageView.image = image?.colorMask(color: .systemBackground) + self.subTitleArrowImageView.image = subImage?.colorMask(color: .white) + self.view.backgroundColor = .black + self.collectionView.backgroundColor = .black + } else { + self.popArrowImageView.image = image?.colorMask(color: .white) + self.subTitleArrowImageView.image = subImage + self.view.backgroundColor = .white + self.collectionView.backgroundColor = .white + } + } + } + + override open func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + self.stopPlay() + } + + private func loadPhotos(limitMode: Bool) { + self.photoLibrary.limitMode = limitMode + self.photoLibrary.delegate = self + self.photoLibrary.fetchCollection(configure: self.configure) + } + + private func processAuthorization(status: PHAuthorizationStatus) { + switch status { + case .notDetermined: + requestAuthorization() + case .limited: + loadPhotos(limitMode: true) + case .authorized: + loadPhotos(limitMode: false) + case .restricted, .denied: + handleDeniedAlbumsAuthorization() + @unknown default: + break + } + } + + private func requestAuthorization() { + if #available(iOS 14.0, *) { + PHPhotoLibrary.requestAuthorization(for: .readWrite) { [weak self] status in + self?.processAuthorization(status: status) + } + } else { + PHPhotoLibrary.requestAuthorization { [weak self] status in + self?.processAuthorization(status: status) + } + } + } + + private func checkAuthorization() { + if #available(iOS 14.0, *) { + let status = PHPhotoLibrary.authorizationStatus(for: .readWrite) + processAuthorization(status: status) + } else { + let status = PHPhotoLibrary.authorizationStatus() + processAuthorization(status: status) + } + } + + override open func viewDidLoad() { + super.viewDidLoad() + makeUI() + checkAuthorization() + } + + override open func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + if self.thumbnailSize == CGSize.zero { + initItemSize() + } + if #available(iOS 11.0, *) { + } else if self.navigationBarTopConstraint.constant == 0 { + self.navigationBarTopConstraint.constant = 20 + } + } + + override open func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + if self.photoLibrary.delegate == nil { + checkAuthorization() + } + } + + private func findIndexAndReloadCells(phAsset: PHAsset) { + if + self.configure.groupByFetch != nil, + let indexPath = self.focusedCollection?.findIndex(phAsset: phAsset) + { + self.collectionView.reloadItems(at: [indexPath]) + return + } + if + var index = self.focusedCollection?.fetchResult?.index(of: phAsset), + let focused = self.focusedCollection, + index != NSNotFound + { + index += (focused.useCameraButton) ? 1 : 0 + self.collectionView.reloadItems(at: [IndexPath(row: index, section: 0)]) + } + } + + open func deselectWhenUsingSingleSelectedMode() { + if + self.configure.singleSelectedMode == true, + let selectedPHAsset = self.selectedAssets.first?.phAsset + { + self.selectedAssets.removeAll() + findIndexAndReloadCells(phAsset: selectedPHAsset) + } + } + + open func maxCheck() -> Bool { + deselectWhenUsingSingleSelectedMode() + if let max = self.configure.maxSelectedAssets, max <= self.selectedAssets.count { + self.delegate?.didExceedMaximumNumberOfSelection(picker: self) + self.didExceedMaximumNumberOfSelection?(self) + return true + } + return false + } +} + +// MARK: - UI & UI Action +extension TLPhotosPickerViewController { + + @objc public func registerNib(nibName: String, bundle: Bundle) { + self.collectionView.register(UINib(nibName: nibName, bundle: bundle), forCellWithReuseIdentifier: nibName) + } + + private func centerAtRect(image: UIImage?, rect: CGRect, bgColor: UIColor = UIColor.white) -> UIImage? { + guard let image = image else { return nil } + UIGraphicsBeginImageContextWithOptions(rect.size, false, image.scale) + bgColor.setFill() + UIRectFill(CGRect(x: 0, y: 0, width: rect.size.width, height: rect.size.height)) + image.draw(in: CGRect(x:rect.size.width/2 - image.size.width/2, y:rect.size.height/2 - image.size.height/2, width:image.size.width, height:image.size.height)) + let result = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return result + } + + private func initItemSize() { + guard let layout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout else { + return + } + let count = CGFloat(self.configure.numberOfColumn) + let width = floor((self.view.frame.size.width - (self.configure.minimumInteritemSpacing * (count-1))) / count) + self.thumbnailSize = CGSize(width: width, height: width) + layout.itemSize = self.thumbnailSize + layout.minimumInteritemSpacing = self.configure.minimumInteritemSpacing + layout.minimumLineSpacing = self.configure.minimumLineSpacing + self.collectionView.collectionViewLayout = layout + self.placeholderThumbnail = centerAtRect(image: self.configure.placeholderIcon, rect: CGRect(x: 0, y: 0, width: width, height: width)) + self.cameraImage = centerAtRect(image: self.configure.cameraIcon, rect: CGRect(x: 0, y: 0, width: width, height: width), bgColor: self.configure.cameraBgColor) + } + + @objc open func makeUI() { + registerNib(nibName: "TLPhotoCollectionViewCell", bundle: TLBundle.bundle()) + if let nibSet = self.configure.nibSet { + registerNib(nibName: nibSet.nibName, bundle: nibSet.bundle) + } + if let nibSet = self.configure.cameraCellNibSet { + registerNib(nibName: nibSet.nibName, bundle: nibSet.bundle) + } + self.indicator.startAnimating() + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(titleTap)) + self.titleView.addGestureRecognizer(tapGesture) + self.titleLabel.text = self.configure.customLocalizedTitle["Camera Roll"] + self.subTitleLabel.text = self.configure.tapHereToChange + self.cancelButton.title = self.configure.cancelTitle + + let attributes: [NSAttributedString.Key: Any] = [.font: UIFont.boldSystemFont(ofSize: UIFont.labelFontSize)] + self.doneButton.setTitleTextAttributes(attributes, for: .normal) + self.doneButton.title = self.configure.doneTitle + self.emptyView.isHidden = true + self.emptyImageView.image = self.configure.emptyImage + self.emptyMessageLabel.text = self.configure.emptyMessage + self.albumPopView.tableView.delegate = self + self.albumPopView.tableView.dataSource = self + self.popArrowImageView.image = TLBundle.podBundleImage(named: "pop_arrow") + self.subTitleArrowImageView.image = TLBundle.podBundleImage(named: "arrow") + if #available(iOS 10.0, *), self.usedPrefetch { + self.collectionView.isPrefetchingEnabled = true + self.collectionView.prefetchDataSource = self + } else { + self.usedPrefetch = false + } + if #available(iOS 9.0, *), self.allowedLivePhotos { + } else { + self.allowedLivePhotos = false + } + self.customDataSouces?.registerSupplementView(collectionView: self.collectionView) + self.navigationBar.delegate = self + updateUserInterfaceStyle() + } + + private func updatePresentLimitedLibraryButton() { + if #available(iOS 14.0, *), self.photoLibrary.limitMode && self.configure.preventAutomaticLimitedAccessAlert { + self.customNavItem.rightBarButtonItems = [self.doneButton, self.photosButton] + } else { + self.customNavItem.rightBarButtonItems = [self.doneButton] + } + } + + private func updateTitle() { + guard self.focusedCollection != nil else { return } + self.titleLabel.text = self.focusedCollection?.title + updatePresentLimitedLibraryButton() + } + + private func reloadCollectionView() { + guard self.focusedCollection != nil else { + return + } + if let groupedBy = self.configure.groupByFetch, self.usedPrefetch == false { + queueForGroupedBy.async { [weak self] in + self?.focusedCollection?.reloadSection(groupedBy: groupedBy) + DispatchQueue.main.async { + self?.collectionView.reloadData() + } + } + }else { + self.collectionView.reloadData() + } + } + + private func reloadTableView() { + let count = min(5, self.collections.count) + var frame = self.albumPopView.popupView.frame + frame.size.height = CGFloat(count * 75) + self.albumPopView.popupViewHeight.constant = CGFloat(count * 75) + UIView.animate(withDuration: self.albumPopView.show ? 0.1:0) { + self.albumPopView.popupView.frame = frame + self.albumPopView.setNeedsLayout() + } + self.albumPopView.tableView.reloadData() + self.albumPopView.setupPopupFrame() + } + + private func registerChangeObserver() { + PHPhotoLibrary.shared().register(self) + } + + private func getfocusedIndex() -> Int { + guard let focused = self.focusedCollection, let result = self.collections.firstIndex(where: { $0 == focused }) else { return 0 } + return result + } + + private func getCollection(section: Int) -> PHAssetCollection? { + guard section < self.collections.count else { + return nil + } + return self.collections[section].phAssetCollection + } + + private func focused(collection: TLAssetsCollection) { + func resetRequest() { + cancelAllImageAssets() + } + resetRequest() + self.collections[getfocusedIndex()].recentPosition = self.collectionView.contentOffset + var reloadIndexPaths = [IndexPath(row: getfocusedIndex(), section: 0)] + self.focusedCollection = collection + self.focusedCollection?.fetchResult = self.photoLibrary.fetchResult(collection: collection, configure: self.configure) + reloadIndexPaths.append(IndexPath(row: getfocusedIndex(), section: 0)) + self.albumPopView.tableView.reloadRows(at: reloadIndexPaths, with: .none) + self.albumPopView.show(false, duration: self.configure.popup.duration) + self.updateTitle() + self.reloadCollectionView() + self.collectionView.contentOffset = collection.recentPosition + } + + private func cancelAllImageAssets() { + self.requestIDs.forEach{ (indexPath, requestID) in + self.photoLibrary.cancelPHImageRequest(requestID: requestID) + } + self.requestIDs.removeAll() + } + + // User Action + @objc func titleTap() { + guard collections.count > 0 else { return } + self.albumPopView.show(self.albumPopView.isHidden, duration: self.configure.popup.duration) + } + + @IBAction open func cancelButtonTap() { + self.stopPlay() + self.dismiss(done: false) + } + + @IBAction open func doneButtonTap() { + self.stopPlay() + self.dismiss(done: true) + } + + @IBAction open func limitButtonTap() { + if #available(iOS 14.0, *) { + PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: self) + } + } + + private func dismiss(done: Bool) { + var shouldDismiss = true + if done { + #if swift(>=4.1) + self.delegate?.dismissPhotoPicker(withPHAssets: self.selectedAssets.compactMap{ $0.phAsset }) + #else + self.delegate?.dismissPhotoPicker(withPHAssets: self.selectedAssets.flatMap{ $0.phAsset }) + #endif + self.delegate?.dismissPhotoPicker(withTLPHAssets: self.selectedAssets) + shouldDismiss = self.delegate?.shouldDismissPhotoPicker(withTLPHAssets: self.selectedAssets) ?? true + self.completionWithTLPHAssets?(self.selectedAssets) + #if swift(>=4.1) + self.completionWithPHAssets?(self.selectedAssets.compactMap{ $0.phAsset }) + #else + self.completionWithPHAssets?(self.selectedAssets.flatMap{ $0.phAsset }) + #endif + }else { + self.delegate?.photoPickerDidCancel() + self.didCancel?() + } + if shouldDismiss { + self.dismiss(animated: true) { [weak self] in + self?.delegate?.dismissComplete() + self?.dismissCompletion?() + } + } + } + + private func canSelect(phAsset: PHAsset) -> Bool { + if let closure = self.canSelectAsset { + return closure(phAsset) + }else if let delegate = self.delegate { + return delegate.canSelectAsset(phAsset: phAsset) + } + return true + } + + private func focusFirstCollection() { + if self.focusedCollection == nil, let collection = self.collections.first { + self.focusedCollection = collection + self.updateTitle() + self.reloadCollectionView() + } + } +} + +// MARK: - TLPhotoLibraryDelegate +extension TLPhotosPickerViewController: TLPhotoLibraryDelegate { + func loadCameraRollCollection(collection: TLAssetsCollection) { + self.collections = [collection] + self.focusFirstCollection() + self.indicator.stopAnimating() + self.reloadTableView() + } + + func loadCompleteAllCollection(collections: [TLAssetsCollection]) { + self.collections = collections + self.focusFirstCollection() + let isEmpty = self.collections.count == 0 + self.subTitleStackView.isHidden = isEmpty + self.emptyView.isHidden = !isEmpty + self.emptyImageView.isHidden = self.emptyImageView.image == nil + self.indicator.stopAnimating() + self.reloadTableView() + self.registerChangeObserver() + } +} + +// MARK: - Camera Picker +extension TLPhotosPickerViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { + private func showCameraIfAuthorized() { + let cameraAuthorization = AVCaptureDevice.authorizationStatus(for: .video) + switch cameraAuthorization { + case .authorized: + self.showCamera() + case .notDetermined: + AVCaptureDevice.requestAccess(for: .video, completionHandler: { [weak self] (authorized) in + DispatchQueue.main.async { [weak self] in + if authorized { + self?.showCamera() + } else { + self?.handleDeniedCameraAuthorization() + } + } + }) + case .restricted, .denied: + self.handleDeniedCameraAuthorization() + @unknown default: + break + } + } + + private func showCamera() { + guard !maxCheck() else { return } + let picker = UIImagePickerController() + picker.sourceType = .camera + var mediaTypes: [String] = [] + if self.configure.allowedPhotograph { + mediaTypes.append(kUTTypeImage as String) + } + if self.configure.allowedVideoRecording { + mediaTypes.append(kUTTypeMovie as String) + picker.videoQuality = self.configure.recordingVideoQuality + if let duration = self.configure.maxVideoDuration { + picker.videoMaximumDuration = duration + } + } + guard mediaTypes.count > 0 else { + return + } + picker.cameraDevice = configure.defaultToFrontFacingCamera ? .front : .rear + picker.mediaTypes = mediaTypes + picker.allowsEditing = false + picker.delegate = self + + // if user is on ipad using split view controller, present picker as popover + if UIDevice.current.userInterfaceIdiom == .pad { + picker.modalPresentationStyle = .popover + picker.popoverPresentationController?.sourceView = view + picker.popoverPresentationController?.sourceRect = .zero + } + + self.present(picker, animated: true, completion: nil) + } + + private func handleDeniedAlbumsAuthorization() { + DispatchQueue.main.async { + self.delegate?.handleNoAlbumPermissions(picker: self) + self.handleNoAlbumPermissions?(self) + } + } + + private func handleDeniedCameraAuthorization() { + DispatchQueue.main.async { + self.delegate?.handleNoCameraPermissions(picker: self) + self.handleNoCameraPermissions?(self) + } + } + + open func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { + picker.dismiss(animated: true, completion: nil) + } + + open func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { + if let image = (info[.originalImage] as? UIImage) { + var placeholderAsset: PHObjectPlaceholder? = nil + PHPhotoLibrary.shared().performChanges({ + let newAssetRequest = PHAssetChangeRequest.creationRequestForAsset(from: image) + placeholderAsset = newAssetRequest.placeholderForCreatedAsset + }, completionHandler: { [weak self] (success, error) in + guard self?.maxCheck() == false else { return } + if success, let `self` = self, let identifier = placeholderAsset?.localIdentifier { + guard let asset = PHAsset.fetchAssets(withLocalIdentifiers: [identifier], options: nil).firstObject, + self.canSelect(phAsset: asset) else { return } + var result = TLPHAsset(asset: asset) + result.selectedOrder = self.selectedAssets.count + 1 + result.isSelectedFromCamera = true + self.selectedAssets.append(result) + self.logDelegate?.selectedPhoto(picker: self, at: 1) + } + }) + } + else if (info[.mediaType] as? String) == kUTTypeMovie as String { + var placeholderAsset: PHObjectPlaceholder? = nil + PHPhotoLibrary.shared().performChanges({ + let newAssetRequest = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: info[.mediaURL] as! URL) + placeholderAsset = newAssetRequest?.placeholderForCreatedAsset + }) { [weak self] (sucess, error) in + guard self?.maxCheck() == false else { return } + if sucess, let `self` = self, let identifier = placeholderAsset?.localIdentifier { + guard let asset = PHAsset.fetchAssets(withLocalIdentifiers: [identifier], options: nil).firstObject, + self.canSelect(phAsset: asset) else { return } + var result = TLPHAsset(asset: asset) + result.selectedOrder = self.selectedAssets.count + 1 + result.isSelectedFromCamera = true + self.selectedAssets.append(result) + self.logDelegate?.selectedPhoto(picker: self, at: 1) + } + } + } + + picker.dismiss(animated: true, completion: nil) + } +} + +// MARK: - UICollectionView Scroll Delegate +extension TLPhotosPickerViewController { + open func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + if !decelerate { + videoCheck() + } + } + + open func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + videoCheck() + } + + private func videoCheck() { + func play(asset: (IndexPath,TLPHAsset)) { + if self.playRequestID?.indexPath != asset.0 { + playVideo(asset: asset.1, indexPath: asset.0) + } + } + guard self.configure.autoPlay else { return } + guard self.playRequestID == nil else { return } + let visibleIndexPaths = self.collectionView.indexPathsForVisibleItems.sorted(by: { $0.row < $1.row }) + #if swift(>=4.1) + let boundAssets = visibleIndexPaths.compactMap{ indexPath -> (IndexPath,TLPHAsset)? in + guard let asset = self.focusedCollection?.getTLAsset(at: indexPath), asset.phAsset?.mediaType == .video else { return nil } + return (indexPath,asset) + } + #else + let boundAssets = visibleIndexPaths.flatMap{ indexPath -> (IndexPath,TLPHAsset)? in + guard let asset = self.focusedCollection?.getTLAsset(at: indexPath.row),asset.phAsset?.mediaType == .video else { return nil } + return (indexPath,asset) + } + #endif + if let firstSelectedVideoAsset = (boundAssets.filter{ getSelectedAssets($0.1) != nil }.first) { + play(asset: firstSelectedVideoAsset) + }else if let firstVideoAsset = boundAssets.first { + play(asset: firstVideoAsset) + } + + } +} +// MARK: - Video & LivePhotos Control PHLivePhotoViewDelegate +extension TLPhotosPickerViewController: PHLivePhotoViewDelegate { + private func stopPlay() { + guard let playRequest = self.playRequestID else { return } + self.playRequestID = nil + guard let cell = self.collectionView.cellForItem(at: playRequest.indexPath) as? TLPhotoCollectionViewCell else { return } + cell.stopPlay() + } + + private func playVideo(asset: TLPHAsset, indexPath: IndexPath) { + stopPlay() + guard let phAsset = asset.phAsset else { return } + if asset.type == .video { + guard let cell = self.collectionView.cellForItem(at: indexPath) as? TLPhotoCollectionViewCell else { return } + let requestID = self.photoLibrary.videoAsset(asset: phAsset, completionBlock: { (playerItem, info) in + DispatchQueue.main.async { [weak self, weak cell] in + guard let `self` = self, let cell = cell, cell.player == nil else { return } + let player = AVPlayer(playerItem: playerItem) + cell.player = player + player.play() + player.isMuted = self.configure.muteAudio + } + }) + if requestID > 0 { + self.playRequestID = (indexPath,requestID) + } + }else if asset.type == .livePhoto && self.allowedLivePhotos { + guard let cell = self.collectionView.cellForItem(at: indexPath) as? TLPhotoCollectionViewCell else { return } + let requestID = self.photoLibrary.livePhotoAsset(asset: phAsset, size: self.thumbnailSize, completionBlock: { [weak cell] (livePhoto,complete) in + cell?.livePhotoView?.isHidden = false + cell?.livePhotoView?.livePhoto = livePhoto + cell?.livePhotoView?.isMuted = true + cell?.livePhotoView?.startPlayback(with: self.configure.startplayBack) + }) + if requestID > 0 { + self.playRequestID = (indexPath,requestID) + } + } + } + + public func livePhotoView(_ livePhotoView: PHLivePhotoView, didEndPlaybackWith playbackStyle: PHLivePhotoViewPlaybackStyle) { + livePhotoView.isMuted = true + livePhotoView.startPlayback(with: self.configure.startplayBack) + } + + public func livePhotoView(_ livePhotoView: PHLivePhotoView, willBeginPlaybackWith playbackStyle: PHLivePhotoViewPlaybackStyle) { + } +} + +// MARK: - PHPhotoLibraryChangeObserver +extension TLPhotosPickerViewController: PHPhotoLibraryChangeObserver { + private func getChanges(_ changeInstance: PHChange) -> PHFetchResultChangeDetails<PHAsset>? { + func isChangesCount<T>(changeDetails: PHFetchResultChangeDetails<T>?) -> Bool { + guard let changeDetails = changeDetails else { + return false + } + let before = changeDetails.fetchResultBeforeChanges.count + let after = changeDetails.fetchResultAfterChanges.count + return before != after + } + + func isAlbumsChanges() -> Bool { + guard let albums = self.photoLibrary.albums else { + return false + } + let changeDetails = changeInstance.changeDetails(for: albums) + return isChangesCount(changeDetails: changeDetails) + } + + func isCollectionsChanges() -> Bool { + for fetchResultCollection in self.photoLibrary.assetCollections { + let changeDetails = changeInstance.changeDetails(for: fetchResultCollection) + if isChangesCount(changeDetails: changeDetails) == true { + return true + } + } + return false + } + + if isAlbumsChanges() || isCollectionsChanges() { + DispatchQueue.main.async { + self.albumPopView.show(false, duration: self.configure.popup.duration) + self.photoLibrary.fetchCollection(configure: self.configure) + } + return nil + }else { + guard let changeFetchResult = self.focusedCollection?.fetchResult else { return nil } + guard let changes = changeInstance.changeDetails(for: changeFetchResult) else { return nil } + return changes + } + } + + public func photoLibraryDidChange(_ changeInstance: PHChange) { + var addIndex = 0 + if getfocusedIndex() == 0 { + addIndex = self.usedCameraButton ? 1 : 0 + } + DispatchQueue.main.async { + guard let changes = self.getChanges(changeInstance) else { + return + } + + if changes.hasIncrementalChanges, self.configure.groupByFetch == nil { + var deletedSelectedAssets = false + var order = 0 + #if swift(>=4.1) + self.selectedAssets = self.selectedAssets.enumerated().compactMap({ (offset,asset) -> TLPHAsset? in + var asset = asset + if let phAsset = asset.phAsset, changes.fetchResultAfterChanges.contains(phAsset) { + order += 1 + asset.selectedOrder = order + return asset + } + deletedSelectedAssets = true + return nil + }) + #else + self.selectedAssets = self.selectedAssets.enumerated().flatMap({ (offset,asset) -> TLPHAsset? in + var asset = asset + if let phAsset = asset.phAsset, changes.fetchResultAfterChanges.contains(phAsset) { + order += 1 + asset.selectedOrder = order + return asset + } + deletedSelectedAssets = true + return nil + }) + #endif + if deletedSelectedAssets { + self.focusedCollection?.fetchResult = changes.fetchResultAfterChanges + self.reloadCollectionView() + }else { + self.collectionView.performBatchUpdates({ [weak self] in + guard let `self` = self else { return } + self.focusedCollection?.fetchResult = changes.fetchResultAfterChanges + if let removed = changes.removedIndexes, removed.count > 0 { + self.collectionView.deleteItems(at: removed.map { IndexPath(item: $0+addIndex, section:0) }) + } + if let inserted = changes.insertedIndexes, inserted.count > 0 { + self.collectionView.insertItems(at: inserted.map { IndexPath(item: $0+addIndex, section:0) }) + } + changes.enumerateMoves { fromIndex, toIndex in + self.collectionView.moveItem(at: IndexPath(item: fromIndex, section: 0), + to: IndexPath(item: toIndex, section: 0)) + } + }, completion: { [weak self] (completed) in + guard let `self` = self else { return } + if completed { + if let changed = changes.changedIndexes, changed.count > 0 { + self.collectionView.reloadItems(at: changed.map { IndexPath(item: $0+addIndex, section:0) }) + } + } + }) + } + }else { + self.focusedCollection?.fetchResult = changes.fetchResultAfterChanges + self.reloadCollectionView() + } + if let collection = self.focusedCollection { + self.collections[self.getfocusedIndex()] = collection + self.albumPopView.tableView.reloadRows(at: [IndexPath(row: self.getfocusedIndex(), section: 0)], with: .none) + } + } + } +} + +// MARK: - UICollectionView delegate & datasource +extension TLPhotosPickerViewController: UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDataSourcePrefetching { + private func getSelectedAssets(_ asset: TLPHAsset) -> TLPHAsset? { + if let index = self.selectedAssets.firstIndex(where: { $0.phAsset == asset.phAsset }) { + return self.selectedAssets[index] + } + return nil + } + + private func orderUpdateCells() { + let visibleIndexPaths = self.collectionView.indexPathsForVisibleItems.sorted(by: { $0.row < $1.row }) + for indexPath in visibleIndexPaths { + guard let cell = self.collectionView.cellForItem(at: indexPath) as? TLPhotoCollectionViewCell else { continue } + guard let asset = self.focusedCollection?.getTLAsset(at: indexPath) else { continue } + if let selectedAsset = getSelectedAssets(asset) { + cell.selectedAsset = true + cell.orderLabel?.text = "\(selectedAsset.selectedOrder)" + }else { + cell.selectedAsset = false + } + } + } + + //Delegate + open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard let collection = self.focusedCollection, let cell = self.collectionView.cellForItem(at: indexPath) as? TLPhotoCollectionViewCell else { return } + + let isCameraRow = collection.useCameraButton && indexPath.section == 0 && indexPath.row == 0 + + if isCameraRow { + selectCameraCell(cell) + return + } + + toggleSelection(for: cell, at: indexPath) + } + + open func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { + if let cell = cell as? TLPhotoCollectionViewCell { + cell.endDisplayingCell() + cell.stopPlay() + if indexPath == self.playRequestID?.indexPath { + self.playRequestID = nil + } + } + guard let requestID = self.requestIDs[indexPath] else { return } + self.requestIDs.removeValue(forKey: indexPath) + self.photoLibrary.cancelPHImageRequest(requestID: requestID) + } + + //Datasource + open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + func makeCell(nibName: String) -> TLPhotoCollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: nibName, for: indexPath) as! TLPhotoCollectionViewCell + cell.configure = self.configure + cell.imageView?.image = self.placeholderThumbnail + cell.liveBadgeImageView?.image = nil + return cell + } + let nibName = self.configure.nibSet?.nibName ?? "TLPhotoCollectionViewCell" + var cell = makeCell(nibName: nibName) + guard let collection = self.focusedCollection else { return cell } + cell.isCameraCell = collection.useCameraButton && indexPath.section == 0 && indexPath.row == 0 + if cell.isCameraCell { + if let nibName = self.configure.cameraCellNibSet?.nibName { + cell = makeCell(nibName: nibName) + }else{ + cell.imageView?.image = self.cameraImage + } + return cell + } + guard let asset = collection.getTLAsset(at: indexPath) else { return cell } + + cell.asset = asset.phAsset + + if let selectedAsset = getSelectedAssets(asset) { + cell.selectedAsset = true + cell.orderLabel?.text = "\(selectedAsset.selectedOrder)" + }else{ + cell.selectedAsset = false + } + if asset.state == .progress { + cell.indicator?.startAnimating() + }else { + cell.indicator?.stopAnimating() + } + if let phAsset = asset.phAsset { + if self.usedPrefetch { + let options = PHImageRequestOptions() + options.deliveryMode = .opportunistic + options.resizeMode = .exact + options.isNetworkAccessAllowed = true + let requestID = self.photoLibrary.imageAsset(asset: phAsset, size: self.thumbnailSize, options: options) { [weak self, weak cell] (image,complete) in + guard let `self` = self else { return } + DispatchQueue.main.async { + if self.requestIDs[indexPath] != nil { + cell?.imageView?.image = image + cell?.update(with: phAsset) + if self.allowedVideo { + cell?.durationView?.isHidden = asset.type != .video + cell?.duration = asset.type == .video ? phAsset.duration : nil + } + if complete { + self.requestIDs.removeValue(forKey: indexPath) + } + } + } + } + if requestID > 0 { + self.requestIDs[indexPath] = requestID + } + }else { + queue.async { [weak self, weak cell] in + guard let `self` = self else { return } + let requestID = self.photoLibrary.imageAsset(asset: phAsset, size: self.thumbnailSize, completionBlock: { (image,complete) in + DispatchQueue.main.async { + if self.requestIDs[indexPath] != nil { + cell?.imageView?.image = image + cell?.update(with: phAsset) + if self.allowedVideo { + cell?.durationView?.isHidden = asset.type != .video + cell?.duration = asset.type == .video ? phAsset.duration : nil + } + if complete { + self.requestIDs.removeValue(forKey: indexPath) + } + } + } + }) + if requestID > 0 { + self.requestIDs[indexPath] = requestID + } + } + } + if self.allowedLivePhotos { + cell.liveBadgeImageView?.image = asset.type == .livePhoto ? PHLivePhotoView.livePhotoBadgeImage(options: .overContent) : nil + cell.livePhotoView?.delegate = asset.type == .livePhoto ? self : nil + } + } + cell.alpha = 0 + UIView.transition(with: cell, duration: 0.1, options: .curveEaseIn, animations: { + cell.alpha = 1 + }, completion: nil) + return cell + } + + open func numberOfSections(in collectionView: UICollectionView) -> Int { + return self.focusedCollection?.sections?.count ?? 1 + } + + open func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + guard let collection = self.focusedCollection else { + return 0 + } + return self.focusedCollection?.sections?[safe: section]?.assets.count ?? collection.count + } + + //Prefetch + open func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) { + if self.usedPrefetch { + queue.async { [weak self] in + guard let `self` = self, let collection = self.focusedCollection else { return } + var assets = [PHAsset]() + for indexPath in indexPaths { + if let asset = collection.getAsset(at: indexPath.row) { + assets.append(asset) + } + } + let scale = max(UIScreen.main.scale,2) + let targetSize = CGSize(width: self.thumbnailSize.width*scale, height: self.thumbnailSize.height*scale) + self.photoLibrary.imageManager.startCachingImages(for: assets, targetSize: targetSize, contentMode: .aspectFill, options: nil) + } + } + } + + open func collectionView(_ collectionView: UICollectionView, cancelPrefetchingForItemsAt indexPaths: [IndexPath]) { + if self.usedPrefetch { + for indexPath in indexPaths { + guard let requestID = self.requestIDs[indexPath] else { continue } + self.photoLibrary.cancelPHImageRequest(requestID: requestID) + self.requestIDs.removeValue(forKey: indexPath) + } + queue.async { [weak self] in + guard let `self` = self, let collection = self.focusedCollection else { return } + var assets = [PHAsset]() + for indexPath in indexPaths { + if let asset = collection.getAsset(at: indexPath.row) { + assets.append(asset) + } + } + let scale = max(UIScreen.main.scale,2) + let targetSize = CGSize(width: self.thumbnailSize.width*scale, height: self.thumbnailSize.height*scale) + self.photoLibrary.imageManager.stopCachingImages(for: assets, targetSize: targetSize, contentMode: .aspectFill, options: nil) + } + } + } + + public func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { + guard let cell = cell as? TLPhotoCollectionViewCell else { + return + } + cell.willDisplayCell() + if self.usedPrefetch, let collection = self.focusedCollection, let asset = collection.getTLAsset(at: indexPath) { + if let selectedAsset = getSelectedAssets(asset) { + cell.selectedAsset = true + cell.orderLabel?.text = "\(selectedAsset.selectedOrder)" + }else{ + cell.selectedAsset = false + } + } + } +} + +// MARK: - CustomDataSources for supplementary view +extension TLPhotosPickerViewController: UICollectionViewDelegateFlowLayout { + open func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { + guard let identifier = self.customDataSouces?.supplementIdentifier(kind: kind) else { + return UICollectionReusableView() + } + let reuseView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, + withReuseIdentifier: identifier, + for: indexPath) + if let section = self.focusedCollection?.sections?[safe: indexPath.section] { + self.customDataSouces?.configure(supplement: reuseView, section: section) + } + return reuseView + } + + open func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { + if let sections = self.focusedCollection?.sections?[safe: section], sections.title != "camera" { + return self.customDataSouces?.headerReferenceSize() ?? CGSize.zero + } + return CGSize.zero + } + + open func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize { + if let sections = self.focusedCollection?.sections?[safe: section], sections.title != "camera" { + return self.customDataSouces?.footerReferenceSize() ?? CGSize.zero + } + return CGSize.zero + } +} + +// MARK: - UITableView datasource & delegate +extension TLPhotosPickerViewController: UITableViewDelegate, UITableViewDataSource { + //delegate + open func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + self.logDelegate?.selectedAlbum(picker: self, title: self.collections[indexPath.row].title, at: indexPath.row) + self.focused(collection: self.collections[indexPath.row]) + } + + //datasource + open func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + open func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.collections.count + } + + open func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "TLCollectionTableViewCell", for: indexPath) as! TLCollectionTableViewCell + let collection = self.collections[indexPath.row] + cell.titleLabel.text = collection.title + cell.subTitleLabel.text = "\(collection.fetchResult?.count ?? 0)" + if let phAsset = collection.getAsset(at: collection.useCameraButton ? 1 : 0) { + let scale = UIScreen.main.scale + let size = CGSize(width: 80*scale, height: 80*scale) + self.photoLibrary.imageAsset(asset: phAsset, size: size, completionBlock: { (image,complete) in + DispatchQueue.main.async { + if let cell = tableView.cellForRow(at: indexPath) as? TLCollectionTableViewCell { + cell.thumbImageView.image = image + } + } + }) + } + cell.accessoryType = getfocusedIndex() == indexPath.row ? .checkmark : .none + cell.selectionStyle = .none + return cell + } +} + +// MARK: - UIViewControllerPreviewingDelegate +extension TLPhotosPickerViewController: UIViewControllerPreviewingDelegate { + public func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { + guard self.previewAtForceTouch == true else { return nil } + guard let pressingIndexPath = collectionView.indexPathForItem(at: location) else { return nil } + guard let pressingCell = collectionView.cellForItem(at: pressingIndexPath) as? TLPhotoCollectionViewCell else { return nil } + + previewingContext.sourceRect = pressingCell.frame + let previewController = TLAssetPreviewViewController() + previewController.asset = pressingCell.asset + + return previewController + } + + public func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {} + + @available(iOS 13.0, *) + public func collectionView(_ collectionView: UICollectionView, contextMenuConfigurationForItemAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { + guard self.previewAtForceTouch == true else { return nil } + guard let cell = collectionView.cellForItem(at: indexPath) as? TLPhotoCollectionViewCell else { return nil } + + return UIContextMenuConfiguration(identifier: nil, previewProvider: { + let previewController = TLAssetPreviewViewController() + previewController.asset = cell.asset + return previewController + + }, actionProvider: { [weak self] suggestedActions in + guard let self = self else { return nil } + let isSelected = cell.selectedAsset + let title = isSelected ? self.configure.deselectMessage : self.configure.selectMessage + let imageName = isSelected ? "checkmark.circle" : "circle" + let toggleSelection = UIAction(title: title, image: UIImage(systemName: imageName)) { [weak self] action in + self?.toggleSelection(for: cell, at: indexPath) + } + + return UIMenu(title: "", children: [toggleSelection]) + } + ) + } +} + +extension TLPhotosPickerViewController { + func selectCameraCell(_ cell: TLPhotoCollectionViewCell) { + if Platform.isSimulator { + print("not supported by the simulator.") + } else { + if configure.cameraCellNibSet?.nibName != nil { + cell.selectedCell() + } else { + showCameraIfAuthorized() + } + logDelegate?.selectedCameraCell(picker: self) + } + } + + func toggleSelection(for cell: TLPhotoCollectionViewCell, at indexPath: IndexPath) { + guard let collection = focusedCollection, var asset = collection.getTLAsset(at: indexPath), let phAsset = asset.phAsset else { return } + + cell.popScaleAnim() + + if let index = selectedAssets.firstIndex(where: { $0.phAsset == asset.phAsset }) { + //deselect + logDelegate?.deselectedPhoto(picker: self, at: indexPath.row) + selectedAssets.remove(at: index) + #if swift(>=4.1) + selectedAssets = selectedAssets.enumerated().compactMap({ (offset,asset) -> TLPHAsset? in + var asset = asset + asset.selectedOrder = offset + 1 + return asset + }) + #else + selectedAssets = selectedAssets.enumerated().flatMap({ (offset,asset) -> TLPHAsset? in + var asset = asset + asset.selectedOrder = offset + 1 + return asset + }) + #endif + cell.selectedAsset = false + cell.stopPlay() + orderUpdateCells() + if playRequestID?.indexPath == indexPath { + stopPlay() + } + } else { + //select + logDelegate?.selectedPhoto(picker: self, at: indexPath.row) + guard !maxCheck(), canSelect(phAsset: phAsset) else { return } + + asset.selectedOrder = selectedAssets.count + 1 + selectedAssets.append(asset) + cell.selectedAsset = true + cell.orderLabel?.text = "\(asset.selectedOrder)" + + if asset.type != .photo, configure.autoPlay { + playVideo(asset: asset, indexPath: indexPath) + } + } + + } +} + +extension TLPhotosPickerViewController: UINavigationBarDelegate { + public func position(for bar: UIBarPositioning) -> UIBarPosition { + return .topAttached + } +} + +extension Array where Element == PopupConfigure { + var duration: TimeInterval { + var result: TimeInterval = 0.1 + forEach { + if case let .animation(duration) = $0 { + result = duration + } + } + return result + } +} + +extension UIImage { + public func colorMask(color:UIColor) -> UIImage { + var result: UIImage? + let rect = CGRect(x:0, y:0, width:size.width, height:size.height) + UIGraphicsBeginImageContextWithOptions(rect.size, false, scale) + if let c = UIGraphicsGetCurrentContext() { + self.draw(in: rect) + c.setFillColor(color.cgColor) + c.setBlendMode(.sourceAtop) + c.fill(rect) + result = UIGraphicsGetImageFromCurrentImageContext() + } + UIGraphicsEndImageContext() + return result ?? self + } +} diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotosPickerViewController.xib b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotosPickerViewController.xib new file mode 100644 index 0000000000000000000000000000000000000000..d98af0cbee9d87ddb7a7ca7a651bc2c9f46e11f6 --- /dev/null +++ b/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotosPickerViewController.xib @@ -0,0 +1,232 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> + <device id="retina4_7" orientation="portrait" appearance="light"/> + <dependencies> + <deployment identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17125"/> + <capability name="Image references" minToolsVersion="11.0"/> + <capability name="Safe area layout guides" minToolsVersion="9.0"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <objects> + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TLPhotosPickerViewController" customModule="TLPhotoPicker"> + <connections> + <outlet property="albumPopView" destination="Jcn-hC-Umh" id="c3n-m9-wfd"/> + <outlet property="cancelButton" destination="sqJ-Z7-zxj" id="J6u-hz-ePK"/> + <outlet property="collectionView" destination="4gR-Bn-quP" id="ZOF-qU-cpd"/> + <outlet property="customNavItem" destination="5CU-MZ-p1K" id="ih7-d3-nco"/> + <outlet property="doneButton" destination="daA-Ag-vVv" id="P53-fy-Sbh"/> + <outlet property="emptyImageView" destination="YDZ-o1-AXT" id="TVN-0v-aQc"/> + <outlet property="emptyMessageLabel" destination="7qj-q4-rHC" id="Bcp-Hu-lEY"/> + <outlet property="emptyView" destination="HPm-Vc-F86" id="4FT-XL-9ql"/> + <outlet property="indicator" destination="AEv-G6-dRI" id="coA-3n-07e"/> + <outlet property="navigationBar" destination="X8O-Gg-slz" id="Sp9-g1-r4y"/> + <outlet property="navigationBarTopConstraint" destination="IKp-hS-tTy" id="MFH-eP-0tb"/> + <outlet property="photosButton" destination="spQ-SO-lth" id="Vy3-rM-vY9"/> + <outlet property="popArrowImageView" destination="5zn-je-qLx" id="6k9-cH-vcU"/> + <outlet property="subTitleArrowImageView" destination="b7w-7R-rco" id="IjY-7S-Zz1"/> + <outlet property="subTitleLabel" destination="DON-iU-Cox" id="ZyB-O9-EcR"/> + <outlet property="subTitleStackView" destination="kgt-Cn-AXg" id="Vcc-hP-iqe"/> + <outlet property="titleLabel" destination="xuG-bc-Oq9" id="2o0-aN-au6"/> + <outlet property="titleView" destination="VAz-Py-dsa" id="deY-US-9Jh"/> + <outlet property="view" destination="Zyk-dI-msE" id="dxK-gh-unF"/> + </connections> + </placeholder> + <barButtonItem title="photo" id="spQ-SO-lth"> + <imageReference key="image" image="photo" catalog="system" symbolScale="small"/> + <connections> + <action selector="limitButtonTap" destination="-1" id="VRo-CG-wO6"/> + </connections> + </barButtonItem> + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> + <view contentMode="scaleToFill" id="Zyk-dI-msE"> + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <navigationBar contentMode="scaleToFill" translucent="NO" translatesAutoresizingMaskIntoConstraints="NO" id="X8O-Gg-slz"> + <rect key="frame" x="0.0" y="0.0" width="375" height="44"/> + <items> + <navigationItem id="5CU-MZ-p1K"> + <nil key="title"/> + <barButtonItem key="leftBarButtonItem" title="Cancel" id="sqJ-Z7-zxj"> + <connections> + <action selector="cancelButtonTap" destination="-1" id="dm0-Ur-I5r"/> + </connections> + </barButtonItem> + <view key="titleView" contentMode="scaleToFill" id="VAz-Py-dsa"> + <rect key="frame" x="100.5" y="0.0" width="174.5" height="44"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> + <subviews> + <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="Ql8-7f-9Uk"> + <rect key="frame" x="0.0" y="0.0" width="174.5" height="44"/> + <subviews> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xuG-bc-Oq9"> + <rect key="frame" x="66.5" y="0.0" width="41.5" height="19.5"/> + <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="kgt-Cn-AXg"> + <rect key="frame" x="65" y="19.5" width="44.5" height="24.5"/> + <subviews> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="DON-iU-Cox"> + <rect key="frame" x="0.0" y="5.5" width="29.5" height="13.5"/> + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="11"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="b7w-7R-rco"> + <rect key="frame" x="34.5" y="7.5" width="10" height="10"/> + <constraints> + <constraint firstAttribute="width" priority="999" constant="10" id="7bM-Da-Q8A"/> + <constraint firstAttribute="height" priority="999" constant="10" id="OHz-gp-CQp"/> + </constraints> + </imageView> + </subviews> + </stackView> + </subviews> + </stackView> + </subviews> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> + <constraints> + <constraint firstAttribute="trailing" secondItem="Ql8-7f-9Uk" secondAttribute="trailing" id="Vv5-au-j7y"/> + <constraint firstAttribute="bottom" secondItem="Ql8-7f-9Uk" secondAttribute="bottom" id="XNk-yU-iZJ"/> + <constraint firstItem="Ql8-7f-9Uk" firstAttribute="top" secondItem="VAz-Py-dsa" secondAttribute="top" id="h9o-f1-oRa"/> + <constraint firstItem="Ql8-7f-9Uk" firstAttribute="leading" secondItem="VAz-Py-dsa" secondAttribute="leading" id="j8K-5o-bAh"/> + </constraints> + </view> + <barButtonItem key="rightBarButtonItem" title="Done" id="daA-Ag-vVv"> + <connections> + <action selector="doneButtonTap" destination="-1" id="BzF-rn-rn4"/> + </connections> + </barButtonItem> + </navigationItem> + </items> + </navigationBar> + <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="4gR-Bn-quP"> + <rect key="frame" x="0.0" y="44" width="375" height="623"/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="5" minimumInteritemSpacing="5" id="VDa-Pp-VBq"> + <size key="itemSize" width="50" height="50"/> + <size key="headerReferenceSize" width="0.0" height="0.0"/> + <size key="footerReferenceSize" width="0.0" height="0.0"/> + <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/> + </collectionViewFlowLayout> + <connections> + <outlet property="dataSource" destination="-1" id="6fE-SF-z6F"/> + <outlet property="delegate" destination="-1" id="pjZ-sM-fyY"/> + </connections> + </collectionView> + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="HPm-Vc-F86"> + <rect key="frame" x="0.0" y="44" width="375" height="623"/> + <subviews> + <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="gi6-Sw-3Zf"> + <rect key="frame" x="137.5" y="249" width="100" height="125.5"/> + <subviews> + <imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="YDZ-o1-AXT"> + <rect key="frame" x="0.0" y="0.0" width="100" height="100"/> + <constraints> + <constraint firstAttribute="width" priority="999" constant="100" id="VUj-VB-7Kr"/> + <constraint firstAttribute="height" priority="999" constant="100" id="jBo-WN-gZr"/> + </constraints> + </imageView> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7qj-q4-rHC"> + <rect key="frame" x="29.5" y="105" width="41.5" height="20.5"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + </subviews> + </stackView> + </subviews> + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + <constraints> + <constraint firstItem="gi6-Sw-3Zf" firstAttribute="centerX" secondItem="HPm-Vc-F86" secondAttribute="centerX" id="FpA-96-esN"/> + <constraint firstItem="gi6-Sw-3Zf" firstAttribute="centerY" secondItem="HPm-Vc-F86" secondAttribute="centerY" id="L0c-BG-65l"/> + </constraints> + </view> + <activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="AEv-G6-dRI"> + <rect key="frame" x="177.5" y="323.5" width="20" height="20"/> + </activityIndicatorView> + <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Jcn-hC-Umh" customClass="TLAlbumPopView" customModule="TLPhotoPicker"> + <rect key="frame" x="0.0" y="44" width="375" height="623"/> + <subviews> + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GKD-We-AdT"> + <rect key="frame" x="0.0" y="0.0" width="375" height="623"/> + <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.29999999999999999" colorSpace="calibratedRGB"/> + </view> + <view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="eL2-gJ-b87"> + <rect key="frame" x="1" y="17" width="373" height="130"/> + <subviews> + <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" style="plain" separatorStyle="default" rowHeight="75" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="grw-Nk-Sxr"> + <rect key="frame" x="0.0" y="0.0" width="373" height="130"/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + </tableView> + </subviews> + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <constraints> + <constraint firstItem="grw-Nk-Sxr" firstAttribute="top" secondItem="eL2-gJ-b87" secondAttribute="top" id="DAx-an-6Qt"/> + <constraint firstAttribute="height" constant="130" id="cet-yf-3jU"/> + <constraint firstAttribute="trailing" secondItem="grw-Nk-Sxr" secondAttribute="trailing" id="nM5-IG-MPJ"/> + <constraint firstItem="grw-Nk-Sxr" firstAttribute="leading" secondItem="eL2-gJ-b87" secondAttribute="leading" id="o4b-cS-L3T"/> + <constraint firstAttribute="bottom" secondItem="grw-Nk-Sxr" secondAttribute="bottom" id="sPK-1G-qLo"/> + </constraints> + </view> + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="5zn-je-qLx"> + <rect key="frame" x="180.5" y="10" width="14" height="7"/> + <constraints> + <constraint firstAttribute="height" constant="7" id="eZN-nB-EHu"/> + <constraint firstAttribute="width" constant="14" id="hWo-ji-iBX"/> + </constraints> + </imageView> + </subviews> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> + <constraints> + <constraint firstItem="GKD-We-AdT" firstAttribute="top" secondItem="Jcn-hC-Umh" secondAttribute="top" id="83h-bg-tAJ"/> + <constraint firstAttribute="trailing" secondItem="eL2-gJ-b87" secondAttribute="trailing" constant="1" id="IMh-Wh-897"/> + <constraint firstItem="5zn-je-qLx" firstAttribute="centerX" secondItem="Jcn-hC-Umh" secondAttribute="centerX" id="LpE-mT-MxA"/> + <constraint firstItem="eL2-gJ-b87" firstAttribute="top" secondItem="Jcn-hC-Umh" secondAttribute="top" constant="17" id="XtI-9R-CFm"/> + <constraint firstItem="GKD-We-AdT" firstAttribute="leading" secondItem="Jcn-hC-Umh" secondAttribute="leading" id="krq-3L-sxU"/> + <constraint firstItem="eL2-gJ-b87" firstAttribute="top" secondItem="5zn-je-qLx" secondAttribute="bottom" id="tM4-Tb-JsI"/> + <constraint firstItem="eL2-gJ-b87" firstAttribute="leading" secondItem="Jcn-hC-Umh" secondAttribute="leading" constant="1" id="v5O-lt-eKe"/> + <constraint firstAttribute="bottom" secondItem="GKD-We-AdT" secondAttribute="bottom" id="x4Q-bm-MrY"/> + <constraint firstAttribute="trailing" secondItem="GKD-We-AdT" secondAttribute="trailing" id="xdF-2b-pOS"/> + </constraints> + <connections> + <outlet property="bgView" destination="GKD-We-AdT" id="ymr-tp-YBW"/> + <outlet property="popupView" destination="eL2-gJ-b87" id="xgf-xj-Rd4"/> + <outlet property="popupViewHeight" destination="cet-yf-3jU" id="OS3-MZ-s9c"/> + <outlet property="tableView" destination="grw-Nk-Sxr" id="Y3k-8m-iJp"/> + </connections> + </view> + </subviews> + <viewLayoutGuide key="safeArea" id="HLR-WT-D3I"/> + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + <constraints> + <constraint firstItem="HPm-Vc-F86" firstAttribute="bottom" secondItem="HLR-WT-D3I" secondAttribute="bottom" id="0AS-35-SWm"/> + <constraint firstItem="AEv-G6-dRI" firstAttribute="centerX" secondItem="Zyk-dI-msE" secondAttribute="centerX" id="44C-fd-MVc"/> + <constraint firstItem="X8O-Gg-slz" firstAttribute="leading" secondItem="Zyk-dI-msE" secondAttribute="leading" id="4Ud-fp-qD2"/> + <constraint firstItem="4gR-Bn-quP" firstAttribute="top" secondItem="X8O-Gg-slz" secondAttribute="bottom" id="CZx-xl-GLa"/> + <constraint firstItem="X8O-Gg-slz" firstAttribute="top" secondItem="HLR-WT-D3I" secondAttribute="top" id="IKp-hS-tTy"/> + <constraint firstItem="Jcn-hC-Umh" firstAttribute="top" secondItem="X8O-Gg-slz" secondAttribute="bottom" id="KdD-nT-6tf"/> + <constraint firstItem="HPm-Vc-F86" firstAttribute="leading" secondItem="HLR-WT-D3I" secondAttribute="leading" id="M3L-CU-HdQ"/> + <constraint firstAttribute="trailing" secondItem="4gR-Bn-quP" secondAttribute="trailing" id="M6b-2G-2m1"/> + <constraint firstAttribute="trailing" secondItem="Jcn-hC-Umh" secondAttribute="trailing" id="Njh-ZO-lnq"/> + <constraint firstAttribute="bottom" secondItem="Jcn-hC-Umh" secondAttribute="bottom" id="NxH-d8-b65"/> + <constraint firstItem="HPm-Vc-F86" firstAttribute="top" secondItem="X8O-Gg-slz" secondAttribute="bottom" id="YyG-QW-0ZP"/> + <constraint firstItem="AEv-G6-dRI" firstAttribute="centerY" secondItem="Zyk-dI-msE" secondAttribute="centerY" id="aLU-u9-ALA"/> + <constraint firstItem="Jcn-hC-Umh" firstAttribute="leading" secondItem="Zyk-dI-msE" secondAttribute="leading" id="aY7-Ml-cd3"/> + <constraint firstItem="HPm-Vc-F86" firstAttribute="trailing" secondItem="HLR-WT-D3I" secondAttribute="trailing" id="aoA-8G-xDA"/> + <constraint firstItem="4gR-Bn-quP" firstAttribute="leading" secondItem="Zyk-dI-msE" secondAttribute="leading" id="kb7-vy-yTu"/> + <constraint firstItem="4gR-Bn-quP" firstAttribute="bottom" secondItem="HLR-WT-D3I" secondAttribute="bottom" id="qqE-w2-Tsc"/> + <constraint firstAttribute="trailing" secondItem="X8O-Gg-slz" secondAttribute="trailing" id="yWV-L2-0f4"/> + </constraints> + <point key="canvasLocation" x="33.5" y="53.5"/> + </view> + </objects> + <resources> + <image name="arrow.png" width="18" height="18"/> + <image name="photo" catalog="system" width="128" height="93"/> + <image name="pop_arrow.png" width="41" height="20"/> + </resources> +</document> diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/arrow.png b/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..94910cf0960045e5764820649279ea9a89858425 Binary files /dev/null and b/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/arrow.png differ diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/camera@3x.png b/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/camera@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2c7ebe0c7cd6f9ccd69effbf7ce4e2e93da3b0da Binary files /dev/null and b/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/camera@3x.png differ diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/insertPhotoMaterial@3x.png b/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/insertPhotoMaterial@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..19a8656929646848f76a5e18066902823ea0e839 Binary files /dev/null and b/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/insertPhotoMaterial@3x.png differ diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/pop_arrow.png b/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/pop_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..220d39e6ace20809f783efcaeb74ee5adc00fd74 Binary files /dev/null and b/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/pop_arrow.png differ diff --git a/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/video.png b/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/video.png new file mode 100644 index 0000000000000000000000000000000000000000..68268fb150855c6c452665b7b72c4f1ea6f91570 Binary files /dev/null and b/Pods/TLPhotoPicker/TLPhotoPicker/TLPhotoPickerController.bundle/video.png differ diff --git a/Pods/Target Support Files/FSPagerView/FSPagerView-Info.plist b/Pods/Target Support Files/FSPagerView/FSPagerView-Info.plist deleted file mode 100644 index 582bd8b9e6e98bef807e8b2e1d9660472ce5523e..0000000000000000000000000000000000000000 --- a/Pods/Target Support Files/FSPagerView/FSPagerView-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>CFBundleDevelopmentRegion</key> - <string>${PODS_DEVELOPMENT_LANGUAGE}</string> - <key>CFBundleExecutable</key> - <string>${EXECUTABLE_NAME}</string> - <key>CFBundleIdentifier</key> - <string>${PRODUCT_BUNDLE_IDENTIFIER}</string> - <key>CFBundleInfoDictionaryVersion</key> - <string>6.0</string> - <key>CFBundleName</key> - <string>${PRODUCT_NAME}</string> - <key>CFBundlePackageType</key> - <string>FMWK</string> - <key>CFBundleShortVersionString</key> - <string>0.8.3</string> - <key>CFBundleSignature</key> - <string>????</string> - <key>CFBundleVersion</key> - <string>${CURRENT_PROJECT_VERSION}</string> - <key>NSPrincipalClass</key> - <string></string> -</dict> -</plist> diff --git a/Pods/Target Support Files/FSPagerView/FSPagerView-dummy.m b/Pods/Target Support Files/FSPagerView/FSPagerView-dummy.m deleted file mode 100644 index aea684a81a88d3c303bb9e4075ff1a52ca41ec92..0000000000000000000000000000000000000000 --- a/Pods/Target Support Files/FSPagerView/FSPagerView-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import <Foundation/Foundation.h> -@interface PodsDummy_FSPagerView : NSObject -@end -@implementation PodsDummy_FSPagerView -@end diff --git a/Pods/Target Support Files/FSPagerView/FSPagerView-prefix.pch b/Pods/Target Support Files/FSPagerView/FSPagerView-prefix.pch deleted file mode 100644 index beb2a2441835aeaf9ee2ba30c557a8f2b6e4363f..0000000000000000000000000000000000000000 --- a/Pods/Target Support Files/FSPagerView/FSPagerView-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import <UIKit/UIKit.h> -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/FSPagerView/FSPagerView-umbrella.h b/Pods/Target Support Files/FSPagerView/FSPagerView-umbrella.h deleted file mode 100644 index 474ff62f0423d854449a11843c489fc7a96521c2..0000000000000000000000000000000000000000 --- a/Pods/Target Support Files/FSPagerView/FSPagerView-umbrella.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifdef __OBJC__ -#import <UIKit/UIKit.h> -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - -#import "FSPagerViewObjcCompat.h" - -FOUNDATION_EXPORT double FSPagerViewVersionNumber; -FOUNDATION_EXPORT const unsigned char FSPagerViewVersionString[]; - diff --git a/Pods/Target Support Files/FSPagerView/FSPagerView.debug.xcconfig b/Pods/Target Support Files/FSPagerView/FSPagerView.debug.xcconfig deleted file mode 100644 index a21eb53e6fc821db715ae91ab0e8f6bd31604601..0000000000000000000000000000000000000000 --- a/Pods/Target Support Files/FSPagerView/FSPagerView.debug.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "UIKit" -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/FSPagerView -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/FSPagerView/FSPagerView.modulemap b/Pods/Target Support Files/FSPagerView/FSPagerView.modulemap deleted file mode 100644 index cd9f55016a6e28c897cad866d64743d7bd7912a7..0000000000000000000000000000000000000000 --- a/Pods/Target Support Files/FSPagerView/FSPagerView.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module FSPagerView { - umbrella header "FSPagerView-umbrella.h" - - export * - module * { export * } -} diff --git a/Pods/Target Support Files/FSPagerView/FSPagerView.release.xcconfig b/Pods/Target Support Files/FSPagerView/FSPagerView.release.xcconfig deleted file mode 100644 index a21eb53e6fc821db715ae91ab0e8f6bd31604601..0000000000000000000000000000000000000000 --- a/Pods/Target Support Files/FSPagerView/FSPagerView.release.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "UIKit" -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/FSPagerView -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-acknowledgements.markdown b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-acknowledgements.markdown index 1d538428f215764d32d7ae1a11213f10171377d3..7a6d9b50dc3fd36fa0d7a051fb16134b1c396706 100644 --- a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-acknowledgements.markdown @@ -24,29 +24,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -## FSPagerView - -Copyright (c) 2017 FSPagerView (https://github.com/WenchaoD/FSPagerView) - -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. - - ## IQKeyboardManagerSwift MIT License diff --git a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-acknowledgements.plist b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-acknowledgements.plist index 559f5313389e82840ec7e4989ebea8caa4653d14..5aa48dcae5d0aaccf508f4ff93d59fde0d6b5f5a 100644 --- a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-acknowledgements.plist @@ -41,35 +41,6 @@ THE SOFTWARE. <key>Type</key> <string>PSGroupSpecifier</string> </dict> - <dict> - <key>FooterText</key> - <string>Copyright (c) 2017 FSPagerView (https://github.com/WenchaoD/FSPagerView) - -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. -</string> - <key>License</key> - <string>MIT</string> - <key>Title</key> - <string>FSPagerView</string> - <key>Type</key> - <string>PSGroupSpecifier</string> - </dict> <dict> <key>FooterText</key> <string>MIT License diff --git a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Debug-input-files.xcfilelist index f3a68773600e951f51ad73352ff0fb01fca2b8b6..1c544dbb89b38ff93b7f6b230d3be2c4edd9ac40 100644 --- a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Debug-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Debug-input-files.xcfilelist @@ -1,6 +1,5 @@ ${PODS_ROOT}/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks.sh ${BUILT_PRODUCTS_DIR}/EPSignature/EPSignature.framework -${BUILT_PRODUCTS_DIR}/FSPagerView/FSPagerView.framework ${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework ${BUILT_PRODUCTS_DIR}/ImagePicker/ImagePicker.framework ${BUILT_PRODUCTS_DIR}/LanguageManager-iOS/LanguageManager_iOS.framework diff --git a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Debug-output-files.xcfilelist index 9369e2e68902859500f916f95510c69364b0d7c8..13e73d2912044eb4a332f7d07407e81277ba50a7 100644 --- a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Debug-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Debug-output-files.xcfilelist @@ -1,5 +1,4 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/EPSignature.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FSPagerView.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ImagePicker.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LanguageManager_iOS.framework diff --git a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Release-input-files.xcfilelist index f3a68773600e951f51ad73352ff0fb01fca2b8b6..1c544dbb89b38ff93b7f6b230d3be2c4edd9ac40 100644 --- a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Release-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Release-input-files.xcfilelist @@ -1,6 +1,5 @@ ${PODS_ROOT}/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks.sh ${BUILT_PRODUCTS_DIR}/EPSignature/EPSignature.framework -${BUILT_PRODUCTS_DIR}/FSPagerView/FSPagerView.framework ${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework ${BUILT_PRODUCTS_DIR}/ImagePicker/ImagePicker.framework ${BUILT_PRODUCTS_DIR}/LanguageManager-iOS/LanguageManager_iOS.framework diff --git a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Release-output-files.xcfilelist index 9369e2e68902859500f916f95510c69364b0d7c8..13e73d2912044eb4a332f7d07407e81277ba50a7 100644 --- a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Release-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks-Release-output-files.xcfilelist @@ -1,5 +1,4 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/EPSignature.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FSPagerView.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ImagePicker.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LanguageManager_iOS.framework diff --git a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks.sh b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks.sh index 9594529bb7fd05088430e86410ea370b8c180826..0119b9713948899315fa52be78ee6c8d781e677c 100755 --- a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks.sh +++ b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner-frameworks.sh @@ -177,7 +177,6 @@ code_sign_if_enabled() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/EPSignature/EPSignature.framework" - install_framework "${BUILT_PRODUCTS_DIR}/FSPagerView/FSPagerView.framework" install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework" install_framework "${BUILT_PRODUCTS_DIR}/ImagePicker/ImagePicker.framework" install_framework "${BUILT_PRODUCTS_DIR}/LanguageManager-iOS/LanguageManager_iOS.framework" @@ -185,7 +184,6 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/EPSignature/EPSignature.framework" - install_framework "${BUILT_PRODUCTS_DIR}/FSPagerView/FSPagerView.framework" install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework" install_framework "${BUILT_PRODUCTS_DIR}/ImagePicker/ImagePicker.framework" install_framework "${BUILT_PRODUCTS_DIR}/LanguageManager-iOS/LanguageManager_iOS.framework" diff --git a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner.debug.xcconfig b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner.debug.xcconfig index fd38585514fa58a017e803e146d6f78fd07f0da1..6ebb170bcbc9ad6a275e5e724a8e55b814ed26dd 100644 --- a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner.debug.xcconfig +++ b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner.debug.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/EPSignature" "${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/ImagePicker" "${PODS_CONFIGURATION_BUILD_DIR}/LanguageManager-iOS" "${PODS_CONFIGURATION_BUILD_DIR}/NBBottomSheet" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/EPSignature" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/ImagePicker" "${PODS_CONFIGURATION_BUILD_DIR}/LanguageManager-iOS" "${PODS_CONFIGURATION_BUILD_DIR}/NBBottomSheet" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/EPSignature/EPSignature.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView/FSPagerView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ImagePicker/ImagePicker.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LanguageManager-iOS/LanguageManager_iOS.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/NBBottomSheet/NBBottomSheet.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/EPSignature/EPSignature.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ImagePicker/ImagePicker.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LanguageManager-iOS/LanguageManager_iOS.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/NBBottomSheet/NBBottomSheet.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift -OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -framework "AVFoundation" -framework "CoreGraphics" -framework "EPSignature" -framework "FSPagerView" -framework "Foundation" -framework "IQKeyboardManagerSwift" -framework "ImagePicker" -framework "LanguageManager_iOS" -framework "NBBottomSheet" -framework "QuartzCore" -framework "UIKit" +OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -framework "AVFoundation" -framework "CoreGraphics" -framework "EPSignature" -framework "Foundation" -framework "IQKeyboardManagerSwift" -framework "ImagePicker" -framework "LanguageManager_iOS" -framework "NBBottomSheet" -framework "QuartzCore" -framework "UIKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner.release.xcconfig b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner.release.xcconfig index fd38585514fa58a017e803e146d6f78fd07f0da1..6ebb170bcbc9ad6a275e5e724a8e55b814ed26dd 100644 --- a/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner.release.xcconfig +++ b/Pods/Target Support Files/Pods-MiniScanner/Pods-MiniScanner.release.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/EPSignature" "${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/ImagePicker" "${PODS_CONFIGURATION_BUILD_DIR}/LanguageManager-iOS" "${PODS_CONFIGURATION_BUILD_DIR}/NBBottomSheet" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/EPSignature" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/ImagePicker" "${PODS_CONFIGURATION_BUILD_DIR}/LanguageManager-iOS" "${PODS_CONFIGURATION_BUILD_DIR}/NBBottomSheet" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/EPSignature/EPSignature.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView/FSPagerView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ImagePicker/ImagePicker.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LanguageManager-iOS/LanguageManager_iOS.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/NBBottomSheet/NBBottomSheet.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/EPSignature/EPSignature.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ImagePicker/ImagePicker.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LanguageManager-iOS/LanguageManager_iOS.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/NBBottomSheet/NBBottomSheet.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift -OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -framework "AVFoundation" -framework "CoreGraphics" -framework "EPSignature" -framework "FSPagerView" -framework "Foundation" -framework "IQKeyboardManagerSwift" -framework "ImagePicker" -framework "LanguageManager_iOS" -framework "NBBottomSheet" -framework "QuartzCore" -framework "UIKit" +OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -framework "AVFoundation" -framework "CoreGraphics" -framework "EPSignature" -framework "Foundation" -framework "IQKeyboardManagerSwift" -framework "ImagePicker" -framework "LanguageManager_iOS" -framework "NBBottomSheet" -framework "QuartzCore" -framework "UIKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)