├── .gitignore ├── .travis.yml ├── Example ├── Podfile ├── Podfile.lock ├── Pods │ ├── Eureka │ │ ├── LICENSE │ │ ├── README.md │ │ └── Source │ │ │ ├── Core │ │ │ ├── BaseRow.swift │ │ │ ├── Cell.swift │ │ │ ├── CellType.swift │ │ │ ├── Core.swift │ │ │ ├── Form.swift │ │ │ ├── HeaderFooterView.swift │ │ │ ├── Helpers.swift │ │ │ ├── InlineRowType.swift │ │ │ ├── NavigationAccessoryView.swift │ │ │ ├── Operators.swift │ │ │ ├── PresenterRowType.swift │ │ │ ├── Row.swift │ │ │ ├── RowControllerType.swift │ │ │ ├── RowProtocols.swift │ │ │ ├── RowType.swift │ │ │ ├── Section.swift │ │ │ ├── SelectableRowType.swift │ │ │ ├── SelectableSection.swift │ │ │ ├── SwipeActions.swift │ │ │ └── Validation.swift │ │ │ ├── Rows │ │ │ ├── ActionSheetRow.swift │ │ │ ├── AlertRow.swift │ │ │ ├── ButtonRow.swift │ │ │ ├── ButtonRowWithPresent.swift │ │ │ ├── CheckRow.swift │ │ │ ├── Common │ │ │ │ ├── AlertOptionsRow.swift │ │ │ │ ├── DateFieldRow.swift │ │ │ │ ├── DateInlineFieldRow.swift │ │ │ │ ├── DecimalFormatter.swift │ │ │ │ ├── FieldRow.swift │ │ │ │ ├── GenericMultipleSelectorRow.swift │ │ │ │ ├── OptionsRow.swift │ │ │ │ ├── Protocols.swift │ │ │ │ └── SelectorRow.swift │ │ │ ├── Controllers │ │ │ │ ├── MultipleSelectorViewController.swift │ │ │ │ ├── SelectorAlertController.swift │ │ │ │ └── SelectorViewController.swift │ │ │ ├── DateInlineRow.swift │ │ │ ├── DatePickerRow.swift │ │ │ ├── DateRow.swift │ │ │ ├── DoublePickerInputRow.swift │ │ │ ├── DoublePickerRow.swift │ │ │ ├── FieldsRow.swift │ │ │ ├── LabelRow.swift │ │ │ ├── MultipleSelectorRow.swift │ │ │ ├── PickerInlineRow.swift │ │ │ ├── PickerInputRow.swift │ │ │ ├── PickerRow.swift │ │ │ ├── PopoverSelectorRow.swift │ │ │ ├── PushRow.swift │ │ │ ├── SegmentedRow.swift │ │ │ ├── SelectableRows │ │ │ │ └── ListCheckRow.swift │ │ │ ├── SliderRow.swift │ │ │ ├── StepperRow.swift │ │ │ ├── SwitchRow.swift │ │ │ ├── TextAreaRow.swift │ │ │ ├── TriplePickerInputRow.swift │ │ │ └── TriplePickerRow.swift │ │ │ └── Validations │ │ │ ├── RuleClosure.swift │ │ │ ├── RuleEmail.swift │ │ │ ├── RuleEqualsToRow.swift │ │ │ ├── RuleLength.swift │ │ │ ├── RuleRange.swift │ │ │ ├── RuleRegExp.swift │ │ │ ├── RuleRequired.swift │ │ │ └── RuleURL.swift │ ├── Local Podspecs │ │ ├── Eureka.podspec.json │ │ └── WLPhotoPicker.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ ├── SVProgressHUD │ │ ├── LICENSE │ │ ├── README.md │ │ └── SVProgressHUD │ │ │ ├── SVIndefiniteAnimatedView.h │ │ │ ├── SVIndefiniteAnimatedView.m │ │ │ ├── SVProgressAnimatedView.h │ │ │ ├── SVProgressAnimatedView.m │ │ │ ├── SVProgressHUD.bundle │ │ │ ├── angle-mask.png │ │ │ ├── angle-mask@2x.png │ │ │ ├── angle-mask@3x.png │ │ │ ├── error.png │ │ │ ├── error@2x.png │ │ │ ├── error@3x.png │ │ │ ├── info.png │ │ │ ├── info@2x.png │ │ │ ├── info@3x.png │ │ │ ├── success.png │ │ │ ├── success@2x.png │ │ │ └── success@3x.png │ │ │ ├── SVProgressHUD.h │ │ │ ├── SVProgressHUD.m │ │ │ ├── SVRadialGradientLayer.h │ │ │ └── SVRadialGradientLayer.m │ ├── SnapKit │ │ ├── LICENSE │ │ ├── README.md │ │ └── Source │ │ │ ├── Constraint.swift │ │ │ ├── ConstraintAttributes.swift │ │ │ ├── ConstraintConfig.swift │ │ │ ├── ConstraintConstantTarget.swift │ │ │ ├── ConstraintDSL.swift │ │ │ ├── ConstraintDescription.swift │ │ │ ├── ConstraintDirectionalInsetTarget.swift │ │ │ ├── ConstraintDirectionalInsets.swift │ │ │ ├── ConstraintInsetTarget.swift │ │ │ ├── ConstraintInsets.swift │ │ │ ├── ConstraintItem.swift │ │ │ ├── ConstraintLayoutGuide+Extensions.swift │ │ │ ├── ConstraintLayoutGuide.swift │ │ │ ├── ConstraintLayoutGuideDSL.swift │ │ │ ├── ConstraintLayoutSupport.swift │ │ │ ├── ConstraintLayoutSupportDSL.swift │ │ │ ├── ConstraintMaker.swift │ │ │ ├── ConstraintMakerEditable.swift │ │ │ ├── ConstraintMakerExtendable.swift │ │ │ ├── ConstraintMakerFinalizable.swift │ │ │ ├── ConstraintMakerPriortizable.swift │ │ │ ├── ConstraintMakerRelatable.swift │ │ │ ├── ConstraintMultiplierTarget.swift │ │ │ ├── ConstraintOffsetTarget.swift │ │ │ ├── ConstraintPriority.swift │ │ │ ├── ConstraintPriorityTarget.swift │ │ │ ├── ConstraintRelatableTarget.swift │ │ │ ├── ConstraintRelation.swift │ │ │ ├── ConstraintView+Extensions.swift │ │ │ ├── ConstraintView.swift │ │ │ ├── ConstraintViewDSL.swift │ │ │ ├── Debugging.swift │ │ │ ├── LayoutConstraint.swift │ │ │ ├── LayoutConstraintItem.swift │ │ │ ├── Typealiases.swift │ │ │ └── UILayoutSupport+Extensions.swift │ └── Target Support Files │ │ ├── Eureka │ │ ├── Eureka-Info.plist │ │ ├── Eureka-dummy.m │ │ ├── Eureka-prefix.pch │ │ ├── Eureka-umbrella.h │ │ ├── Eureka.debug.xcconfig │ │ ├── Eureka.modulemap │ │ └── Eureka.release.xcconfig │ │ ├── Pods-WLPhotoPicker_Example │ │ ├── Pods-WLPhotoPicker_Example-Info.plist │ │ ├── Pods-WLPhotoPicker_Example-acknowledgements.markdown │ │ ├── Pods-WLPhotoPicker_Example-acknowledgements.plist │ │ ├── Pods-WLPhotoPicker_Example-dummy.m │ │ ├── Pods-WLPhotoPicker_Example-frameworks.sh │ │ ├── Pods-WLPhotoPicker_Example-resources.sh │ │ ├── Pods-WLPhotoPicker_Example-umbrella.h │ │ ├── Pods-WLPhotoPicker_Example.debug.xcconfig │ │ ├── Pods-WLPhotoPicker_Example.modulemap │ │ └── Pods-WLPhotoPicker_Example.release.xcconfig │ │ ├── SVProgressHUD │ │ ├── SVProgressHUD-Info.plist │ │ ├── SVProgressHUD-dummy.m │ │ ├── SVProgressHUD-prefix.pch │ │ ├── SVProgressHUD-umbrella.h │ │ ├── SVProgressHUD.debug.xcconfig │ │ ├── SVProgressHUD.modulemap │ │ └── SVProgressHUD.release.xcconfig │ │ ├── SnapKit │ │ ├── SnapKit-Info.plist │ │ ├── SnapKit-dummy.m │ │ ├── SnapKit-prefix.pch │ │ ├── SnapKit-umbrella.h │ │ ├── SnapKit.debug.xcconfig │ │ ├── SnapKit.modulemap │ │ └── SnapKit.release.xcconfig │ │ └── WLPhotoPicker │ │ ├── ResourceBundle-WLPhotoPicker-WLPhotoPicker-Info.plist │ │ ├── WLPhotoPicker-Info.plist │ │ ├── WLPhotoPicker-dummy.m │ │ ├── WLPhotoPicker-prefix.pch │ │ ├── WLPhotoPicker-umbrella.h │ │ ├── WLPhotoPicker.debug.xcconfig │ │ ├── WLPhotoPicker.modulemap │ │ └── WLPhotoPicker.release.xcconfig ├── WLPhotoPicker.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── WLPhotoPicker-Example.xcscheme ├── WLPhotoPicker.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── WLPhotoPicker │ ├── AppDelegate.swift │ ├── AvatarResultViewController.swift │ ├── AvatarViewController.swift │ ├── Base.lproj │ └── LaunchScreen.xib │ ├── CaptureDemoViewController.swift │ ├── Images.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ ├── add.imageset │ │ ├── Contents.json │ │ ├── add.png │ │ ├── add@2x.png │ │ └── add@3x.png │ ├── bilibili.imageset │ │ ├── Contents.json │ │ └── bilibili.png │ ├── delete.imageset │ │ ├── Contents.json │ │ ├── delete.png │ │ ├── delete@2x.png │ │ └── delete@3x.png │ ├── paster1.imageset │ │ ├── Contents.json │ │ └── paster1.png │ ├── paster10.imageset │ │ ├── Contents.json │ │ └── paster10.png │ ├── paster11.imageset │ │ ├── Contents.json │ │ └── paster11.png │ ├── paster12.imageset │ │ ├── Contents.json │ │ └── paster12.png │ ├── paster13.imageset │ │ ├── Contents.json │ │ └── paster13.png │ ├── paster14.imageset │ │ ├── Contents.json │ │ └── paster14.png │ ├── paster15.imageset │ │ ├── Contents.json │ │ └── paster15.png │ ├── paster16.imageset │ │ ├── Contents.json │ │ └── paster16.png │ ├── paster17.imageset │ │ ├── Contents.json │ │ └── paster17.png │ ├── paster18.imageset │ │ ├── Contents.json │ │ └── paster18.png │ ├── paster2.imageset │ │ ├── Contents.json │ │ └── paster2.png │ ├── paster3.imageset │ │ ├── Contents.json │ │ └── paster3.png │ ├── paster4.imageset │ │ ├── Contents.json │ │ └── paster4.png │ ├── paster5.imageset │ │ ├── Contents.json │ │ └── paster5.png │ ├── paster6.imageset │ │ ├── Contents.json │ │ └── paster6.png │ ├── paster7.imageset │ │ ├── Contents.json │ │ └── paster7.png │ ├── paster8.imageset │ │ ├── Contents.json │ │ └── paster8.png │ ├── paster9.imageset │ │ ├── Contents.json │ │ └── paster9.png │ └── placeholder.imageset │ │ ├── Contents.json │ │ └── placeholder.jpeg │ ├── Info.plist │ ├── LivePhotoPreviewViewController.swift │ ├── LivePhotoResultViewController.swift │ ├── LivePhotoToVideoViewController.swift │ ├── NineCollectionViewCell.swift │ ├── NineViewController.swift │ ├── PhotoPreviewViewController.swift │ ├── PickerResultCollectionViewCell.swift │ ├── PickerResultViewController.swift │ ├── PickerViewController.swift │ ├── SelectVideoViewController.swift │ ├── VideoCompressViewController.swift │ ├── ViewController.swift │ └── WaterfallLayout.swift ├── LICENSE ├── Package.swift ├── README.md ├── Sources └── WLPhotoPicker │ └── WLPhotoPicker.swift ├── Tests └── WLPhotoPickerTests │ └── WLPhotoPickerTests.swift ├── WLPhotoPicker.podspec ├── WLPhotoPicker ├── Classes │ ├── Capture │ │ ├── Contrller │ │ │ ├── CapturePreviewViewController.swift │ │ │ └── CaptureViewController.swift │ │ ├── Model │ │ │ ├── CaptureConfig.swift │ │ │ ├── CaptureFlashMode.swift │ │ │ ├── CaptureManager.swift │ │ │ ├── CaptureOrientation.swift │ │ │ ├── CaptureSessionPreset.swift │ │ │ ├── CaptureVideoFileType.swift │ │ │ └── CaptureVideoStabilizationMode.swift │ │ └── View │ │ │ ├── CaptureCameraButton.swift │ │ │ ├── CaptureControlView.swift │ │ │ └── CapturePreviewToolBar.swift │ ├── Core │ │ ├── Config │ │ │ ├── ColorConfig.swift │ │ │ ├── LocalizedKey.swift │ │ │ ├── UserInterfaceStyle.swift │ │ │ ├── WLPhotoConfig.swift │ │ │ └── WLPhotoUIConfig.swift │ │ ├── Error │ │ │ ├── AssetFetchError.swift │ │ │ ├── CaptureError.swift │ │ │ └── VideoExportError.swift │ │ ├── Permission │ │ │ ├── Permission.swift │ │ │ ├── PermissionProvider.swift │ │ │ ├── PermissionStatus.swift │ │ │ ├── PermissionType.swift │ │ │ └── Permissions │ │ │ │ ├── Camera.swift │ │ │ │ ├── Microphone.swift │ │ │ │ └── PhotoLibrary.swift │ │ └── Tools │ │ │ ├── Fetch │ │ │ ├── AssetFetchOptions.swift │ │ │ ├── AssetFetchRequest.swift │ │ │ ├── AssetFetchResponse.swift │ │ │ ├── AssetFetchTool+Album.swift │ │ │ ├── AssetFetchTool+GIF.swift │ │ │ ├── AssetFetchTool+Image.swift │ │ │ ├── AssetFetchTool+ImageData.swift │ │ │ ├── AssetFetchTool+LivePhoto.swift │ │ │ ├── AssetFetchTool+Observer.swift │ │ │ ├── AssetFetchTool+Operation.swift │ │ │ ├── AssetFetchTool+Select.swift │ │ │ ├── AssetFetchTool+Video.swift │ │ │ ├── AssetFetchTool.swift │ │ │ └── WeakAssetFetchToolDelegate.swift │ │ │ ├── Generator │ │ │ ├── GIFGenerator.swift │ │ │ ├── ImageGenerator.swift │ │ │ └── LivePhotoGenerator.swift │ │ │ └── Save │ │ │ ├── AssetSaveManager+SaveLivePhoto.swift │ │ │ ├── AssetSaveManager+SavePhoto.swift │ │ │ ├── AssetSaveManager+SaveVideo.swift │ │ │ └── AssetSaveManager.swift │ ├── Edit │ │ ├── Animation │ │ │ ├── PhotoEditAnimation.swift │ │ │ ├── PhotoEditCropAnimation.swift │ │ │ └── PhotoEditPasterAnimation.swift │ │ ├── Controller │ │ │ ├── PhotoEditCropViewController.swift │ │ │ ├── PhotoEditPasterViewController.swift │ │ │ ├── PhotoEditTextViewController.swift │ │ │ └── PhotoEditViewController.swift │ │ ├── Model │ │ │ ├── EditManager.swift │ │ │ ├── Filters │ │ │ │ ├── PhotoEdit1977Filter.swift │ │ │ │ ├── PhotoEditCIFilter.swift │ │ │ │ ├── PhotoEditClarendonFilter.swift │ │ │ │ ├── PhotoEditNashvilleFilter.swift │ │ │ │ ├── PhotoEditOriginalFilter.swift │ │ │ │ └── PhotoEditToasterFilter.swift │ │ │ ├── PhotoEditAdjustMode.swift │ │ │ ├── PhotoEditConfig.swift │ │ │ ├── PhotoEditCropOrientation.swift │ │ │ ├── PhotoEditCropRatio.swift │ │ │ ├── PhotoEditCropRect.swift │ │ │ ├── PhotoEditFilter.swift │ │ │ ├── PhotoEditGraffitiPath.swift │ │ │ ├── PhotoEditItemType.swift │ │ │ ├── PhotoEditMaskLayer.swift │ │ │ ├── PhotoEditMosaicPath.swift │ │ │ ├── PhotoEditPasterMaskLayer.swift │ │ │ ├── PhotoEditPasterProvider.swift │ │ │ ├── PhotoEditTextColor.swift │ │ │ └── PhotoEditTextMaskLayer.swift │ │ └── View │ │ │ ├── PhotoEditAdjustCollectionViewCell.swift │ │ │ ├── PhotoEditAdjustSlide.swift │ │ │ ├── PhotoEditAdjustView.swift │ │ │ ├── PhotoEditBottomToolBar.swift │ │ │ ├── PhotoEditCropRectangleCorner.swift │ │ │ ├── PhotoEditCropRectangleView.swift │ │ │ ├── PhotoEditCropToolBar.swift │ │ │ ├── PhotoEditFilterCollectionViewCell.swift │ │ │ ├── PhotoEditFiltersView.swift │ │ │ ├── PhotoEditGraffitiColorCollectionViewCell.swift │ │ │ ├── PhotoEditGraffitiColorsView.swift │ │ │ ├── PhotoEditItemCollectionViewCell.swift │ │ │ ├── PhotoEditMaskTrashCanView.swift │ │ │ ├── PhotoEditMaskView.swift │ │ │ ├── PhotoEditPasterCollectionViewCell.swift │ │ │ ├── PhotoEditTextColorsView.swift │ │ │ └── PhotoEditTopToolBar.swift │ ├── Extensions │ │ ├── AVAsset+Extensions.swift │ │ ├── AVCaptureDevice+Extensions.swift │ │ ├── CGFloat+Extensions.swift │ │ ├── CGRect+Extensions.swift │ │ ├── CGSize+Extensions.swift │ │ ├── CoreImage+Extensions.swift │ │ ├── PHAsset+Extensions.swift │ │ ├── PHAssetCollection+Extensions.swift │ │ ├── PHFetchResult+Extensions.swift │ │ ├── UIApplication+Extensions.swift │ │ ├── UIImage+CIFilter.swift │ │ ├── UIImage+Extensions.swift │ │ ├── UIImage+Orientation.swift │ │ ├── UIScreen+Extensions.swift │ │ ├── UIScrollView+Extensions.swift │ │ └── UIView+Extensions.swift │ ├── Helper │ │ ├── AssetDisplayHelper.swift │ │ ├── BundleHelper.swift │ │ ├── CircleSelectedButton.swift │ │ ├── CoreTextHelper.swift │ │ ├── FileHelper.swift │ │ ├── LanguageRegionCode.swift │ │ ├── LoadingHUD.swift │ │ ├── MD5.swift │ │ ├── NormalStyleButton.swift │ │ └── Reusable.swift │ ├── Picker │ │ ├── Animation │ │ │ └── AlbumListAnimation.swift │ │ ├── Controller │ │ │ ├── AlbumListViewController.swift │ │ │ ├── AssetPickerController.swift │ │ │ └── WLPhotoPickerController.swift │ │ ├── Model │ │ │ ├── AlbumModel.swift │ │ │ ├── AssetMediaType.swift │ │ │ ├── AssetModel.swift │ │ │ ├── AssetPickerResult.swift │ │ │ ├── PickerConfig.swift │ │ │ ├── PickerSelectionType.swift │ │ │ ├── PickerSortType.swift │ │ │ ├── PickerVideoCompressSize.swift │ │ │ ├── PickerVideoExportFileType.swift │ │ │ └── VideoCompressManager.swift │ │ └── View │ │ │ ├── AlbumListTableViewCell.swift │ │ │ ├── AlbumTitleButton.swift │ │ │ ├── AssetAddCollectionViewCell.swift │ │ │ ├── AssetCameraCollectionViewCell.swift │ │ │ ├── AssetCollectionViewCell.swift │ │ │ ├── AssetDescriptionView.swift │ │ │ ├── AssetPickerDeniedPermissionView.swift │ │ │ ├── AssetPickerLimitedPermissionView.swift │ │ │ └── AssetPickerToolBar.swift │ └── Preview │ │ ├── Animation │ │ └── AssetPreviewAnimation.swift │ │ ├── Controller │ │ └── AssetPreviewViewController.swift │ │ └── View │ │ ├── AssetPreviewCell.swift │ │ ├── AssetPreviewGIFCell.swift │ │ ├── AssetPreviewICloudView.swift │ │ ├── AssetPreviewLivePhotoCell.swift │ │ ├── AssetPreviewLivePhotoView.swift │ │ ├── AssetPreviewNavigationBar.swift │ │ ├── AssetPreviewPhotoCell.swift │ │ ├── AssetPreviewThumbnailCell.swift │ │ ├── AssetPreviewToolBar.swift │ │ └── AssetPreviewVideoCell.swift └── Resources │ ├── Assets.xcassets │ ├── Contents.json │ ├── add.imageset │ │ ├── Contents.json │ │ ├── add.png │ │ ├── add@2x.png │ │ └── add@3x.png │ ├── arrow_left.imageset │ │ ├── Contents.json │ │ ├── arrow_left.png │ │ ├── arrow_left@2x.png │ │ └── arrow_left@3x.png │ ├── back_fill.imageset │ │ ├── Contents.json │ │ ├── back_fill.png │ │ ├── back_fill@2x.png │ │ └── back_fill@3x.png │ ├── camera.imageset │ │ ├── Contents.json │ │ ├── camera.png │ │ ├── camera@2x.png │ │ └── camera@3x.png │ ├── capture_back.imageset │ │ ├── Contents.json │ │ ├── capture_back.png │ │ ├── capture_back@2x.png │ │ └── capture_back@3x.png │ ├── capture_focus.imageset │ │ ├── Contents.json │ │ ├── capture_focus.png │ │ ├── capture_focus@2x.png │ │ └── capture_focus@3x.png │ ├── capture_rotate_camera.imageset │ │ ├── Contents.json │ │ ├── capture_rotate_camera.png │ │ ├── capture_rotate_camera@2x.png │ │ └── capture_rotate_camera@3x.png │ ├── checked.imageset │ │ ├── Contents.json │ │ ├── checked.png │ │ ├── checked@2x.png │ │ └── checked@3x.png │ ├── crop_reset.imageset │ │ ├── Contents.json │ │ ├── crop_reset.png │ │ ├── crop_reset@2x.png │ │ └── crop_reset@3x.png │ ├── edit_adjust.imageset │ │ ├── Contents.json │ │ ├── edit_adjust.png │ │ ├── edit_adjust@2x.png │ │ └── edit_adjust@3x.png │ ├── edit_brightness.imageset │ │ ├── Contents.json │ │ ├── edit_brightness.png │ │ ├── edit_brightness@2x.png │ │ └── edit_brightness@3x.png │ ├── edit_contrast.imageset │ │ ├── Contents.json │ │ ├── edit_contrast.png │ │ ├── edit_contrast@2x.png │ │ └── edit_contrast@3x.png │ ├── edit_crop.imageset │ │ ├── Contents.json │ │ ├── edit_crop.png │ │ ├── edit_crop@2x.png │ │ └── edit_crop@3x.png │ ├── edit_filter.imageset │ │ ├── Contents.json │ │ ├── edit_filter.png │ │ ├── edit_filter@2x.png │ │ └── edit_filter@3x.png │ ├── edit_graffiti.imageset │ │ ├── Contents.json │ │ ├── edit_graffiti.png │ │ ├── edit_graffiti@2x.png │ │ └── edit_graffiti@3x.png │ ├── edit_mosaic.imageset │ │ ├── Contents.json │ │ ├── edit_mosaic.png │ │ ├── edit_mosaic@2x.png │ │ └── edit_mosaic@3x.png │ ├── edit_paster.imageset │ │ ├── Contents.json │ │ ├── edit_paster.png │ │ ├── edit_paster@2x.png │ │ └── edit_paster@3x.png │ ├── edit_saturability.imageset │ │ ├── Contents.json │ │ ├── edit_saturability.png │ │ ├── edit_saturability@2x.png │ │ └── edit_saturability@3x.png │ ├── edit_text.imageset │ │ ├── Contents.json │ │ ├── edit_text.png │ │ ├── edit_text@2x.png │ │ └── edit_text@3x.png │ ├── icloud.imageset │ │ ├── Contents.json │ │ ├── icloud.png │ │ ├── icloud@2x.png │ │ └── icloud@3x.png │ ├── livephoto.imageset │ │ ├── Contents.json │ │ ├── livephoto.png │ │ ├── livephoto@2x.png │ │ └── livephoto@3x.png │ ├── paster_back.imageset │ │ ├── Contents.json │ │ ├── paster_back.png │ │ ├── paster_back@2x.png │ │ └── paster_back@3x.png │ ├── photo_edited.imageset │ │ ├── Contents.json │ │ ├── photo_edited.png │ │ ├── photo_edited@2x.png │ │ └── photo_edited@3x.png │ ├── rotate_left.imageset │ │ ├── Contents.json │ │ ├── rotate_left.png │ │ ├── rotate_left@2x.png │ │ └── rotate_left@3x.png │ ├── rotate_right.imageset │ │ ├── Contents.json │ │ ├── rotate_right.png │ │ ├── rotate_right@2x.png │ │ └── rotate_right@3x.png │ ├── select_fill.imageset │ │ ├── Contents.json │ │ ├── select_fill.png │ │ ├── select_fill@2x.png │ │ └── select_fill@3x.png │ ├── select_normal.imageset │ │ ├── Contents.json │ │ ├── select_normal.png │ │ ├── select_normal@2x.png │ │ └── select_normal@3x.png │ ├── text_nowrap.imageset │ │ ├── Contents.json │ │ ├── text_nowrap.png │ │ ├── text_nowrap@2x.png │ │ └── text_nowrap@3x.png │ ├── text_wrap.imageset │ │ ├── Contents.json │ │ ├── text_wrap.png │ │ ├── text_wrap@2x.png │ │ └── text_wrap@3x.png │ ├── trashcan.imageset │ │ ├── Contents.json │ │ ├── trashcan.png │ │ ├── trashcan@2x.png │ │ └── trashcan@3x.png │ ├── trashcan_open.imageset │ │ ├── Contents.json │ │ ├── trashcan_open.png │ │ ├── trashcan_open@2x.png │ │ └── trashcan_open@3x.png │ ├── undo.imageset │ │ ├── Contents.json │ │ ├── undo.png │ │ ├── undo@2x.png │ │ └── undo@3x.png │ ├── video.imageset │ │ ├── Contents.json │ │ ├── video.png │ │ ├── video@2x.png │ │ └── video@3x.png │ ├── video_play.imageset │ │ ├── Contents.json │ │ ├── video_play.png │ │ ├── video_play@2x.png │ │ └── video_play@3x.png │ └── warning.imageset │ │ ├── Contents.json │ │ ├── warning.png │ │ ├── warning@2x.png │ │ └── warning@3x.png │ ├── en.lproj │ └── Localizable.strings │ ├── zh-Hans.lproj │ └── Localizable.strings │ └── zh-Hant.lproj │ └── Localizable.strings ├── _Pods.xcodeproj └── sketch.sketch /.gitignore: -------------------------------------------------------------------------------- 1 | # macOS 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata/ 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 26 | # Carthage/Checkouts 27 | 28 | Carthage/Build 29 | 30 | # We recommend against adding the Pods directory to your .gitignore. However 31 | # you should judge for yourself, the pros and cons are mentioned at: 32 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 33 | # 34 | # Note: if you ignore the Pods directory, make sure to uncomment 35 | # `pod install` in .travis.yml 36 | # 37 | # Pods/ 38 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * https://www.objc.io/issues/6-build-tools/travis-ci/ 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode7.3 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | # before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | # - pod install --project-directory=Example 12 | script: 13 | - set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/WLPhotoPicker.xcworkspace -scheme WLPhotoPicker-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty 14 | - pod lib lint 15 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | platform :ios, '11.0' 4 | 5 | target 'WLPhotoPicker_Example' do 6 | pod 'WLPhotoPicker', :path => '../' 7 | pod 'Eureka', :git => 'https://github.com/xmartlabs/Eureka.git' 8 | pod 'SVProgressHUD' 9 | end 10 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Eureka (5.3.4) 3 | - SnapKit (5.0.1) 4 | - SVProgressHUD (2.2.5) 5 | - WLPhotoPicker (0.1.0): 6 | - SnapKit (~> 5.0.0) 7 | 8 | DEPENDENCIES: 9 | - Eureka (from `https://github.com/xmartlabs/Eureka.git`) 10 | - SVProgressHUD 11 | - WLPhotoPicker (from `../`) 12 | 13 | SPEC REPOS: 14 | trunk: 15 | - SnapKit 16 | - SVProgressHUD 17 | 18 | EXTERNAL SOURCES: 19 | Eureka: 20 | :git: https://github.com/xmartlabs/Eureka.git 21 | WLPhotoPicker: 22 | :path: "../" 23 | 24 | CHECKOUT OPTIONS: 25 | Eureka: 26 | :commit: 94475e83a6965320283b8b39986e7481ad675ab9 27 | :git: https://github.com/xmartlabs/Eureka.git 28 | 29 | SPEC CHECKSUMS: 30 | Eureka: 60cf058f86a8fb3ed26165ba5292b9850361b0a6 31 | SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb 32 | SVProgressHUD: 1428aafac632c1f86f62aa4243ec12008d7a51d6 33 | WLPhotoPicker: 17b16e24716c70ae963d52dc8f15423daa1c919f 34 | 35 | PODFILE CHECKSUM: 1bec862c65c1c4554d84c412e03a570273c26356 36 | 37 | COCOAPODS: 1.11.2 38 | -------------------------------------------------------------------------------- /Example/Pods/Eureka/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 XMARTLABS 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Example/Pods/Eureka/Source/Core/RowControllerType.swift: -------------------------------------------------------------------------------- 1 | // RowControllerType.swift 2 | // Eureka ( https://github.com/xmartlabs/Eureka ) 3 | // 4 | // Copyright (c) 2016 Xmartlabs ( http://xmartlabs.com ) 5 | // 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | 25 | import Foundation 26 | import UIKit 27 | 28 | /** 29 | * Base protocol for view controllers presented by Eureka rows. 30 | */ 31 | public protocol RowControllerType: NSObjectProtocol { 32 | 33 | /// A closure to be called when the controller disappears. 34 | var onDismissCallback: ((UIViewController) -> Void)? { get set } 35 | } 36 | -------------------------------------------------------------------------------- /Example/Pods/Eureka/Source/Core/SelectableRowType.swift: -------------------------------------------------------------------------------- 1 | // SelectableRowType.swift 2 | // Eureka ( https://github.com/xmartlabs/Eureka ) 3 | // 4 | // Copyright (c) 2016 Xmartlabs ( http://xmartlabs.com ) 5 | // 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | 25 | import Foundation 26 | 27 | /** 28 | * Every row that shall be used in a SelectableSection must conform to this protocol. 29 | */ 30 | public protocol SelectableRowType: RowType { 31 | var selectableValue: Cell.Value? { get set } 32 | } 33 | -------------------------------------------------------------------------------- /Example/Pods/Eureka/Source/Rows/Common/Protocols.swift: -------------------------------------------------------------------------------- 1 | // Protocols.swift 2 | // Eureka ( https://github.com/xmartlabs/Eureka ) 3 | // 4 | // Copyright (c) 2016 Xmartlabs SRL ( http://xmartlabs.com ) 5 | // 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | 25 | import Foundation 26 | 27 | public protocol FormatterConformance: AnyObject { 28 | var formatter: Formatter? { get set } 29 | var useFormatterDuringInput: Bool { get set } 30 | var useFormatterOnDidBeginEditing: Bool? { get set } 31 | } 32 | 33 | public protocol NoValueDisplayTextConformance: AnyObject { 34 | var noValueDisplayText: String? { get set } 35 | } 36 | -------------------------------------------------------------------------------- /Example/Pods/Eureka/Source/Validations/RuleEmail.swift: -------------------------------------------------------------------------------- 1 | // RuleEmail.swift 2 | // Eureka ( https://github.com/xmartlabs/Eureka ) 3 | // 4 | // Copyright (c) 2016 Xmartlabs SRL ( http://xmartlabs.com ) 5 | // 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | 25 | import Foundation 26 | 27 | public class RuleEmail: RuleRegExp { 28 | 29 | public init(msg: String = "Field value should be a valid email!", id: String? = nil) { 30 | super.init(regExpr: RegExprPattern.EmailAddress.rawValue, allowsEmpty: true, msg: msg, id: id) 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/Eureka.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Eureka", 3 | "version": "5.3.4", 4 | "license": "MIT", 5 | "summary": "Elegant iOS Forms in pure Swift", 6 | "homepage": "https://github.com/xmartlabs/Eureka", 7 | "social_media_url": "http://twitter.com/xmartlabs", 8 | "authors": { 9 | "Martin Barreto": "martin@xmartlabs.com", 10 | "Mathias Claassen": "mathias@xmartlabs.com" 11 | }, 12 | "source": { 13 | "git": "https://github.com/xmartlabs/Eureka.git", 14 | "tag": "5.3.4" 15 | }, 16 | "platforms": { 17 | "ios": "9.0" 18 | }, 19 | "ios": { 20 | "frameworks": [ 21 | "UIKit", 22 | "Foundation" 23 | ] 24 | }, 25 | "source_files": "Source/**/*.swift", 26 | "requires_arc": true, 27 | "swift_versions": "5.0", 28 | "swift_version": "5.0" 29 | } 30 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/WLPhotoPicker.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "WLPhotoPicker", 3 | "version": "0.1.0", 4 | "summary": "Photo plcker.", 5 | "homepage": "https://github.com/Weang/WLPhotoPicker", 6 | "license": { 7 | "type": "MIT", 8 | "file": "LICENSE" 9 | }, 10 | "authors": { 11 | "Weang": "w704444178@qq.com" 12 | }, 13 | "source": { 14 | "git": "https://github.com/Weang/WLPhotoPicker.git", 15 | "tag": "0.1.0" 16 | }, 17 | "platforms": { 18 | "ios": "11.0" 19 | }, 20 | "swift_versions": "5.0", 21 | "dependencies": { 22 | "SnapKit": [ 23 | "~> 5.0.0" 24 | ] 25 | }, 26 | "source_files": "WLPhotoPicker/Classes/**/*", 27 | "resources": "WLPhotoPicker/Resources/**/*", 28 | "swift_version": "5.0" 29 | } 30 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Eureka (5.3.4) 3 | - SnapKit (5.0.1) 4 | - SVProgressHUD (2.2.5) 5 | - WLPhotoPicker (0.1.0): 6 | - SnapKit (~> 5.0.0) 7 | 8 | DEPENDENCIES: 9 | - Eureka (from `https://github.com/xmartlabs/Eureka.git`) 10 | - SVProgressHUD 11 | - WLPhotoPicker (from `../`) 12 | 13 | SPEC REPOS: 14 | trunk: 15 | - SnapKit 16 | - SVProgressHUD 17 | 18 | EXTERNAL SOURCES: 19 | Eureka: 20 | :git: https://github.com/xmartlabs/Eureka.git 21 | WLPhotoPicker: 22 | :path: "../" 23 | 24 | CHECKOUT OPTIONS: 25 | Eureka: 26 | :commit: 94475e83a6965320283b8b39986e7481ad675ab9 27 | :git: https://github.com/xmartlabs/Eureka.git 28 | 29 | SPEC CHECKSUMS: 30 | Eureka: 60cf058f86a8fb3ed26165ba5292b9850361b0a6 31 | SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb 32 | SVProgressHUD: 1428aafac632c1f86f62aa4243ec12008d7a51d6 33 | WLPhotoPicker: 17b16e24716c70ae963d52dc8f15423daa1c919f 34 | 35 | PODFILE CHECKSUM: 1bec862c65c1c4554d84c412e03a570273c26356 36 | 37 | COCOAPODS: 1.11.2 38 | -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2011-2018 Sam Vermette, Tobias Tiemerding and contributors. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SVIndefiniteAnimatedView.h 3 | // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD 4 | // 5 | // Copyright (c) 2014-2018 Guillaume Campagna. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface SVIndefiniteAnimatedView : UIView 11 | 12 | @property (nonatomic, assign) CGFloat strokeThickness; 13 | @property (nonatomic, assign) CGFloat radius; 14 | @property (nonatomic, strong) UIColor *strokeColor; 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SVProgressAnimatedView.h 3 | // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD 4 | // 5 | // Copyright (c) 2017-2018 Tobias Tiemerding. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface SVProgressAnimatedView : UIView 11 | 12 | @property (nonatomic, assign) CGFloat radius; 13 | @property (nonatomic, assign) CGFloat strokeThickness; 14 | @property (nonatomic, strong) UIColor *strokeColor; 15 | @property (nonatomic, assign) CGFloat strokeEnd; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h: -------------------------------------------------------------------------------- 1 | // 2 | // SVRadialGradientLayer.h 3 | // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD 4 | // 5 | // Copyright (c) 2014-2018 Tobias Tiemerding. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface SVRadialGradientLayer : CALayer 11 | 12 | @property (nonatomic) CGPoint gradientCenter; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /Example/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.m: -------------------------------------------------------------------------------- 1 | // 2 | // SVRadialGradientLayer.m 3 | // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD 4 | // 5 | // Copyright (c) 2014-2018 Tobias Tiemerding. All rights reserved. 6 | // 7 | 8 | #import "SVRadialGradientLayer.h" 9 | 10 | @implementation SVRadialGradientLayer 11 | 12 | - (void)drawInContext:(CGContextRef)context { 13 | size_t locationsCount = 2; 14 | CGFloat locations[2] = {0.0f, 1.0f}; 15 | CGFloat colors[8] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.75f}; 16 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 17 | CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, locationsCount); 18 | CGColorSpaceRelease(colorSpace); 19 | 20 | float radius = MIN(self.bounds.size.width , self.bounds.size.height); 21 | CGContextDrawRadialGradient (context, gradient, self.gradientCenter, 0, self.gradientCenter, radius, kCGGradientDrawsAfterEndLocation); 22 | CGGradientRelease(gradient); 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Example/Pods/SnapKit/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Example/Pods/SnapKit/Source/ConstraintDirectionalInsets.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SnapKit 3 | // 4 | // Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #if os(iOS) || os(tvOS) 25 | import UIKit 26 | #else 27 | import AppKit 28 | #endif 29 | 30 | 31 | #if os(iOS) || os(tvOS) 32 | @available(iOS 11.0, tvOS 11.0, *) 33 | public typealias ConstraintDirectionalInsets = NSDirectionalEdgeInsets 34 | #endif 35 | -------------------------------------------------------------------------------- /Example/Pods/SnapKit/Source/ConstraintInsets.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SnapKit 3 | // 4 | // Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #if os(iOS) || os(tvOS) 25 | import UIKit 26 | #else 27 | import AppKit 28 | #endif 29 | 30 | 31 | #if os(iOS) || os(tvOS) 32 | public typealias ConstraintInsets = UIEdgeInsets 33 | #else 34 | public typealias ConstraintInsets = NSEdgeInsets 35 | #endif 36 | -------------------------------------------------------------------------------- /Example/Pods/SnapKit/Source/ConstraintLayoutGuide+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SnapKit 3 | // 4 | // Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #if os(iOS) || os(tvOS) 25 | import UIKit 26 | #endif 27 | 28 | 29 | @available(iOS 9.0, OSX 10.11, *) 30 | public extension ConstraintLayoutGuide { 31 | 32 | var snp: ConstraintLayoutGuideDSL { 33 | return ConstraintLayoutGuideDSL(guide: self) 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /Example/Pods/SnapKit/Source/ConstraintLayoutGuide.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SnapKit 3 | // 4 | // Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #if os(iOS) || os(tvOS) 25 | import UIKit 26 | #else 27 | import AppKit 28 | #endif 29 | 30 | 31 | #if os(iOS) || os(tvOS) 32 | @available(iOS 9.0, *) 33 | public typealias ConstraintLayoutGuide = UILayoutGuide 34 | #else 35 | @available(OSX 10.11, *) 36 | public typealias ConstraintLayoutGuide = NSLayoutGuide 37 | #endif 38 | -------------------------------------------------------------------------------- /Example/Pods/SnapKit/Source/ConstraintLayoutSupport.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SnapKit 3 | // 4 | // Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #if os(iOS) || os(tvOS) 25 | import UIKit 26 | #else 27 | import AppKit 28 | #endif 29 | 30 | 31 | #if os(iOS) || os(tvOS) 32 | @available(iOS 8.0, *) 33 | public typealias ConstraintLayoutSupport = UILayoutSupport 34 | #else 35 | public class ConstraintLayoutSupport {} 36 | #endif 37 | -------------------------------------------------------------------------------- /Example/Pods/SnapKit/Source/ConstraintView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SnapKit 3 | // 4 | // Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #if os(iOS) || os(tvOS) 25 | import UIKit 26 | #else 27 | import AppKit 28 | #endif 29 | 30 | 31 | #if os(iOS) || os(tvOS) 32 | public typealias ConstraintView = UIView 33 | #else 34 | public typealias ConstraintView = NSView 35 | #endif 36 | -------------------------------------------------------------------------------- /Example/Pods/SnapKit/Source/UILayoutSupport+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SnapKit 3 | // 4 | // Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #if os(iOS) || os(tvOS) 25 | import UIKit 26 | #endif 27 | 28 | 29 | @available(iOS 8.0, *) 30 | public extension ConstraintLayoutSupport { 31 | 32 | var snp: ConstraintLayoutSupportDSL { 33 | return ConstraintLayoutSupportDSL(support: self) 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Eureka/Eureka-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 5.3.4 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Eureka/Eureka-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Eureka : NSObject 3 | @end 4 | @implementation PodsDummy_Eureka 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Eureka/Eureka-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Eureka/Eureka-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double EurekaVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char EurekaVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Eureka/Eureka.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Eureka 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "UIKit" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_ROOT = ${SRCROOT} 10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Eureka 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 13 | SKIP_INSTALL = YES 14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Eureka/Eureka.modulemap: -------------------------------------------------------------------------------- 1 | framework module Eureka { 2 | umbrella header "Eureka-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Eureka/Eureka.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Eureka 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "UIKit" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_ROOT = ${SRCROOT} 10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Eureka 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 13 | SKIP_INSTALL = YES 14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WLPhotoPicker_Example/Pods-WLPhotoPicker_Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WLPhotoPicker_Example/Pods-WLPhotoPicker_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_WLPhotoPicker_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_WLPhotoPicker_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WLPhotoPicker_Example/Pods-WLPhotoPicker_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_WLPhotoPicker_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_WLPhotoPicker_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WLPhotoPicker_Example/Pods-WLPhotoPicker_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Eureka" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/WLPhotoPicker" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Eureka/Eureka.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/WLPhotoPicker/WLPhotoPicker.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 8 | OTHER_LDFLAGS = $(inherited) -framework "Eureka" -framework "Foundation" -framework "QuartzCore" -framework "SVProgressHUD" -framework "SnapKit" -framework "UIKit" -framework "WLPhotoPicker" 9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 10 | PODS_BUILD_DIR = ${BUILD_DIR} 11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 13 | PODS_ROOT = ${SRCROOT}/Pods 14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WLPhotoPicker_Example/Pods-WLPhotoPicker_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_WLPhotoPicker_Example { 2 | umbrella header "Pods-WLPhotoPicker_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WLPhotoPicker_Example/Pods-WLPhotoPicker_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Eureka" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/WLPhotoPicker" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Eureka/Eureka.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/WLPhotoPicker/WLPhotoPicker.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 8 | OTHER_LDFLAGS = $(inherited) -framework "Eureka" -framework "Foundation" -framework "QuartzCore" -framework "SVProgressHUD" -framework "SnapKit" -framework "UIKit" -framework "WLPhotoPicker" 9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 10 | PODS_BUILD_DIR = ${BUILD_DIR} 11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 13 | PODS_ROOT = ${SRCROOT}/Pods 14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.2.5 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_SVProgressHUD : NSObject 3 | @end 4 | @implementation PodsDummy_SVProgressHUD 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "SVIndefiniteAnimatedView.h" 14 | #import "SVProgressAnimatedView.h" 15 | #import "SVProgressHUD.h" 16 | #import "SVRadialGradientLayer.h" 17 | 18 | FOUNDATION_EXPORT double SVProgressHUDVersionNumber; 19 | FOUNDATION_EXPORT const unsigned char SVProgressHUDVersionString[]; 20 | 21 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SVProgressHUD/SVProgressHUD.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | OTHER_LDFLAGS = $(inherited) -framework "QuartzCore" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SVProgressHUD 9 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | SKIP_INSTALL = YES 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SVProgressHUD/SVProgressHUD.modulemap: -------------------------------------------------------------------------------- 1 | framework module SVProgressHUD { 2 | umbrella header "SVProgressHUD-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SVProgressHUD/SVProgressHUD.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | OTHER_LDFLAGS = $(inherited) -framework "QuartzCore" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SVProgressHUD 9 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | SKIP_INSTALL = YES 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SnapKit/SnapKit-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 5.0.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SnapKit/SnapKit-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_SnapKit : NSObject 3 | @end 4 | @implementation PodsDummy_SnapKit 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SnapKit/SnapKit-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SnapKit/SnapKit-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double SnapKitVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char SnapKitVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SnapKit/SnapKit.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SnapKit 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SnapKit 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 12 | SKIP_INSTALL = YES 13 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 14 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SnapKit/SnapKit.modulemap: -------------------------------------------------------------------------------- 1 | framework module SnapKit { 2 | umbrella header "SnapKit-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SnapKit/SnapKit.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SnapKit 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SnapKit 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 12 | SKIP_INSTALL = YES 13 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 14 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WLPhotoPicker/ResourceBundle-WLPhotoPicker-WLPhotoPicker-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleIdentifier 8 | ${PRODUCT_BUNDLE_IDENTIFIER} 9 | CFBundleInfoDictionaryVersion 10 | 6.0 11 | CFBundleName 12 | ${PRODUCT_NAME} 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 0.1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WLPhotoPicker/WLPhotoPicker-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WLPhotoPicker/WLPhotoPicker-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_WLPhotoPicker : NSObject 3 | @end 4 | @implementation PodsDummy_WLPhotoPicker 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WLPhotoPicker/WLPhotoPicker-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WLPhotoPicker/WLPhotoPicker-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double WLPhotoPickerVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char WLPhotoPickerVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WLPhotoPicker/WLPhotoPicker.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/WLPhotoPicker 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 6 | OTHER_LDFLAGS = $(inherited) -framework "SnapKit" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_ROOT = ${SRCROOT} 11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 14 | SKIP_INSTALL = YES 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WLPhotoPicker/WLPhotoPicker.modulemap: -------------------------------------------------------------------------------- 1 | framework module WLPhotoPicker { 2 | umbrella header "WLPhotoPicker-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WLPhotoPicker/WLPhotoPicker.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/WLPhotoPicker 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 6 | OTHER_LDFLAGS = $(inherited) -framework "SnapKit" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_ROOT = ${SRCROOT} 11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 14 | SKIP_INSTALL = YES 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Weang on 01/18/2022. 6 | // Copyright (c) 2022 Weang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SVProgressHUD 11 | 12 | @UIApplicationMain 13 | class AppDelegate: UIResponder, UIApplicationDelegate { 14 | 15 | var window: UIWindow? 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | window = UIWindow(frame: UIScreen.main.bounds) 19 | window?.backgroundColor = .black 20 | window?.rootViewController = UINavigationController(rootViewController: ViewController()) 21 | window?.makeKeyAndVisible() 22 | 23 | SVProgressHUD.setDefaultStyle(.dark) 24 | 25 | #if DEBUG 26 | UIApplication.shared.isIdleTimerDisabled = true 27 | #endif 28 | 29 | return true 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/AvatarResultViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AvatarResultViewController.swift 3 | // WLPhotoPicker_Example 4 | // 5 | // Created by Mr.Wang on 2022/4/20. 6 | // Copyright © 2022 CocoaPods. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class AvatarResultViewController: UIViewController { 12 | 13 | let imageView = UIImageView() 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | 18 | view.backgroundColor = .white 19 | 20 | view.addSubview(imageView) 21 | imageView.snp.makeConstraints { make in 22 | make.center.equalToSuperview() 23 | make.height.width.equalTo(view.snp.width).multipliedBy(0.7) 24 | } 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "size" : "1024x1024", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/add.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "add.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "add@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "add@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/add.imageset/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/add.imageset/add.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/add.imageset/add@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/add.imageset/add@2x.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/add.imageset/add@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/add.imageset/add@3x.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/bilibili.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "bilibili.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/bilibili.imageset/bilibili.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/bilibili.imageset/bilibili.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/delete.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "delete.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "delete@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "delete@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/delete.imageset/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/delete.imageset/delete.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/delete.imageset/delete@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/delete.imageset/delete@2x.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/delete.imageset/delete@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/delete.imageset/delete@3x.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster1.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster1.imageset/paster1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster1.imageset/paster1.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster10.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster10.imageset/paster10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster10.imageset/paster10.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster11.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster11.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster11.imageset/paster11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster11.imageset/paster11.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster12.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster12.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster12.imageset/paster12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster12.imageset/paster12.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster13.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster13.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster13.imageset/paster13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster13.imageset/paster13.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster14.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster14.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster14.imageset/paster14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster14.imageset/paster14.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster15.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster15.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster15.imageset/paster15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster15.imageset/paster15.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster16.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster16.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster16.imageset/paster16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster16.imageset/paster16.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster17.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster17.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster17.imageset/paster17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster17.imageset/paster17.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster18.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster18.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster18.imageset/paster18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster18.imageset/paster18.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster2.imageset/paster2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster2.imageset/paster2.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster3.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster3.imageset/paster3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster3.imageset/paster3.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster4.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster4.imageset/paster4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster4.imageset/paster4.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster5.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster5.imageset/paster5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster5.imageset/paster5.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster6.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster6.imageset/paster6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster6.imageset/paster6.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster7.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster7.imageset/paster7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster7.imageset/paster7.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster8.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster8.imageset/paster8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster8.imageset/paster8.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "paster9.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/paster9.imageset/paster9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/paster9.imageset/paster9.png -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/placeholder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "placeholder.jpeg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Images.xcassets/placeholder.imageset/placeholder.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Weang/WLPhotoPicker/fd39005a6dd6cf483d2a33e9076de5ccf455d3df/Example/WLPhotoPicker/Images.xcassets/placeholder.imageset/placeholder.jpeg -------------------------------------------------------------------------------- /Example/WLPhotoPicker/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | zh_CN 7 | CFBundleDisplayName 8 | WLPhotoPicker 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | NSCameraUsageDescription 28 | Privacy - Camera Usage Description 29 | NSMicrophoneUsageDescription 30 | Privacy - Microphone Usage Description 31 | NSPhotoLibraryUsageDescription 32 | Privacy - Photo Library Usage Description 33 | PHPhotoLibraryPreventAutomaticLimitedAccessAlert 34 | 35 | UILaunchStoryboardName 36 | LaunchScreen 37 | UIRequiredDeviceCapabilities 38 | 39 | armv7 40 | 41 | UISupportedInterfaceOrientations 42 | 43 | UIInterfaceOrientationPortrait 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/NineCollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NineCollectionViewCell.swift 3 | // WLPhotoPicker_Example 4 | // 5 | // Created by Mr.Wang on 2022/4/20. 6 | // Copyright © 2022 CocoaPods. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class NineCollectionViewCell: UICollectionViewCell { 12 | 13 | let imageView = UIImageView() 14 | let deleteButton = UIButton() 15 | 16 | override init(frame: CGRect) { 17 | super.init(frame: frame) 18 | 19 | imageView.contentMode = .scaleAspectFill 20 | imageView.clipsToBounds = true 21 | contentView.addSubview(imageView) 22 | imageView.snp.makeConstraints { make in 23 | make.edges.equalToSuperview() 24 | } 25 | 26 | deleteButton.setImage(UIImage.init(named: "delete"), for: .normal) 27 | contentView.addSubview(deleteButton) 28 | deleteButton.snp.makeConstraints { make in 29 | make.top.right.equalToSuperview() 30 | } 31 | } 32 | 33 | required init?(coder: NSCoder) { 34 | fatalError("init(coder:) has not been implemented") 35 | } 36 | 37 | 38 | 39 | } 40 | -------------------------------------------------------------------------------- /Example/WLPhotoPicker/PhotoPreviewViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoPreviewViewController.swift 3 | // WLPhotoPicker_Example 4 | // 5 | // Created by Mr.Wang on 2022/4/21. 6 | // Copyright © 2022 CocoaPods. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class PhotoPreviewViewController: UIViewController { 12 | 13 | let imageView = UIImageView() 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | 18 | view.backgroundColor = .black 19 | 20 | imageView.contentMode = .scaleAspectFit 21 | view.addSubview(imageView) 22 | imageView.snp.makeConstraints { make in 23 | make.edges.equalToSuperview() 24 | } 25 | } 26 | 27 | 28 | } 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2022 Weang 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.7 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "WLPhotoPicker", 8 | products: [ 9 | // Products define the executables and libraries a package produces, and make them visible to other packages. 10 | .library( 11 | name: "WLPhotoPicker", 12 | targets: ["WLPhotoPicker"]), 13 | ], 14 | dependencies: [ 15 | // Dependencies declare other packages that this package depends on. 16 | // .package(url: /* package url */, from: "1.0.0"), 17 | ], 18 | targets: [ 19 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 20 | // Targets can depend on other targets in this package, and on products in packages this package depends on. 21 | .target( 22 | name: "WLPhotoPicker", 23 | dependencies: []), 24 | .testTarget( 25 | name: "WLPhotoPickerTests", 26 | dependencies: ["WLPhotoPicker"]), 27 | ] 28 | ) 29 | -------------------------------------------------------------------------------- /Sources/WLPhotoPicker/WLPhotoPicker.swift: -------------------------------------------------------------------------------- 1 | public struct WLPhotoPicker { 2 | public private(set) var text = "Hello, World!" 3 | 4 | public init() { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Tests/WLPhotoPickerTests/WLPhotoPickerTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import WLPhotoPicker 3 | 4 | final class WLPhotoPickerTests: XCTestCase { 5 | func testExample() throws { 6 | // This is an example of a functional test case. 7 | // Use XCTAssert and related functions to verify your tests produce the correct 8 | // results. 9 | XCTAssertEqual(WLPhotoPicker().text, "Hello, World!") 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /WLPhotoPicker.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint WLPhotoPicker.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'WLPhotoPicker' 11 | s.version = '1.0.0' 12 | s.summary = 'A photo and video picker for iOS.' 13 | s.homepage = 'https://github.com/Weang/WLPhotoPicker' 14 | s.license = { :type => 'MIT', :file => 'LICENSE' } 15 | s.author = { 'Weang' => 'w704444178@qq.com' } 16 | s.source = { :git => 'https://github.com/Weang/WLPhotoPicker.git', :tag => s.version.to_s } 17 | s.ios.deployment_target = '11.0' 18 | s.swift_version = '5.0' 19 | s.dependency 'SnapKit' 20 | s.source_files = "WLPhotoPicker/Classes/**/*" 21 | s.resources = 'WLPhotoPicker/Resources/**/*' 22 | end 23 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Capture/Model/CaptureConfig.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CaptureConfig.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/11. 6 | // 7 | 8 | import UIKit 9 | import MobileCoreServices 10 | 11 | public class CaptureConfig { 12 | 13 | public init() { } 14 | 15 | // 是否允许拍摄照片 16 | public var allowTakingPhoto: Bool = true 17 | 18 | // 是否允许拍摄视频 19 | public var allowTakingVideo: Bool = true 20 | 21 | // 视频拍摄最长时长 22 | public var captureMaximumVideoDuration: TimeInterval = 20 23 | 24 | // 拍摄闪光灯开关 25 | public var captureFlashMode: CaptureFlashMode = .off 26 | 27 | // 视频拍摄格式 28 | public var captureFileType: CaptureVideoFileType = .mp4 29 | 30 | // 视频拍摄帧率 31 | public var captureVideoFrameRate: Double = 60 32 | 33 | // 视频拍摄预设 34 | public var captureSessionPreset: CaptureSessionPreset = .hd4K3840x2160 35 | 36 | // 视频拍摄防抖模式 37 | public var captureVideoStabilizationMode: CaptureVideoStabilizationMode = .auto 38 | 39 | } 40 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Capture/Model/CaptureFlashMode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CaptureFlashMode.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/1. 6 | // 7 | 8 | import UIKit 9 | import AVFoundation 10 | 11 | // 拍摄闪光灯选项 12 | public enum CaptureFlashMode { 13 | case auto 14 | case on 15 | case off 16 | } 17 | 18 | extension CaptureFlashMode { 19 | 20 | var avFlashMode: AVCaptureDevice.FlashMode { 21 | switch self { 22 | case .auto: return .auto 23 | case .on: return .on 24 | case .off: return .off 25 | } 26 | } 27 | 28 | var cameraFlashMode: UIImagePickerController.CameraFlashMode { 29 | switch self { 30 | case .auto: return .auto 31 | case .on: return .on 32 | case .off: return .off 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Capture/Model/CaptureSessionPreset.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CaptureSessionPreset.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/1. 6 | // 7 | 8 | import UIKit 9 | import AVFoundation 10 | 11 | // 拍摄视频预设 12 | public enum CaptureSessionPreset { 13 | case cif352x288 14 | case vga640x480 15 | case hd1280x720 16 | case hd1920x1080 17 | case hd4K3840x2160 18 | } 19 | 20 | extension CaptureSessionPreset { 21 | 22 | var avSessionPreset: AVCaptureSession.Preset { 23 | switch self { 24 | case .cif352x288: return .cif352x288 25 | case .vga640x480: return .vga640x480 26 | case .hd1280x720: return .hd1280x720 27 | case .hd1920x1080: return .hd1920x1080 28 | case .hd4K3840x2160: return .hd4K3840x2160 29 | } 30 | } 31 | 32 | var size: CGSize { 33 | switch self { 34 | case .cif352x288: return CGSize(width: 352, height: 288) 35 | case .vga640x480: return CGSize(width: 640, height: 480) 36 | case .hd1280x720: return CGSize(width: 1280, height: 720) 37 | case .hd1920x1080: return CGSize(width: 1920, height: 1080) 38 | case .hd4K3840x2160: return CGSize(width: 3840, height: 2160) 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Capture/Model/CaptureVideoFileType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CaptureVideoFileType.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/1. 6 | // 7 | 8 | import UIKit 9 | import AVFoundation 10 | 11 | // 拍摄视频格式 12 | public enum CaptureVideoFileType { 13 | case mp4 14 | case mov 15 | } 16 | 17 | extension CaptureVideoFileType { 18 | 19 | var avFileType: AVFileType { 20 | switch self { 21 | case .mov: return .mov 22 | case .mp4: return .mp4 23 | } 24 | } 25 | 26 | var suffix: String { 27 | switch self { 28 | case .mov: return ".mov" 29 | case .mp4: return ".mp4" 30 | } 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Capture/Model/CaptureVideoStabilizationMode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CaptureVideoStabilizationMode.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/4. 6 | // 7 | 8 | import UIKit 9 | import AVFoundation 10 | 11 | // 拍摄视频稳定配置 12 | public enum CaptureVideoStabilizationMode { 13 | case auto 14 | case off 15 | case standard 16 | case cinematic 17 | @available(iOS 13.0, *) 18 | case cinematicExtended 19 | } 20 | 21 | extension CaptureVideoStabilizationMode { 22 | 23 | var avPreferredVideoStabilizationMode: AVCaptureVideoStabilizationMode { 24 | switch self { 25 | case .auto: return .auto 26 | case .off: return .off 27 | case .standard: return .standard 28 | case .cinematic: return .cinematic 29 | case .cinematicExtended: 30 | if #available(iOS 13.0, *) { 31 | return .cinematicExtended 32 | } 33 | return .auto 34 | } 35 | } 36 | 37 | } 38 | 39 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Config/UserInterfaceStyle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserInterfaceStyle.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/24. 6 | // 7 | 8 | import UIKit 9 | 10 | // 颜色配置 11 | public enum UserInterfaceStyle { 12 | case auto 13 | case light 14 | case dark 15 | } 16 | 17 | extension UIColor { 18 | 19 | static func color(light: UIColor, dark: UIColor, style: UserInterfaceStyle) -> UIColor { 20 | switch style { 21 | case .auto: 22 | if #available(iOS 13.0, *) { 23 | return UIColor { traitCollection -> UIColor in 24 | if traitCollection.userInterfaceStyle == .dark { 25 | return dark 26 | } else { 27 | return light 28 | } 29 | } 30 | } else { 31 | return light 32 | } 33 | case .light: 34 | return light 35 | case .dark: 36 | return dark 37 | } 38 | } 39 | 40 | } 41 | 42 | extension UIStatusBarStyle { 43 | 44 | static func statusBarStyle(style: UserInterfaceStyle) -> UIStatusBarStyle { 45 | switch style { 46 | case .auto: 47 | return .default 48 | case .light: 49 | if #available(iOS 13.0, *) { 50 | return .darkContent 51 | } else { 52 | return .default 53 | } 54 | case .dark: 55 | return .lightContent 56 | } 57 | 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Config/WLPhotoConfig.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WLPhotoConfig.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/11. 6 | // 7 | 8 | import UIKit 9 | 10 | // Picker 配置类 11 | public class WLPhotoConfig { 12 | 13 | public init() { } 14 | 15 | public static let `default` = WLPhotoConfig() 16 | 17 | // 照片选择参数 18 | public var pickerConfig = PickerConfig() 19 | 20 | // 照片编辑参数 21 | public var photoEditConfig = PhotoEditConfig() 22 | 23 | // 相机拍摄参数 24 | public var captureConfig = CaptureConfig() 25 | 26 | } 27 | 28 | public extension WLPhotoConfig { 29 | 30 | // 检测配置项 31 | func checkCongfig() -> WLPhotoConfig { 32 | if !pickerConfig.selectableType.contains(.photo) { 33 | pickerConfig.allowTakingPhoto = false 34 | } 35 | if !pickerConfig.selectableType.contains(.video) { 36 | pickerConfig.allowTakingVideo = false 37 | } 38 | return self 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Config/WLPhotoUIConfig.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WLPhotoUIConfig.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/11. 6 | // 7 | 8 | import UIKit 9 | 10 | // UI配置类 11 | public class WLPhotoUIConfig { 12 | 13 | private init() { } 14 | 15 | public static let `default` = WLPhotoUIConfig() 16 | 17 | // 颜色配置,包括背景颜色,按钮颜色等 18 | public var color: ColorConfig = .default 19 | 20 | // 暗黑模式 21 | public var userInterfaceStyle: UserInterfaceStyle = .auto { 22 | didSet { 23 | color.userInterfaceStyle = userInterfaceStyle 24 | } 25 | } 26 | 27 | // 语言 28 | public var language: LanguageType = .automatic 29 | 30 | // 自定义显示文字 31 | public var localizedText: [LocalizedKey: String] = [:] 32 | 33 | } 34 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Error/AssetFetchError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AssetFetchError.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | public enum AssetFetchError: Error { 11 | // Fetch 12 | case invalidInfo 13 | case canceled 14 | case failedToFetchPhoto 15 | case failedToFetchGIF 16 | case failedToFetchLivePhoto 17 | case failedToFetchVideo 18 | 19 | // Export 20 | case failedToExportPhoto 21 | case failedToExportVideo 22 | 23 | // Other 24 | case underlying(Error) 25 | } 26 | 27 | extension AssetFetchError: LocalizedError { 28 | 29 | public var errorDescription: String? { 30 | switch self { 31 | case .invalidInfo: 32 | return BundleHelper.localizedString(.InvalidInfo) 33 | case .canceled: 34 | return BundleHelper.localizedString(.Canceled) 35 | case .failedToFetchPhoto: 36 | return BundleHelper.localizedString(.FailedToFetchPhoto) 37 | case .failedToFetchGIF: 38 | return BundleHelper.localizedString(.FailedToFetchGIF) 39 | case .failedToFetchLivePhoto: 40 | return BundleHelper.localizedString(.FailedToFetchLivePhoto) 41 | case .failedToFetchVideo: 42 | return BundleHelper.localizedString(.FailedToFetchVideo) 43 | case .failedToExportPhoto: 44 | return BundleHelper.localizedString(.FailedToExportPhoto) 45 | case .failedToExportVideo: 46 | return BundleHelper.localizedString(.FailedToExportVideo) 47 | case .underlying(let error): 48 | return error.localizedDescription 49 | } 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Error/CaptureError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CaptureError.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/1. 6 | // 7 | 8 | import UIKit 9 | 10 | public enum CaptureError { 11 | case failedToInitializeCameraDevice 12 | case failedToInitializeMicrophoneDevice 13 | case cameraPermissionDenied 14 | case microphonePermissionDenied 15 | case underlying(Error) 16 | } 17 | 18 | extension CaptureError: LocalizedError { 19 | 20 | public var errorDescription: String? { 21 | switch self { 22 | case .failedToInitializeCameraDevice: 23 | return BundleHelper.localizedString(.FailedToInitializeCameraDevice) 24 | case .failedToInitializeMicrophoneDevice: 25 | return BundleHelper.localizedString(.FailedToInitializeMicrophoneDevice) 26 | case .cameraPermissionDenied: 27 | return BundleHelper.localizedString(.CameraPermissionDenied, UIApplication.shared.appName ?? "") 28 | case .microphonePermissionDenied: 29 | return BundleHelper.localizedString(.MicrophonePermissionDenied, UIApplication.shared.appName ?? "") 30 | case .underlying(let error): 31 | return error.localizedDescription 32 | } 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Error/VideoExportError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VideoExportError.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/5. 6 | // 7 | 8 | import UIKit 9 | 10 | public enum VideoCompressError: Error { 11 | case failedToLoadAsset 12 | case failedToWriteAsset 13 | case underlying(Error) 14 | } 15 | 16 | extension VideoCompressError: LocalizedError { 17 | 18 | public var errorDescription: String? { 19 | switch self { 20 | case .failedToLoadAsset: 21 | return BundleHelper.localizedString(.FailedToLoadAsset) 22 | case .failedToWriteAsset: 23 | return BundleHelper.localizedString(.FailedToWriteAsset) 24 | case .underlying(let error): 25 | return error.localizedDescription 26 | } 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Permission/Permission.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Permission.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/14. 6 | // 7 | 8 | import UIKit 9 | 10 | protocol Permission { 11 | static var isAuthorized: Bool { get } 12 | static var status: PermissionStatus { get } 13 | static func requestPermission(_ closure: @escaping (PermissionStatus) -> ()) 14 | } 15 | 16 | extension Permission { 17 | 18 | static var isAuthorized: Bool { 19 | return status == .authorized 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Permission/PermissionStatus.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PermissionStatus.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/14. 6 | // 7 | 8 | enum PermissionStatus { 9 | case authorized 10 | case denied 11 | case notDetermined 12 | case invalid 13 | case limited 14 | case restricted 15 | 16 | var description: String { 17 | switch self { 18 | case .authorized: return "Authorized" 19 | case .denied: return "Denied" 20 | case .notDetermined: return "Not Determined" 21 | case .invalid: return "Invalid" 22 | case .limited: return "Limited" 23 | case .restricted: return "Restricted" 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Permission/PermissionType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PermissionType.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/14. 6 | // 7 | 8 | import Foundation 9 | 10 | enum PermissionType { 11 | case photoLibrary 12 | case microphone 13 | case camera 14 | } 15 | 16 | extension PermissionType { 17 | 18 | public var permission: Permission.Type { 19 | switch self { 20 | case .photoLibrary: return PhotoLibrary.self 21 | case .camera: return Camera.self 22 | case .microphone: return Microphone.self 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Permission/Permissions/Camera.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Camera.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/14. 6 | // 7 | 8 | import AVFoundation 9 | 10 | struct Camera: Permission { 11 | 12 | static var status: PermissionStatus { 13 | let status = AVCaptureDevice.authorizationStatus(for: .video) 14 | switch status { 15 | case .authorized: return .authorized 16 | case .denied: return .denied 17 | case .notDetermined: return .notDetermined 18 | case .restricted: return .restricted 19 | @unknown default: return .invalid 20 | } 21 | } 22 | 23 | static func requestPermission(_ closure: @escaping (PermissionStatus) -> ()) { 24 | guard status == .notDetermined else { 25 | closure(status) 26 | return 27 | } 28 | AVCaptureDevice.requestAccess(for: .video) { _ in 29 | closure(self.status) 30 | } 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Permission/Permissions/Microphone.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Microphone.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/14. 6 | // 7 | 8 | import AVFoundation 9 | 10 | class Microphone: Permission { 11 | 12 | static var status: PermissionStatus { 13 | let status = AVAudioSession.sharedInstance().recordPermission 14 | switch status { 15 | case .granted: return .authorized 16 | case .undetermined: return .notDetermined 17 | case .denied: return .denied 18 | @unknown default: return .invalid 19 | } 20 | } 21 | 22 | static func requestPermission(_ closure: @escaping (PermissionStatus) -> ()) { 23 | guard status == .notDetermined else { 24 | closure(status) 25 | return 26 | } 27 | AVAudioSession.sharedInstance().requestRecordPermission { _ in 28 | closure(status) 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Permission/Permissions/PhotoLibrary.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoLibrary.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/14. 6 | // 7 | 8 | import Photos 9 | 10 | struct PhotoLibrary: Permission { 11 | 12 | static var status: PermissionStatus { 13 | let status: PHAuthorizationStatus 14 | if #available(iOS 14.0, *) { 15 | status = PHPhotoLibrary.authorizationStatus(for: .readWrite) 16 | } else { 17 | status = PHPhotoLibrary.authorizationStatus() 18 | } 19 | switch status { 20 | case .authorized: return .authorized 21 | case .denied: return .denied 22 | case .notDetermined: return .notDetermined 23 | case .restricted: return .restricted 24 | case .limited: return .limited 25 | @unknown default: return .invalid 26 | } 27 | } 28 | 29 | static func requestPermission(_ closure: @escaping (PermissionStatus) -> ()) { 30 | guard status == .notDetermined else { 31 | closure(status) 32 | return 33 | } 34 | if #available(iOS 14.0, *) { 35 | PHPhotoLibrary.requestAuthorization(for: .readWrite) { _ in 36 | closure(status) 37 | } 38 | } else { 39 | PHPhotoLibrary.requestAuthorization { _ in 40 | closure(status) 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Tools/Fetch/AssetFetchRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AssetFetchRequest.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/22. 6 | // 7 | 8 | import Photos 9 | 10 | // 图片请求request对象 11 | public class AssetFetchRequest { 12 | 13 | private let requestId: PHImageRequestID 14 | 15 | init(requestId: PHImageRequestID) { 16 | self.requestId = requestId 17 | } 18 | 19 | public func requestIdIs(_ requestId: PHImageRequestID) -> Bool { 20 | requestId == requestId 21 | } 22 | 23 | public func cancel() { 24 | PHImageManager.default().cancelImageRequest(requestId) 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Tools/Fetch/AssetFetchResponse.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AssetExpertResponse.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/15. 6 | // 7 | 8 | import UIKit 9 | import Photos 10 | import AVKit 11 | 12 | // 图片请求结果 13 | struct PhotoFetchResponse { 14 | public let photo: UIImage 15 | public let isDegraded: Bool 16 | } 17 | 18 | // iCloud data请求结果 19 | struct CloudPhotoFetchResponse { 20 | public let data: Data 21 | public let dataUTI: String 22 | } 23 | 24 | // 实况照片请求结果 25 | struct LivePhotoFetchResponse { 26 | public let livePhoto: PHLivePhoto 27 | } 28 | 29 | // GIF请求结果 30 | struct GIFFetchResponse { 31 | public let image: UIImage 32 | public let imageData: Data 33 | } 34 | 35 | // 视频请求结果 36 | struct VideoFetchResponse { 37 | public let avasset: AVAsset 38 | public let playerItem: AVPlayerItem 39 | } 40 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Tools/Fetch/WeakAssetFetchToolDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WeakAssetFetchToolDelegate.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/24. 6 | // 7 | 8 | import UIKit 9 | 10 | final class WeakAssetFetchToolDelegate { 11 | 12 | private(set) weak var value: AssetFetchToolDelegate? 13 | 14 | init(value: AssetFetchToolDelegate?) { 15 | self.value = value 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Tools/Generator/ImageGenerator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageGenerator.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/4/12. 6 | // 7 | 8 | import UIKit 9 | 10 | public class ImageGenerator { 11 | 12 | static public func createImage(_ data: Data) -> UIImage? { 13 | guard var image = CIImage(data: data) else { 14 | return nil 15 | } 16 | 17 | if let source = CGImageSourceCreateWithData(data as CFData, nil), 18 | let metadata = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any], 19 | let orlginalOrientation = metadata[kCGImagePropertyOrientation as String] as? Int32 { 20 | image = image.oriented(forExifOrientation: orlginalOrientation) 21 | } 22 | 23 | guard let cgImage = CIContext().createCGImage(image, from: image.extent) else { 24 | return nil 25 | } 26 | return UIImage(cgImage: cgImage) 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Tools/Save/AssetSaveManager+SaveLivePhoto.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AssetSaveManager+SaveLivePhoto.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/4/11. 6 | // 7 | 8 | import UIKit 9 | import Photos 10 | 11 | public extension AssetSaveManager { 12 | 13 | static func saveLivePhoto(photoURL: URL, videoURL: URL, success: AssetSaveSuccess? = nil, failure: AssetSaveFailure? = nil) { 14 | var localIdentifier: String = "" 15 | let changes = { 16 | let request = PHAssetCreationRequest.forAsset() 17 | request.addResource(with: .photo, fileURL: photoURL, options: nil) 18 | request.addResource(with: .pairedVideo, fileURL: videoURL, options: nil) 19 | localIdentifier = request.placeholderForCreatedAsset?.localIdentifier ?? "" 20 | } 21 | PHPhotoLibrary.shared().performChanges(changes) { _, error in 22 | DispatchQueue.main.async { 23 | if let asset = PHAsset.fetchAssets(withLocalIdentifiers: [localIdentifier], options: nil).firstObject { 24 | success?(asset) 25 | } else { 26 | failure?(error) 27 | } 28 | } 29 | } 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Tools/Save/AssetSaveManager+SaveVideo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AssetSaveManager+SaveVideo.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/4. 6 | // 7 | 8 | import UIKit 9 | import Photos 10 | 11 | public extension AssetSaveManager { 12 | 13 | static func saveVideo(videoURL: URL, success: AssetSaveSuccess? = nil, failure: AssetSaveFailure? = nil) { 14 | var localIdentifier: String = "" 15 | let changes = { 16 | guard let request = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoURL) else { 17 | failure?(nil) 18 | return 19 | } 20 | localIdentifier = request.placeholderForCreatedAsset?.localIdentifier ?? "" 21 | } 22 | PHPhotoLibrary.shared().performChanges(changes) { _, error in 23 | DispatchQueue.main.async { 24 | if let asset = PHAsset.fetchAssets(withLocalIdentifiers: [localIdentifier], options: nil).firstObject { 25 | success?(asset) 26 | } else { 27 | failure?(error) 28 | } 29 | } 30 | } 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Core/Tools/Save/AssetSaveManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AssetSaveManager.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/4/12. 6 | // 7 | 8 | import UIKit 9 | import Photos 10 | 11 | public typealias AssetSaveSuccess = (PHAsset) -> Void 12 | public typealias AssetSaveFailure = (Error?) -> Void 13 | 14 | public class AssetSaveManager { } 15 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Edit/Model/Filters/PhotoEditCIFilter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditCIFilter.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/4/27. 6 | // 7 | 8 | import UIKit 9 | 10 | public class PhotoEditCIFilter: PhotoEditFilterProvider { 11 | 12 | public var name: String 13 | public let filterName: String 14 | 15 | public init(name: String, filterName: String) { 16 | self.name = name 17 | self.filterName = filterName 18 | } 19 | 20 | public var filter: FilterProviderClosure? { 21 | let filterName = self.filterName 22 | return { image in 23 | guard let ciImage = image?.toCIImage() else { 24 | return image 25 | } 26 | let filter = CIFilter(name: filterName) 27 | filter?.setValue(ciImage, forKey: kCIInputImageKey) 28 | guard let outputImage = filter?.outputImage?.toUIImage() else { 29 | return image 30 | } 31 | return outputImage 32 | } 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Edit/Model/Filters/PhotoEditClarendonFilter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditClarendonFilter.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/10. 6 | // 7 | 8 | import UIKit 9 | 10 | public class PhotoEditClarendonFilter: PhotoEditFilterProvider { 11 | 12 | public var name: String { 13 | "Clarendon" 14 | } 15 | 16 | public var filter: FilterProviderClosure? { 17 | return { image in 18 | guard let ciImage = image?.toCIImage() else { 19 | return image 20 | } 21 | let color = CIColor(red: CGFloat(127.0 / 255.0), 22 | green: CGFloat(187.0 / 255.0), 23 | blue: CGFloat(227.0 / 255.0), 24 | alpha: CGFloat(0.2)) 25 | let backgroundImage = CIImage(color: color).cropped(to: ciImage.extent) 26 | let outputCIImage = ciImage.applyingFilter("CIOverlayBlendMode", parameters: [ 27 | "inputBackgroundImage": backgroundImage 28 | ]) 29 | guard let outputImage = outputCIImage.toUIImage() else { 30 | return image 31 | } 32 | return outputImage 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Edit/Model/Filters/PhotoEditOriginalFilter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditOriginalFilter.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/10. 6 | // 7 | 8 | import UIKit 9 | 10 | class PhotoEditOriginalFilter: PhotoEditFilterProvider { 11 | 12 | public var name: String { 13 | "Original" 14 | } 15 | 16 | public var filter: FilterProviderClosure? { 17 | return nil 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Edit/Model/PhotoEditCropOrientation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditCropOrientation.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/4/7. 6 | // 7 | 8 | import UIKit 9 | 10 | enum PhotoEditCropOrientation { 11 | case left 12 | case right 13 | } 14 | 15 | extension PhotoEditCropOrientation { 16 | 17 | var imageOrientation: UIImage.Orientation { 18 | switch self { 19 | case .left: 20 | return .left 21 | case .right: 22 | return .right 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Edit/Model/PhotoEditCropRatio.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditCropRatio.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/13. 6 | // 7 | 8 | import UIKit 9 | 10 | public struct PhotoEditCropRatio { 11 | 12 | // width / height 13 | let ratio: CGFloat 14 | 15 | init(ratio: CGFloat) { 16 | self.ratio = ratio 17 | } 18 | 19 | static public let freedom = PhotoEditCropRatio(ratio: 0) 20 | static public let ratio_1_1 = PhotoEditCropRatio(ratio: 1) 21 | static public let ratio_16_9 = PhotoEditCropRatio(ratio: CGFloat(16) / CGFloat(9)) 22 | static public let ratio_9_16 = PhotoEditCropRatio(ratio: CGFloat(9) / CGFloat(16)) 23 | static public let ratio_4_3 = PhotoEditCropRatio(ratio: CGFloat(4) / CGFloat(3)) 24 | static public let ratio_3_4 = PhotoEditCropRatio(ratio: CGFloat(3) / CGFloat(4)) 25 | 26 | } 27 | 28 | extension PhotoEditCropRatio: Equatable { 29 | 30 | public static func == (lhs: Self, rhs: Self) -> Bool { 31 | return lhs.ratio == rhs.ratio 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Edit/Model/PhotoEditMaskLayer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditMaskLayer.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/9. 6 | // 7 | 8 | import UIKit 9 | 10 | protocol PhotoEditMaskLayer { 11 | var maskImage: UIImage { set get } 12 | var maskPadding: CGFloat { get } 13 | var size: CGSize { get } 14 | var center: CGPoint { set get } 15 | var id: Double { set get } 16 | var scale: CGFloat { set get } 17 | var rotation: CGFloat { set get } 18 | var translation: CGPoint { set get } 19 | } 20 | 21 | extension PhotoEditMaskLayer { 22 | 23 | var maskPadding: CGFloat { 24 | return 8 25 | } 26 | 27 | var imageSize: CGSize { 28 | let maximumSize: CGFloat = 120 29 | let imageRatio = maskImage.size.width / maskImage.size.height 30 | if imageRatio >= 1 { 31 | let height = maximumSize / imageRatio 32 | return CGSize(width: maximumSize, height: height) 33 | } else { 34 | let width = maximumSize * imageRatio 35 | return CGSize(width: width, height: maximumSize) 36 | } 37 | } 38 | 39 | var size: CGSize { 40 | let imageSize = self.imageSize 41 | return CGSize(width: imageSize.width + maskPadding * 2, height: imageSize.height + maskPadding * 2) 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Edit/Model/PhotoEditPasterMaskLayer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditPasterMaskLayer.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/9. 6 | // 7 | 8 | import UIKit 9 | 10 | struct PhotoEditPasterMaskLayer: PhotoEditMaskLayer { 11 | var id: Double 12 | var maskImage: UIImage 13 | 14 | var center: CGPoint = .zero 15 | var scale: CGFloat = 1 16 | var rotation: CGFloat = 0 17 | var translation: CGPoint = .zero 18 | 19 | init(maskImage: UIImage) { 20 | self.id = Date().timeIntervalSince1970 21 | self.maskImage = maskImage 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Edit/Model/PhotoEditPasterProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditPasterProvider.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/6. 6 | // 7 | 8 | import UIKit 9 | 10 | public enum PhotoEditPasterProvider { 11 | case imageName(String) 12 | case imagePath(String) 13 | 14 | // TODO: image URL 15 | // case imageURL(URL) 16 | } 17 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Edit/Model/PhotoEditTextColor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditTextColor.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/8. 6 | // 7 | 8 | import UIKit 9 | 10 | public class PhotoEditTextColor { 11 | 12 | let tintColor: UIColor 13 | let textColor: UIColor 14 | 15 | init(tintColor: UIColor, textColor: UIColor) { 16 | self.tintColor = tintColor 17 | self.textColor = textColor 18 | } 19 | 20 | } 21 | 22 | public extension PhotoEditTextColor { 23 | 24 | static var `default`: [PhotoEditTextColor] { 25 | [PhotoEditTextColor(tintColor: #colorLiteral(red: 0.9450979829, green: 0.9450982213, blue: 0.9494037032, alpha: 1), textColor: .black), 26 | PhotoEditTextColor(tintColor: #colorLiteral(red: 0.1638098657, green: 0.1687904298, blue: 0.168703407, alpha: 1), textColor: .white), 27 | PhotoEditTextColor(tintColor: #colorLiteral(red: 0.9752930999, green: 0.3147607744, blue: 0.3190720677, alpha: 1), textColor: .white), 28 | PhotoEditTextColor(tintColor: #colorLiteral(red: 0.9968875051, green: 0.7632474303, blue: 0, alpha: 1), textColor: .white), 29 | PhotoEditTextColor(tintColor: #colorLiteral(red: 0.02922653779, green: 0.7524088621, blue: 0.375612855, alpha: 1), textColor: .white), 30 | PhotoEditTextColor(tintColor: #colorLiteral(red: 0.05218506604, green: 0.6807786822, blue: 0.9946766496, alpha: 1), textColor: .white), 31 | PhotoEditTextColor(tintColor: #colorLiteral(red: 0.3903390169, green: 0.4003461599, blue: 0.9338593483, alpha: 1), textColor: .white)] 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Edit/Model/PhotoEditTextMaskLayer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditTextMaskLayer.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/9. 6 | // 7 | 8 | import UIKit 9 | 10 | struct PhotoEditTextMaskLayer: PhotoEditMaskLayer { 11 | 12 | var id: Double 13 | 14 | var maskImage: UIImage 15 | var text: String 16 | var isWrap: Bool 17 | var colorIndex: Int 18 | 19 | var center: CGPoint = .zero 20 | var scale: CGFloat = 1 21 | var rotation: CGFloat = 0 22 | var translation: CGPoint = .zero 23 | 24 | init(text: String, isWrap: Bool, colorIndex: Int, maskImage: UIImage) { 25 | self.id = Date().timeIntervalSince1970 26 | self.text = text 27 | self.isWrap = isWrap 28 | self.colorIndex = colorIndex 29 | self.maskImage = maskImage 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Edit/View/PhotoEditItemCollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditItemCollectionViewCell.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/7. 6 | // 7 | 8 | import UIKit 9 | 10 | class PhotoEditItemCollectionViewCell: UICollectionViewCell { 11 | 12 | private let iconImageView = UIImageView() 13 | 14 | override var isSelected: Bool { 15 | didSet { 16 | iconImageView.tintColor = isSelected ? WLPhotoUIConfig.default.color.primaryColor : .white 17 | } 18 | } 19 | 20 | override init(frame: CGRect) { 21 | super.init(frame: frame) 22 | 23 | iconImageView.tintColor = .white 24 | iconImageView.contentMode = .scaleAspectFit 25 | contentView.addSubview(iconImageView) 26 | iconImageView.snp.makeConstraints { make in 27 | make.center.equalToSuperview() 28 | make.height.width.equalTo(24) 29 | } 30 | } 31 | 32 | func bind(_ type: PhotoEditItemType) { 33 | iconImageView.image = type.iconImage?.withRenderingMode(.alwaysTemplate) 34 | } 35 | 36 | required init?(coder: NSCoder) { 37 | fatalError("init(coder:) has not been implemented") 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Edit/View/PhotoEditPasterCollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhotoEditPasterCollectionViewCell.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/6. 6 | // 7 | 8 | import UIKit 9 | 10 | class PhotoEditPasterCollectionViewCell: UICollectionViewCell { 11 | 12 | private let imageView = UIImageView() 13 | 14 | override init(frame: CGRect) { 15 | super.init(frame: frame) 16 | 17 | imageView.clipsToBounds = true 18 | imageView.contentMode = .scaleAspectFit 19 | contentView.addSubview(imageView) 20 | imageView.snp.makeConstraints { make in 21 | make.edges.equalToSuperview() 22 | } 23 | } 24 | 25 | func bind(_ paster: PhotoEditPasterProvider) { 26 | switch paster { 27 | case .imageName(let name): 28 | imageView.image = UIImage(named: name) 29 | case .imagePath(let path): 30 | imageView.image = UIImage(contentsOfFile: path) 31 | } 32 | } 33 | 34 | required init?(coder: NSCoder) { 35 | fatalError("init(coder:) has not been implemented") 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Extensions/AVAsset+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AVAsset+Extensions.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/19. 6 | // 7 | 8 | import UIKit 9 | import AVFoundation 10 | 11 | public extension AVAsset { 12 | 13 | func getVideoThumbnailImage(completion: @escaping (UIImage?) -> Void) { 14 | let generator = AVAssetImageGenerator(asset: self) 15 | generator.appliesPreferredTrackTransform = true 16 | generator.requestedTimeToleranceAfter = .zero 17 | generator.requestedTimeToleranceBefore = .zero 18 | let time = NSValue(time: CMTime(seconds: 0, preferredTimescale: 1000)) 19 | generator.generateCGImagesAsynchronously(forTimes: [time]) { (_, cgImage, _, _, _) in 20 | if let image = cgImage { 21 | completion(UIImage(cgImage: image)) 22 | } else { 23 | completion(nil) 24 | } 25 | } 26 | } 27 | 28 | func thumbnailImage() -> UIImage? { 29 | let generator = AVAssetImageGenerator(asset: self) 30 | generator.appliesPreferredTrackTransform = true 31 | generator.requestedTimeToleranceAfter = .zero 32 | generator.requestedTimeToleranceBefore = .zero 33 | let time = CMTime(seconds: 0, preferredTimescale: 1000) 34 | if let image = try? generator.copyCGImage(at: time, actualTime: nil) { 35 | return UIImage(cgImage: image) 36 | } 37 | return nil 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Extensions/AVCaptureDevice+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AVCaptureDevice+Extensions.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/4. 6 | // 7 | 8 | import UIKit 9 | import AVFoundation 10 | 11 | extension AVCaptureDevice { 12 | 13 | func availableActiveFormat(for captureConfig: CaptureConfig) -> AVCaptureDevice.Format? { 14 | let formats = formats.filter { format in 15 | let dimensions = CMVideoFormatDescriptionGetDimensions(format.formatDescription) 16 | let presetSize = captureConfig.captureSessionPreset.size 17 | 18 | let sizeSupport = CGFloat(dimensions.width) == presetSize.width && CGFloat(dimensions.height) == presetSize.height 19 | 20 | let frameRateSupport = format.videoSupportedFrameRateRanges.filter { 21 | return $0.maxFrameRate >= captureConfig.captureVideoFrameRate 22 | }.count > 0 23 | 24 | let stabilizationMode = captureConfig.captureVideoStabilizationMode.avPreferredVideoStabilizationMode 25 | let stabilizationModeSupport = format.isVideoStabilizationModeSupported(stabilizationMode) 26 | 27 | return sizeSupport && frameRateSupport && stabilizationModeSupport 28 | } 29 | return formats.last 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Extensions/CGFloat+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CGFloat+Extensions.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/4/19. 6 | // 7 | 8 | import UIKit 9 | 10 | extension CGFloat { 11 | 12 | func between(min: CGFloat, max: CGFloat) -> CGFloat { 13 | if self < min { 14 | return min 15 | } 16 | if self > max { 17 | return max 18 | } 19 | return self 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Extensions/CGRect+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CGRect+Extensions.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/4/18. 6 | // 7 | 8 | import UIKit 9 | 10 | extension CGRect { 11 | 12 | func rounded() -> CGRect { 13 | CGRect(x: origin.x.rounded(), 14 | y: origin.y.rounded(), 15 | width: size.width.rounded(), 16 | height: size.height.rounded()) 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Extensions/CGSize+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CGSize+Extensions.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/31. 6 | // 7 | 8 | import UIKit 9 | 10 | extension CGSize { 11 | 12 | var ratio: CGFloat { 13 | width / height 14 | } 15 | 16 | var turn: CGSize { 17 | CGSize(width: height, height: width) 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Extensions/CoreImage+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CoreImage+Extensions.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/17. 6 | // 7 | 8 | import CoreImage 9 | 10 | extension CIImage { 11 | 12 | func toUIImage() -> UIImage? { 13 | guard let cgImage = CIContext().createCGImage(self, from: extent) else { 14 | return nil 15 | } 16 | return UIImage(cgImage: cgImage) 17 | } 18 | 19 | } 20 | 21 | extension UIImage { 22 | 23 | func toCIImage() -> CIImage? { 24 | if let ciImage = self.ciImage { 25 | return ciImage 26 | } 27 | if let cgImage = self.cgImage { 28 | return CIImage(cgImage: cgImage) 29 | } 30 | return nil 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Extensions/PHAssetCollection+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PHAssetCollection+Extensions.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/10. 6 | // 7 | 8 | import UIKit 9 | import Photos 10 | 11 | extension PHAssetCollection { 12 | 13 | var isCameraRollAlbum: Bool { 14 | assetCollectionSubtype == .smartAlbumUserLibrary 15 | } 16 | 17 | var isHiddenAlbum: Bool { 18 | assetCollectionSubtype == .smartAlbumAllHidden 19 | } 20 | 21 | var isRecentlyDeletedAlbum: Bool { 22 | assetCollectionSubtype.rawValue == 1000000201 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Extensions/PHFetchResult+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PHFetchResult+Extensions.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2021/12/11. 6 | // 7 | 8 | import UIKit 9 | import Photos 10 | 11 | extension PHFetchResult where ObjectType == PHAssetCollection { 12 | 13 | var objects: [PHAssetCollection] { 14 | var objects: [PHAssetCollection] = [] 15 | for i in 0.. UIImage? { 17 | return UIImage(named: name, in: bundle, compatibleWith: nil) 18 | } 19 | 20 | static func localizedString(_ key: LocalizedKey, _ args: CVarArg...) -> String { 21 | if let text = WLPhotoUIConfig.default.localizedText[key] { 22 | return text 23 | } 24 | let bundlePath: String 25 | if let path = bundle.path(forResource: WLPhotoUIConfig.default.language.bundleName, ofType: "lproj") { 26 | bundlePath = path 27 | } else if let path = bundle.path(forResource: "en", ofType: "lproj") { 28 | bundlePath = path 29 | } else { 30 | return "" 31 | } 32 | guard let bundle = Bundle(path: bundlePath) else { 33 | return "" 34 | } 35 | let value = bundle.localizedString(forKey: key.rawValue, value: nil, table: nil) 36 | let text = Bundle.main.localizedString(forKey: key.rawValue, value: value, table: nil) 37 | return String(format: text, args) 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Helper/CoreTextHelper.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CoreTextHelper.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/8. 6 | // 7 | 8 | import UIKit 9 | 10 | class CoreTextHelper { 11 | 12 | static func getLineRectsFrom(_ attributedString: NSAttributedString, containerWidth: CGFloat) -> [CGRect] { 13 | let path = CGMutablePath() 14 | path.addRect(CGRect(origin: .zero, size: CGSize(width: containerWidth, height: CGFloat(MAXFLOAT)))) 15 | 16 | let ctFrameSetter = CTFramesetterCreateWithAttributedString(attributedString) 17 | let cfRange = CFRange(location: 0, length: attributedString.length) 18 | let ctFrame = CTFramesetterCreateFrame(ctFrameSetter, cfRange, path, nil) 19 | let ctLines = CTFrameGetLines(ctFrame) 20 | let lineCount = CFArrayGetCount(ctLines) 21 | guard lineCount > 0 else { 22 | return [] 23 | } 24 | var rects: [CGRect] = [] 25 | for i in 0.. String { 13 | let splits = preferredLanguage.split(separator: "-").map { String($0) } 14 | switch splits.count { 15 | case 1, 2: return splits[0] 16 | case 3: return splits[0] + "-" + splits[1] 17 | default: return "" 18 | } 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /WLPhotoPicker/Classes/Helper/MD5.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MD5.swift 3 | // WLPhotoPicker 4 | // 5 | // Created by Mr.Wang on 2022/1/5. 6 | // 7 | 8 | import CommonCrypto 9 | 10 | extension String { 11 | /* ################################################################## */ 12 | var md5: String { 13 | guard let str = cString(using: String.Encoding.utf8) else { 14 | return self 15 | } 16 | let strLen = CUnsignedInt(lengthOfBytes(using: String.Encoding.utf8)) 17 | let digestLen = Int(CC_MD5_DIGEST_LENGTH) 18 | let result = UnsafeMutablePointer.allocate(capacity: digestLen) 19 | CC_MD5(str, strLen, result) 20 | let hash = NSMutableString() 21 | for i in 0..