├── .codebeatsettings
├── .github
└── FUNDING.yml
├── .gitignore
├── .swiftlint.yml
├── .swiftpm
└── xcode
│ └── package.xcworkspace
│ └── contents.xcworkspacedata
├── Documentation
├── README_CN.md
├── RELEASE_NOTE.md
├── RELEASE_NOTE_CN.md
├── Support
│ ├── ap.jpeg
│ ├── bmc_qr.png
│ ├── sample_graph.png
│ ├── sample_graph_en.png
│ └── wp.jpeg
└── Wiki
│ ├── EDITOR_GUIDE.md
│ ├── GUIDE.md
│ ├── HOME.md
│ ├── INSTALLATION.md
│ └── PICKER_GUIDE.md
├── Example
├── AppDelegate.swift
├── Classes
│ ├── Controller
│ │ ├── AvatarPickerConfigurationViewController.swift
│ │ ├── CustomPickerCellViewController.swift
│ │ ├── EditorConfigurationViewController.swift
│ │ ├── HomeViewController.swift
│ │ ├── PhotoBrowserViewController.swift
│ │ ├── PickerColorConfigurationViewController.swift
│ │ ├── PickerConfigurationViewController.swift
│ │ ├── PickerResultViewController.swift
│ │ ├── PickerResultViewController.xib
│ │ ├── TestEditorViewController.swift
│ │ ├── WeChatMometViewController.swift
│ │ ├── WeChatViewController.swift
│ │ └── WindowPickerViewController.swift
│ ├── Example-Bridging-Header.h
│ ├── Extension
│ │ ├── Core+UIColor.swift
│ │ ├── RowTypeRule.swift
│ │ ├── String+Extension.swift
│ │ ├── UIDevice+Extension.swift
│ │ ├── UIFont+Extension.swift
│ │ └── UIImage+Extension.swift
│ ├── Model
│ │ ├── GPUImageBeautifyFilter.h
│ │ ├── GPUImageBeautifyFilter.m
│ │ ├── ImageFilter.swift
│ │ └── Tools.swift
│ └── View
│ │ ├── ConfigurationViewCell.swift
│ │ └── CustomPickerCellView.swift
├── Example.entitlements
├── Info.plist
└── Resources
│ ├── Assets.xcassets
│ ├── AccentColor.colorset
│ │ └── Contents.json
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── Icon-1024.png
│ │ ├── Icon-60@2x.png
│ │ ├── Icon-60@3x.png
│ │ ├── Icon-76.png
│ │ ├── Icon-76@2x.png
│ │ ├── Icon-83.5@2x.png
│ │ ├── Icon-Notify.png
│ │ ├── Icon-Notify@2x.png
│ │ ├── Icon-Notify@3x.png
│ │ ├── Icon-Small-40.png
│ │ ├── Icon-Small-40@2x.png
│ │ ├── Icon-Small-40@3x.png
│ │ ├── Icon-Small.png
│ │ ├── Icon-Small@2x.png
│ │ └── Icon-Small@3x.png
│ ├── Contents.json
│ ├── camera_overturn.imageset
│ │ ├── Contents.json
│ │ ├── camera_overturn@2x.png
│ │ └── camera_overturn@3x.png
│ ├── hx_compose_delete.imageset
│ │ ├── Contents.json
│ │ ├── hx_compose_delete@2x.png
│ │ └── hx_compose_delete@3x.png
│ ├── hx_photo_edit_tools_clip.imageset
│ │ ├── Contents.json
│ │ ├── hx_photo_edit_tools_clip@2x.png
│ │ └── hx_photo_edit_tools_clip@3x.png
│ ├── hx_photo_edit_tools_emoji.imageset
│ │ ├── Contents.json
│ │ ├── hx_photo_edit_tools_emoji@2x.png
│ │ └── hx_photo_edit_tools_emoji@3x.png
│ ├── hx_photo_edit_tools_graffiti.imageset
│ │ ├── Contents.json
│ │ ├── hx_photo_edit_tools_graffiti@2x.png
│ │ └── hx_photo_edit_tools_graffiti@3x.png
│ ├── hx_photo_edit_tools_mosaic.imageset
│ │ ├── Contents.json
│ │ ├── hx_photo_edit_tools_mosaic@2x.png
│ │ └── hx_photo_edit_tools_mosaic@3x.png
│ ├── hx_photo_edit_tools_text.imageset
│ │ ├── Contents.json
│ │ ├── hx_photo_edit_tools_text@2x.png
│ │ └── hx_photo_edit_tools_text@3x.png
│ ├── hx_picker_add_img.imageset
│ │ ├── Contents.json
│ │ ├── hx_picker_add_img@2x.png
│ │ └── hx_picker_add_img@3x.png
│ ├── hx_picker_cell_video_play.imageset
│ │ ├── Contents.json
│ │ ├── hx_picker_cell_video_play@2x.png
│ │ └── hx_picker_cell_video_play@3x.png
│ ├── hx_sticker_cover.imageset
│ │ ├── Contents.json
│ │ ├── hx_sticker_cover@2x.png
│ │ └── hx_sticker_cover@3x.png
│ ├── select_photo.imageset
│ │ ├── Contents.json
│ │ ├── select_photo@2x.png
│ │ └── select_photo@3x.png
│ └── wx_head_icon.imageset
│ │ ├── Contents.json
│ │ └── wx_head_icon@2x.png
│ ├── Base.lproj
│ └── LaunchScreen.storyboard
│ ├── Images
│ ├── hx_sticker_chongya.png
│ ├── hx_sticker_haoxinqing.png
│ ├── hx_sticker_housailei.png
│ ├── hx_sticker_jintianfenkeai.png
│ ├── hx_sticker_keaibiaoq.png
│ ├── hx_sticker_kehaixing.png
│ ├── hx_sticker_saihong.png
│ ├── hx_sticker_wow.png
│ ├── hx_sticker_woxiangfazipai.png
│ ├── hx_sticker_xiaochuzhujiao.png
│ ├── hx_sticker_yuanqimanman.png
│ ├── hx_sticker_yuanqishaonv.png
│ ├── hx_sticker_zaizaijia.png
│ ├── livephoto_image.jpeg
│ ├── love.png
│ ├── love_text.png
│ ├── picker_example_gif_image.GIF
│ ├── picker_example_image.JPG
│ ├── portrait.png
│ ├── qiy.png
│ ├── stars.png
│ └── text.png
│ ├── Music
│ ├── 世间美好与你环环相扣
│ ├── 世间美好与你环环相扣.mp3
│ ├── 嘉宾
│ ├── 嘉宾.mp3
│ ├── 天外来物
│ ├── 天外来物.mp3
│ ├── 少女的祈祷
│ ├── 少女的祈祷.mp3
│ ├── 无赖
│ ├── 无赖.mp3
│ ├── 时光正好
│ ├── 时光正好.mp3
│ ├── 爱你
│ ├── 爱你.mp3
│ ├── 野孩子
│ └── 野孩子.mp3
│ └── Video
│ └── livephoto_video.mp4
├── HXPHPicker-Lite.podspec
├── HXPHPicker.podspec
├── HXPHPicker.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── xcshareddata
│ └── xcschemes
│ ├── Example.xcscheme
│ └── HXPHPicker.xcscheme
├── HXPHPicker.xcworkspace
├── contents.xcworkspacedata
└── xcshareddata
│ ├── IDEWorkspaceChecks.plist
│ └── WorkspaceSettings.xcsettings
├── LICENSE
├── Package.resolved
├── Package.swift
├── Podfile
├── Podfile.lock
├── Pods
├── GDPerformanceView-Swift
│ ├── GDPerformanceView-Swift
│ │ └── GDPerformanceMonitoring
│ │ │ ├── LinkedFramesList.swift
│ │ │ ├── MarginLabel.swift
│ │ │ ├── PerformanceMonitor.swift
│ │ │ ├── PerformanceView.swift
│ │ │ ├── PerformanceСalculator.swift
│ │ │ ├── Protocols.swift
│ │ │ └── WindowViewController.swift
│ ├── LICENSE
│ └── README.md
├── Kingfisher
│ ├── LICENSE
│ ├── README.md
│ └── Sources
│ │ ├── Cache
│ │ ├── CacheSerializer.swift
│ │ ├── DiskStorage.swift
│ │ ├── FormatIndicatedCacheSerializer.swift
│ │ ├── ImageCache.swift
│ │ ├── MemoryStorage.swift
│ │ └── Storage.swift
│ │ ├── Extensions
│ │ ├── CPListItem+Kingfisher.swift
│ │ ├── ImageView+Kingfisher.swift
│ │ ├── NSButton+Kingfisher.swift
│ │ ├── NSTextAttachment+Kingfisher.swift
│ │ ├── TVMonogramView+Kingfisher.swift
│ │ ├── UIButton+Kingfisher.swift
│ │ └── WKInterfaceImage+Kingfisher.swift
│ │ ├── General
│ │ ├── ImageSource
│ │ │ ├── AVAssetImageDataProvider.swift
│ │ │ ├── ImageDataProvider.swift
│ │ │ ├── Resource.swift
│ │ │ └── Source.swift
│ │ ├── KF.swift
│ │ ├── KFOptionsSetter.swift
│ │ ├── Kingfisher.swift
│ │ ├── KingfisherError.swift
│ │ ├── KingfisherManager.swift
│ │ └── KingfisherOptionsInfo.swift
│ │ ├── Image
│ │ ├── Filter.swift
│ │ ├── GIFAnimatedImage.swift
│ │ ├── GraphicsContext.swift
│ │ ├── Image.swift
│ │ ├── ImageDrawing.swift
│ │ ├── ImageFormat.swift
│ │ ├── ImageProcessor.swift
│ │ ├── ImageProgressive.swift
│ │ ├── ImageTransition.swift
│ │ └── Placeholder.swift
│ │ ├── Networking
│ │ ├── AuthenticationChallengeResponsable.swift
│ │ ├── ImageDataProcessor.swift
│ │ ├── ImageDownloader.swift
│ │ ├── ImageDownloaderDelegate.swift
│ │ ├── ImageModifier.swift
│ │ ├── ImagePrefetcher.swift
│ │ ├── RedirectHandler.swift
│ │ ├── RequestModifier.swift
│ │ ├── RetryStrategy.swift
│ │ ├── SessionDataTask.swift
│ │ └── SessionDelegate.swift
│ │ ├── SwiftUI
│ │ ├── ImageBinder.swift
│ │ ├── ImageContext.swift
│ │ ├── KFAnimatedImage.swift
│ │ ├── KFImage.swift
│ │ ├── KFImageOptions.swift
│ │ ├── KFImageProtocol.swift
│ │ └── KFImageRenderer.swift
│ │ ├── Utility
│ │ ├── Box.swift
│ │ ├── CallbackQueue.swift
│ │ ├── Delegate.swift
│ │ ├── ExtensionHelpers.swift
│ │ ├── Result.swift
│ │ ├── Runtime.swift
│ │ ├── SizeExtensions.swift
│ │ └── String+MD5.swift
│ │ └── Views
│ │ ├── AnimatedImageView.swift
│ │ └── Indicator.swift
├── Local Podspecs
│ └── HXPHPicker.podspec.json
├── Manifest.lock
├── Pods.xcodeproj
│ └── project.pbxproj
└── Target Support Files
│ ├── GDPerformanceView-Swift
│ ├── GDPerformanceView-Swift-Info.plist
│ ├── GDPerformanceView-Swift-dummy.m
│ ├── GDPerformanceView-Swift-prefix.pch
│ ├── GDPerformanceView-Swift-umbrella.h
│ ├── GDPerformanceView-Swift.debug.xcconfig
│ ├── GDPerformanceView-Swift.modulemap
│ └── GDPerformanceView-Swift.release.xcconfig
│ ├── HXPHPicker
│ ├── HXPHPicker-Info.plist
│ ├── HXPHPicker-dummy.m
│ ├── HXPHPicker-prefix.pch
│ ├── HXPHPicker-umbrella.h
│ ├── HXPHPicker.debug.xcconfig
│ ├── HXPHPicker.modulemap
│ └── HXPHPicker.release.xcconfig
│ ├── Kingfisher
│ ├── Kingfisher-Info.plist
│ ├── Kingfisher-dummy.m
│ ├── Kingfisher-prefix.pch
│ ├── Kingfisher-umbrella.h
│ ├── Kingfisher.debug.xcconfig
│ ├── Kingfisher.modulemap
│ └── Kingfisher.release.xcconfig
│ └── Pods-Example
│ ├── Pods-Example-Info.plist
│ ├── Pods-Example-acknowledgements.markdown
│ ├── Pods-Example-acknowledgements.plist
│ ├── Pods-Example-dummy.m
│ ├── Pods-Example-frameworks.sh
│ ├── Pods-Example-resources.sh
│ ├── Pods-Example-umbrella.h
│ ├── Pods-Example.debug.xcconfig
│ ├── Pods-Example.modulemap
│ └── Pods-Example.release.xcconfig
├── README.md
├── Sources
├── HXPHPicker
│ ├── Camera+Location
│ │ └── CameraViewController+Location.swift
│ ├── Camera
│ │ ├── Config
│ │ │ └── CameraConfiguration.swift
│ │ ├── Controller
│ │ │ ├── CameraController.swift
│ │ │ ├── CameraControllerProtocol.swift
│ │ │ ├── CameraManager.swift
│ │ │ ├── CameraResultViewController.swift
│ │ │ ├── CameraViewController+BottomView.swift
│ │ │ ├── CameraViewController+Editor.swift
│ │ │ ├── CameraViewController+Preview.swift
│ │ │ ├── CameraViewController+Result.swift
│ │ │ └── CameraViewController.swift
│ │ ├── Model
│ │ │ ├── CameraFilter.swift
│ │ │ ├── CameraRenderer.swift
│ │ │ └── DeviceOrientationHelper.swift
│ │ ├── Util
│ │ │ └── Camera+PhotoTools.swift
│ │ └── View
│ │ │ ├── CameraBottomView.swift
│ │ │ ├── CameraPreviewView.swift
│ │ │ ├── PassThrough.metal
│ │ │ └── PreviewMetalView.swift
│ ├── Core
│ │ ├── Config
│ │ │ └── SelectBoxConfiguration.swift
│ │ ├── Controller
│ │ │ └── BaseViewController.swift
│ │ ├── Extension
│ │ │ ├── Core+AVAsset.swift
│ │ │ ├── Core+Bundle.swift
│ │ │ ├── Core+CALayer.swift
│ │ │ ├── Core+CGFloat.swift
│ │ │ ├── Core+Data.swift
│ │ │ ├── Core+Dictionary.swift
│ │ │ ├── Core+DispatchQueue.swift
│ │ │ ├── Core+FileManager.swift
│ │ │ ├── Core+PHAsset.swift
│ │ │ ├── Core+PHAssetCollection.swift
│ │ │ ├── Core+String.swift
│ │ │ ├── Core+UIApplication.swift
│ │ │ ├── Core+UIColor.swift
│ │ │ ├── Core+UIDevice.swift
│ │ │ ├── Core+UIFont.swift
│ │ │ ├── Core+UIImage.swift
│ │ │ ├── Core+UIImageView.swift
│ │ │ ├── Core+UILabel.swift
│ │ │ ├── Core+UIView.swift
│ │ │ ├── Core+UIViewController.swift
│ │ │ └── Core+URL.swift
│ │ ├── HXPHPicker.swift
│ │ ├── Model
│ │ │ ├── AppearanceStyle.swift
│ │ │ ├── CustomLanguage.swift
│ │ │ ├── ExportPreset.swift
│ │ │ ├── ImageContentType.swift
│ │ │ ├── IndicatorType.swift
│ │ │ ├── LanguageType.swift
│ │ │ ├── LivePhotoError.swift
│ │ │ ├── PhotoError.swift
│ │ │ └── PhotoPanGestureRecognizer.swift
│ │ ├── Util
│ │ │ ├── AssetManager+AVAsset.swift
│ │ │ ├── AssetManager+AVAssetExportSession.swift
│ │ │ ├── AssetManager+Asset.swift
│ │ │ ├── AssetManager+AssetCollection.swift
│ │ │ ├── AssetManager+Authorization.swift
│ │ │ ├── AssetManager+Image.swift
│ │ │ ├── AssetManager+ImageData.swift
│ │ │ ├── AssetManager+ImageURL.swift
│ │ │ ├── AssetManager+LivePhoto.swift
│ │ │ ├── AssetManager+LivePhotoURL.swift
│ │ │ ├── AssetManager+VideoURL.swift
│ │ │ ├── AssetManager.swift
│ │ │ ├── PhotoManager+Download.swift
│ │ │ ├── PhotoManager+Language.swift
│ │ │ ├── PhotoManager.swift
│ │ │ ├── PhotoTools+Alert.swift
│ │ │ ├── PhotoTools+Camera.swift
│ │ │ ├── PhotoTools+File.swift
│ │ │ └── PhotoTools.swift
│ │ └── View
│ │ │ ├── GIFImageView.swift
│ │ │ ├── ImageView.swift
│ │ │ ├── ProgressHUD.swift
│ │ │ ├── ProgressImageView.swift
│ │ │ ├── SelectBoxView.swift
│ │ │ ├── VideoPlaySliderView.swift
│ │ │ └── VideoPlayerView.swift
│ ├── Editor+View
│ │ ├── Extension
│ │ │ ├── EditorView+AVAsset.swift
│ │ │ ├── EditorView+CGFloat.swift
│ │ │ ├── EditorView+CIImage.swift
│ │ │ ├── EditorView+UIImage.swift
│ │ │ └── EditorView+UIView.swift
│ │ ├── ImageEditedResult.swift
│ │ ├── Model
│ │ │ ├── EditorModels.swift
│ │ │ ├── EditorTypes.swift
│ │ │ └── EditorVideoCompositor.swift
│ │ ├── Util
│ │ │ ├── EditorVideoTool.swift
│ │ │ └── EditorView+PhotoTools.swift
│ │ ├── VideoEditedResult.swift
│ │ └── View
│ │ │ ├── EditorAdjusterView+ContentView.swift
│ │ │ ├── EditorAdjusterView+Croper.swift
│ │ │ ├── EditorAdjusterView+Edit.swift
│ │ │ ├── EditorAdjusterView+FrameView.swift
│ │ │ ├── EditorAdjusterView+Mirror.swift
│ │ │ ├── EditorAdjusterView+Rotate.swift
│ │ │ ├── EditorAdjusterView+ScreenRotation.swift
│ │ │ ├── EditorAdjusterView+ScrollView.swift
│ │ │ ├── EditorAdjusterView+Video.swift
│ │ │ ├── EditorAdjusterView.swift
│ │ │ ├── EditorAdjusterViewProtocol.swift
│ │ │ ├── EditorAudioAnimationView.swift
│ │ │ ├── EditorContentView.swift
│ │ │ ├── EditorControlView.swift
│ │ │ ├── EditorDrawView.swift
│ │ │ ├── EditorFrameView+Control.swift
│ │ │ ├── EditorFrameView+VideoPlay.swift
│ │ │ ├── EditorFrameView.swift
│ │ │ ├── EditorMaskView.swift
│ │ │ ├── EditorMosaicView.swift
│ │ │ ├── EditorStickersContentView.swift
│ │ │ ├── EditorStickersItemView.swift
│ │ │ ├── EditorStickersTrashView.swift
│ │ │ ├── EditorStickersView.swift
│ │ │ ├── EditorVideoPlayerView.swift
│ │ │ ├── EditorView+AdjusterView.swift
│ │ │ ├── EditorView+GestureRecognizer.swift
│ │ │ ├── EditorView+Public.swift
│ │ │ ├── EditorView+ScrollView.swift
│ │ │ ├── EditorView.swift
│ │ │ └── EditorViewProtocol.swift
│ ├── Editor
│ │ ├── Config
│ │ │ └── EditorConfiguration.swift
│ │ ├── Controller
│ │ │ ├── EditorChartletViewController.swift
│ │ │ ├── EditorMaskListViewController.swift
│ │ │ ├── EditorMusicListViewController.swift
│ │ │ ├── EditorStickerTextViewController.swift
│ │ │ ├── EditorViewController+Brush.swift
│ │ │ ├── EditorViewController+Chartlet.swift
│ │ │ ├── EditorViewController+EditorView.swift
│ │ │ ├── EditorViewController+Filters.swift
│ │ │ ├── EditorViewController+LoadAsset.swift
│ │ │ ├── EditorViewController+Mosaic.swift
│ │ │ ├── EditorViewController+Music.swift
│ │ │ ├── EditorViewController+Ratio.swift
│ │ │ ├── EditorViewController+Text.swift
│ │ │ ├── EditorViewController+ToolsView.swift
│ │ │ ├── EditorViewController+VideoControl.swift
│ │ │ ├── EditorViewController.swift
│ │ │ └── EditorViewControllerDelegate.swift
│ │ ├── EditedResult.swift
│ │ ├── Extension
│ │ │ └── Editor+CIImage.swift
│ │ ├── Model
│ │ │ ├── EditorAsset.swift
│ │ │ ├── EditorChartlet.swift
│ │ │ ├── EditorPlayAuido.swift
│ │ │ ├── EditorType.swift
│ │ │ ├── PhotoEditorFilter.swift
│ │ │ └── VideoEditorMusic.swift
│ │ ├── Transition
│ │ │ └── EditorTransition.swift
│ │ ├── Util
│ │ │ └── Editor+PhotoTools.swift
│ │ └── View
│ │ │ ├── EditorBrushBlockView.swift
│ │ │ ├── EditorBrushColorView.swift
│ │ │ ├── EditorBrushSizeView.swift
│ │ │ ├── EditorChartletPreviewView.swift
│ │ │ ├── EditorChartletViewCell.swift
│ │ │ ├── EditorChartletViewListCell.swift
│ │ │ ├── EditorCollectionView.swift
│ │ │ ├── EditorFilterEditView.swift
│ │ │ ├── EditorFilterParameterView.swift
│ │ │ ├── EditorFiltersView.swift
│ │ │ ├── EditorMaskListViewCell.swift
│ │ │ ├── EditorMosaicToolView.swift
│ │ │ ├── EditorMusicLyricViewCell.swift
│ │ │ ├── EditorMusicView.swift
│ │ │ ├── EditorMusicViewCell.swift
│ │ │ ├── EditorRatioToolView.swift
│ │ │ ├── EditorRatioToolViewCell.swift
│ │ │ ├── EditorScaleView.swift
│ │ │ ├── EditorStickerTextView+CollectionView.swift
│ │ │ ├── EditorStickerTextView+Delegate.swift
│ │ │ ├── EditorStickerTextView+Draw.swift
│ │ │ ├── EditorStickerTextView.swift
│ │ │ ├── EditorToolsView.swift
│ │ │ ├── EditorVideoControlMaskView.swift
│ │ │ ├── EditorVideoControlView.swift
│ │ │ ├── EditorVideoControlViewCell.swift
│ │ │ └── EditorVolumeView.swift
│ ├── Picker
│ │ ├── AssetURLResult.swift
│ │ ├── Config
│ │ │ ├── AlbumListConfiguration.swift
│ │ │ ├── AlbumTitleViewConfiguration.swift
│ │ │ ├── ArrowViewConfiguration.swift
│ │ │ ├── EmptyViewConfiguration.swift
│ │ │ ├── NotAuthorizedConfiguration.swift
│ │ │ ├── PhotoListCellConfiguration.swift
│ │ │ ├── PhotoListConfiguration.swift
│ │ │ ├── PickerBottomViewConfiguration.swift
│ │ │ ├── PickerConfiguration.swift
│ │ │ ├── PreviewViewConfiguration.swift
│ │ │ └── SystemCameraConfiguration.swift
│ │ ├── Controller
│ │ │ ├── AlbumViewController.swift
│ │ │ ├── PhotoBrowser.swift
│ │ │ ├── PhotoPeekViewController.swift
│ │ │ ├── PhotoPickerController+FetchAsset.swift
│ │ │ ├── PhotoPickerController+Internal.swift
│ │ │ ├── PhotoPickerController+PHPhotoLibrary.swift
│ │ │ ├── PhotoPickerController+Transitioning.swift
│ │ │ ├── PhotoPickerController.swift
│ │ │ ├── PhotoPickerControllerProtocol.swift
│ │ │ ├── PhotoPickerViewController+AlbumView.swift
│ │ │ ├── PhotoPickerViewController+BottomView.swift
│ │ │ ├── PhotoPickerViewController+Camera.swift
│ │ │ ├── PhotoPickerViewController+Cell.swift
│ │ │ ├── PhotoPickerViewController+CollectionView.swift
│ │ │ ├── PhotoPickerViewController+Editor.swift
│ │ │ ├── PhotoPickerViewController+FetchAsset.swift
│ │ │ ├── PhotoPickerViewController+Preview.swift
│ │ │ ├── PhotoPickerViewController+SwipeSelect.swift
│ │ │ ├── PhotoPickerViewController.swift
│ │ │ ├── PhotoPreviewViewController+BottomView.swift
│ │ │ ├── PhotoPreviewViewController+CollectionView.swift
│ │ │ ├── PhotoPreviewViewController+Editor.swift
│ │ │ ├── PhotoPreviewViewController+NavigationController.swift
│ │ │ ├── PhotoPreviewViewController+SelectBox.swift
│ │ │ ├── PhotoPreviewViewController.swift
│ │ │ ├── PhotoPreviewViewControllerProtocol.swift
│ │ │ └── SystemCameraViewController.swift
│ │ ├── Extension
│ │ │ ├── Picker+Array.swift
│ │ │ ├── Picker+Int.swift
│ │ │ ├── Picker+PhotoAsset.swift
│ │ │ ├── Picker+UIImageView.swift
│ │ │ └── Picker+UIViewController.swift
│ │ ├── Model
│ │ │ ├── LocalAsset.swift
│ │ │ ├── NetworkAsset.swift
│ │ │ ├── PhotoAsset+Codable.swift
│ │ │ ├── PhotoAsset+Editor.swift
│ │ │ ├── PhotoAsset+Equal.swift
│ │ │ ├── PhotoAsset+FileSize.swift
│ │ │ ├── PhotoAsset+Local.swift
│ │ │ ├── PhotoAsset+Network.swift
│ │ │ ├── PhotoAsset+Request.swift
│ │ │ ├── PhotoAsset+URL.swift
│ │ │ ├── PhotoAsset.swift
│ │ │ ├── PhotoAssetCollection.swift
│ │ │ ├── PickerManager.swift
│ │ │ └── PickerTypes.swift
│ │ ├── PickerResult.swift
│ │ ├── Transition
│ │ │ ├── PickerControllerInteractiveTransition.swift
│ │ │ ├── PickerControllerTransition.swift
│ │ │ ├── PickerInteractiveTransition.swift
│ │ │ └── PickerTransition.swift
│ │ ├── Util
│ │ │ ├── Picker+LivePhotoTools.swift
│ │ │ ├── Picker+PhotoManager.swift
│ │ │ └── Picker+PhotoTools.swift
│ │ └── View
│ │ │ ├── AlbumTickView.swift
│ │ │ ├── AlbumTitleView.swift
│ │ │ ├── AlbumView.swift
│ │ │ ├── ArrowView.swift
│ │ │ ├── CaptureVideoPreviewView.swift
│ │ │ ├── Cell
│ │ │ ├── AlbumViewCell.swift
│ │ │ ├── PhotoPickerBaseViewCell.swift
│ │ │ ├── PhotoPickerLimitCell.swift
│ │ │ ├── PhotoPickerSelectableViewCell.swift
│ │ │ ├── PhotoPickerViewCell.swift
│ │ │ ├── PhotoPickerWeChatViewCell.swift
│ │ │ ├── PhotoPreviewSelectedViewCell.swift
│ │ │ ├── PhotoPreviewViewCell.swift
│ │ │ ├── PickerCameraViewCell.swift
│ │ │ ├── PreviewLivePhotoViewCell.swift
│ │ │ ├── PreviewPhotoViewCell.swift
│ │ │ ├── PreviewVideoControlViewCell.swift
│ │ │ └── PreviewVideoViewCell.swift
│ │ │ ├── DeniedAuthorizationView.swift
│ │ │ ├── EmptyView.swift
│ │ │ ├── PhotoPickerBottomNumberView.swift
│ │ │ ├── PhotoPickerBottomView.swift
│ │ │ ├── PhotoPickerSwitchLayout.swift
│ │ │ ├── PhotoPickerView+Asset.swift
│ │ │ ├── PhotoPickerView+Camera.swift
│ │ │ ├── PhotoPickerView+Cell.swift
│ │ │ ├── PhotoPickerView+CollectionView.swift
│ │ │ ├── PhotoPickerView+Editor.swift
│ │ │ ├── PhotoPickerView+Function.swift
│ │ │ ├── PhotoPickerView+Preview.swift
│ │ │ ├── PhotoPickerView.swift
│ │ │ ├── PhotoPickerViewProtocol.swift
│ │ │ ├── PhotoPreviewContentView.swift
│ │ │ ├── PhotoPreviewSelectedView.swift
│ │ │ ├── PhotoPreviewVideoView.swift
│ │ │ └── PhotoThumbnailView.swift
│ └── Resources
│ │ ├── .DS_Store
│ │ └── HXPHPicker.bundle
│ │ ├── ar.lproj
│ │ └── Localizable.strings
│ │ ├── de.lproj
│ │ └── Localizable.strings
│ │ ├── en.lproj
│ │ └── Localizable.strings
│ │ ├── fr.lproj
│ │ └── Localizable.strings
│ │ ├── id.lproj
│ │ └── Localizable.strings
│ │ ├── images
│ │ ├── hx_camera_down_back@2x.png
│ │ ├── hx_camera_down_back@3x.png
│ │ ├── hx_camera_overturn@2x.png
│ │ ├── hx_camera_overturn@3x.png
│ │ ├── hx_editor_back@2x.png
│ │ ├── hx_editor_back@3x.png
│ │ ├── hx_editor_brush_color_custom@2x.png
│ │ ├── hx_editor_brush_color_custom@3x.png
│ │ ├── hx_editor_brush_repeal@2x.png
│ │ ├── hx_editor_brush_repeal@3x.png
│ │ ├── hx_editor_change_asset@2x.png
│ │ ├── hx_editor_change_asset@3x.png
│ │ ├── hx_editor_crop_mask_list@2x.png
│ │ ├── hx_editor_crop_mask_list@3x.png
│ │ ├── hx_editor_filter_edit_brightness@2x.png
│ │ ├── hx_editor_filter_edit_brightness@3x.png
│ │ ├── hx_editor_filter_edit_contrast@2x.png
│ │ ├── hx_editor_filter_edit_contrast@3x.png
│ │ ├── hx_editor_filter_edit_saturation@2x.png
│ │ ├── hx_editor_filter_edit_saturation@3x.png
│ │ ├── hx_editor_filter_edit_sharpen@2x.png
│ │ ├── hx_editor_filter_edit_sharpen@3x.png
│ │ ├── hx_editor_filter_edit_vignette@2x.png
│ │ ├── hx_editor_filter_edit_vignette@3x.png
│ │ ├── hx_editor_filter_edit_warmth@2x.png
│ │ ├── hx_editor_filter_edit_warmth@3x.png
│ │ ├── hx_editor_mosaic_brush_image@2x.png
│ │ ├── hx_editor_mosaic_brush_image@3x.png
│ │ ├── hx_editor_photo_crop@2x.png
│ │ ├── hx_editor_photo_crop@3x.png
│ │ ├── hx_editor_photo_crop_free@2x.png
│ │ ├── hx_editor_photo_crop_free@3x.png
│ │ ├── hx_editor_photo_mirror_horizontally@2x.png
│ │ ├── hx_editor_photo_mirror_horizontally@3x.png
│ │ ├── hx_editor_photo_mirror_vertically@2x.png
│ │ ├── hx_editor_photo_mirror_vertically@3x.png
│ │ ├── hx_editor_photo_rotate_left@2x.png
│ │ ├── hx_editor_photo_rotate_left@3x.png
│ │ ├── hx_editor_photo_rotate_right@2x.png
│ │ ├── hx_editor_photo_rotate_right@3x.png
│ │ ├── hx_editor_photo_text_normal@2x.png
│ │ ├── hx_editor_photo_text_normal@3x.png
│ │ ├── hx_editor_photo_text_selected@2x.png
│ │ ├── hx_editor_photo_text_selected@3x.png
│ │ ├── hx_editor_photo_tools_emoji@2x.png
│ │ ├── hx_editor_photo_tools_emoji@3x.png
│ │ ├── hx_editor_photo_tools_text@2x.png
│ │ ├── hx_editor_photo_tools_text@3x.png
│ │ ├── hx_editor_photo_trash_close@2x.png
│ │ ├── hx_editor_photo_trash_close@3x.png
│ │ ├── hx_editor_photo_trash_open@2x.png
│ │ ├── hx_editor_photo_trash_open@3x.png
│ │ ├── hx_editor_tool_mosaic_color@2x.png
│ │ ├── hx_editor_tool_mosaic_color@3x.png
│ │ ├── hx_editor_tool_mosaic_normal@2x.png
│ │ ├── hx_editor_tool_mosaic_normal@3x.png
│ │ ├── hx_editor_tools_chartle_album@2x.png
│ │ ├── hx_editor_tools_chartle_album@3x.png
│ │ ├── hx_editor_tools_filter@2x.png
│ │ ├── hx_editor_tools_filter@3x.png
│ │ ├── hx_editor_tools_filter_change@2x.png
│ │ ├── hx_editor_tools_filter_change@3x.png
│ │ ├── hx_editor_tools_filter_edit@2x.png
│ │ ├── hx_editor_tools_filter_edit@3x.png
│ │ ├── hx_editor_tools_graffiti@2x.png
│ │ ├── hx_editor_tools_graffiti@3x.png
│ │ ├── hx_editor_tools_mosaic@2x.png
│ │ ├── hx_editor_tools_mosaic@3x.png
│ │ ├── hx_editor_tools_music@2x.png
│ │ ├── hx_editor_tools_music@3x.png
│ │ ├── hx_editor_tools_play@2x.png
│ │ ├── hx_editor_tools_play@3x.png
│ │ ├── hx_editor_video_control_arrow_left@2x.png
│ │ ├── hx_editor_video_control_arrow_left@3x.png
│ │ ├── hx_editor_video_control_arrow_right@2x.png
│ │ ├── hx_editor_video_control_arrow_right@3x.png
│ │ ├── hx_editor_video_control_pause@2x.png
│ │ ├── hx_editor_video_control_pause@3x.png
│ │ ├── hx_editor_video_control_play@2x.png
│ │ ├── hx_editor_video_control_play@3x.png
│ │ ├── hx_editor_video_crop@2x.png
│ │ ├── hx_editor_video_crop@3x.png
│ │ ├── hx_editor_video_music_search@2x.png
│ │ ├── hx_editor_video_music_search@3x.png
│ │ ├── hx_editor_video_music_volume@2x.png
│ │ ├── hx_editor_video_music_volume@3x.png
│ │ ├── hx_editor_view_sticker_item_delete@2x.png
│ │ ├── hx_editor_view_sticker_item_delete@3x.png
│ │ ├── hx_editor_view_sticker_item_rotate@2x.png
│ │ ├── hx_editor_view_sticker_item_rotate@3x.png
│ │ ├── hx_editor_view_sticker_item_scale@2x.png
│ │ ├── hx_editor_view_sticker_item_scale@3x.png
│ │ ├── hx_photo_box_normal@2x.png
│ │ ├── hx_photo_box_normal@3x.png
│ │ ├── hx_photo_box_selected@2x.png
│ │ ├── hx_photo_box_selected@3x.png
│ │ ├── hx_photo_edit_pull_down@2x.png
│ │ ├── hx_photo_edit_pull_down@3x.png
│ │ ├── hx_picker_add_img@2x.png
│ │ ├── hx_picker_add_img@3x.png
│ │ ├── hx_picker_album_empty@2x.png
│ │ ├── hx_picker_album_empty@3x.png
│ │ ├── hx_picker_cell_livephoto_icon@2x.png
│ │ ├── hx_picker_cell_livephoto_icon@3x.png
│ │ ├── hx_picker_cell_photo_edit_icon@2x.png
│ │ ├── hx_picker_cell_photo_edit_icon@3x.png
│ │ ├── hx_picker_cell_video_edit_icon@2x.png
│ │ ├── hx_picker_cell_video_edit_icon@3x.png
│ │ ├── hx_picker_cell_video_icon@2x.png
│ │ ├── hx_picker_cell_video_icon@3x.png
│ │ ├── hx_picker_cell_video_play@2x.png
│ │ ├── hx_picker_cell_video_play@3x.png
│ │ ├── hx_picker_livePhoto@2x.png
│ │ ├── hx_picker_livePhoto@3x.png
│ │ ├── hx_picker_notAuthorized_close@2x.png
│ │ ├── hx_picker_notAuthorized_close@3x.png
│ │ ├── hx_picker_notAuthorized_close_dark@2x.png
│ │ ├── hx_picker_notAuthorized_close_dark@3x.png
│ │ ├── hx_picker_photoList_photograph@2x.png
│ │ ├── hx_picker_photoList_photograph@3x.png
│ │ ├── hx_picker_photoList_photograph_white@2x.png
│ │ ├── hx_picker_photoList_photograph_white@3x.png
│ │ ├── hx_picker_photo_icloud_mark@2x.png
│ │ ├── hx_picker_photo_icloud_mark@3x.png
│ │ ├── hx_picker_photolist_bottom_prompt@2x.png
│ │ ├── hx_picker_photolist_bottom_prompt@3x.png
│ │ ├── hx_picker_photolist_bottom_prompt_arrow@2x.png
│ │ ├── hx_picker_photolist_bottom_prompt_arrow@3x.png
│ │ ├── hx_picker_photolist_cancel@2x.png
│ │ └── hx_picker_photolist_cancel@3x.png
│ │ ├── ja.lproj
│ │ └── Localizable.strings
│ │ ├── ko.lproj
│ │ └── Localizable.strings
│ │ ├── metal
│ │ └── default.metallib
│ │ ├── musics
│ │ └── 天外来物
│ │ ├── ru.lproj
│ │ └── Localizable.strings
│ │ ├── th.lproj
│ │ └── Localizable.strings
│ │ ├── vi.lproj
│ │ └── Localizable.strings
│ │ ├── zh-Hans.lproj
│ │ └── Localizable.strings
│ │ └── zh-Hant.lproj
│ │ └── Localizable.strings
└── Info.plist
└── tmp.xcconfig
/.codebeatsettings:
--------------------------------------------------------------------------------
1 | {
2 | "SWIFT": {
3 | "LOC": [100, 150, 200, 250],
4 | "ARITY": [100, 200, 300, 400],
5 | "TOO_MANY_FUNCTIONS": [100, 200, 300, 400],
6 | "TOO_MANY_IVARS": [100, 200, 300, 400],
7 | "TOTAL_LOC": [500, 600, 700, 800]
8 | }
9 | }
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [silence]
4 | custom: [https://github.com/sponsors/SilenceLove]
5 |
--------------------------------------------------------------------------------
/.swiftlint.yml:
--------------------------------------------------------------------------------
1 | disabled_rules:
2 | - trailing_whitespace
3 | - statement_position
4 | - identifier_name
5 | - unused_closure_parameter
6 | - multiple_closures_with_trailing_closure
7 | - type_body_length
8 | - function_parameter_count
9 | - force_cast
10 | - large_tuple
11 |
12 | excluded:
13 | - Carthage
14 | - Pods
15 | - Package.swift
16 |
17 | force_try: warning
18 |
19 | function_body_length:
20 | warning: 120
21 | error: 150
22 |
23 | file_length:
24 | warning: 1000
25 | error: 1500
26 |
27 | cyclomatic_complexity: 40
28 |
--------------------------------------------------------------------------------
/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Documentation/Support/ap.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Documentation/Support/ap.jpeg
--------------------------------------------------------------------------------
/Documentation/Support/bmc_qr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Documentation/Support/bmc_qr.png
--------------------------------------------------------------------------------
/Documentation/Support/sample_graph.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Documentation/Support/sample_graph.png
--------------------------------------------------------------------------------
/Documentation/Support/sample_graph_en.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Documentation/Support/sample_graph_en.png
--------------------------------------------------------------------------------
/Documentation/Support/wp.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Documentation/Support/wp.jpeg
--------------------------------------------------------------------------------
/Documentation/Wiki/HOME.md:
--------------------------------------------------------------------------------
1 | `HXPHPicker` 是一个选取、编辑、展示图片的工具套件,使用 Swift 编写。
2 |
3 | ## 开始使用
4 |
5 | - [使用说明](https://github.com/SilenceLove/HXPHPicker/wiki/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E)
6 | - [功能概览](https://github.com/SilenceLove/HXPHPicker/wiki/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E5%8A%9F%E8%83%BD%E6%A6%82%E8%A7%88)
7 | - [使用方式](https://github.com/SilenceLove/HXPHPicker/wiki/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F)
8 | - [使用要求](https://github.com/SilenceLove/HXPHPicker/wiki/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E4%BD%BF%E7%94%A8%E8%A6%81%E6%B1%82)
9 | - [安装说明](https://github.com/SilenceLove/HXPHPicker/wiki/%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E)
10 | - [Swift Package Manager](https://github.com/SilenceLove/HXPHPicker/wiki/%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E#swift-package-manager)
11 | - [CocoaPods](https://github.com/SilenceLove/HXPHPicker/wiki/%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E#cocoapods)
12 | - [Carthage](https://github.com/SilenceLove/HXPHPicker/wiki/%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E#carthage)
13 | - [Picker使用说明](https://github.com/SilenceLove/HXPHPicker/wiki/Picker%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E)
14 | - [调用/回调说明](https://github.com/SilenceLove/HXPHPicker/wiki/Picker%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E8%B0%83%E7%94%A8%E5%9B%9E%E8%B0%83%E8%AF%B4%E6%98%8E)
15 | - [配置项说明](https://github.com/SilenceLove/HXPHPicker/wiki/Picker%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E9%85%8D%E7%BD%AE%E9%A1%B9%E8%AF%B4%E6%98%8E)
16 | - [公开方法](https://github.com/SilenceLove/HXPHPicker/wiki/Picker%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E5%85%AC%E5%BC%80%E6%96%B9%E6%B3%95)
17 | - [Editor使用说明](https://github.com/SilenceLove/HXPHPicker/wiki/Editor%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E)
18 | - [调用/回调说明](https://github.com/SilenceLove/HXPHPicker/wiki/Editor%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E8%B0%83%E7%94%A8%E5%9B%9E%E8%B0%83%E8%AF%B4%E6%98%8E)
19 |
20 |
21 | ## 交流
22 |
23 | [Issue](https://github.com/SilenceLove/HXPHPicker/issues):如果你发现了任意 Bug,或者希望我们添加某些功能,欢迎给我们提 Issue。
24 |
25 | [Pull Request](https://github.com/SilenceLove/HXPHPicker/pulls):如果你想为这个项目做一些贡献,欢迎给我们提 PR,但是在这之前建议你先在 Issue 中与我们沟通,避免同时修改同一处内容。
26 |
--------------------------------------------------------------------------------
/Documentation/Wiki/INSTALLATION.md:
--------------------------------------------------------------------------------
1 | ## Swift Package Manager
2 |
3 | [Swift Package Manager](https://github.com/apple/swift-package-manager) 是管理 Swift 代码分发的工具,与Swift构建系统集成在一起,可以自动执行依赖项的下载,编译和链接过程。
4 |
5 | ⚠️ 需要 Xcode 12.0 及以上版本来支持资源文件/本地化文件的添加。
6 |
7 | ```swift
8 | dependencies: [
9 | .package(url: "https://github.com/SilenceLove/HXPHPicker.git",
10 | .upToNextMajor(from: "2.0"))
11 | ]
12 | ```
13 |
14 |
15 | ## CocoaPods
16 |
17 | [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html) 是项目依赖管理器,你可以用以下命令安装:
18 |
19 | ```ruby
20 | $ gem install cocoapods
21 | ```
22 |
23 | 将下面内容添加到 `Podfile`
24 |
25 | ```ruby
26 | pod 'HXPHPicker'
27 | ```
28 |
29 | 接下来执行安装命令:
30 |
31 | ```ruby
32 | $ pod install
33 | ```
34 |
35 | ### 单独引入
36 |
37 | 一般情况下我们会引入所有默认模块,如果你只需要单独一个子模块可以使用下面的命令:
38 |
39 | ```ruby
40 | pod 'HXPHPicker' # 引入所有默认模块
41 | pod 'HXPHPicker', :subspecs => ['Picker'] # 只引入图片选择器
42 | pod 'HXPHPicker', :subspecs => ['Picker', 'Editor'] # 引入图片选择器和编辑器
43 | pod 'HXPHPicker', :subspecs => ['Editor'] # 只引入编辑器
44 | pod 'HXPHPicker', :subspecs => ['Camera'] # 只引入相机
45 | ```
46 |
47 | ### 子模块列表
48 |
49 | ```ruby
50 | 'Picker' # 图片选择器,默认模块
51 | 'Editor' # 编辑器,默认模块
52 | 'Camera' # 相机,默认模块
53 | ```
54 |
55 |
56 | ## Carthage
57 |
58 | [Carthage](https://github.com/Carthage/Carthage) 是项目依赖管理器,你可以用以下命令安装:
59 |
60 | ```ruby
61 | $ brew update
62 | $ brew install carthage
63 | ```
64 |
65 | 将下面内容添加到 `Cartfile`
66 |
67 | ```ruby
68 | github "SilenceLove/HXPHPicker"
69 | ```
70 |
71 | 接下来执行安装命令:
72 |
73 | ```ruby
74 | $ carthage update HXPHPicker --platform iOS
75 | ```
76 |
77 |
78 |
79 | ## 下一步
80 |
81 | - [Picker使用说明](https://github.com/SilenceLove/HXPHPicker/wiki/Picker%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E)
82 |
--------------------------------------------------------------------------------
/Example/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2020/12/30.
6 | //
7 |
8 | import UIKit
9 |
10 | @main
11 | class AppDelegate: UIResponder, UIApplicationDelegate {
12 |
13 | var window: UIWindow?
14 |
15 | func application(
16 | _ application: UIApplication,
17 | didFinishLaunchingWithOptions
18 | launchOptions: [UIApplication.LaunchOptionsKey: Any]?
19 | ) -> Bool {
20 | // Override point for customization after application launch.
21 | let windows = UIWindow(frame: UIScreen.main.bounds)
22 | let homeController: HomeViewController
23 | if #available(iOS 13.0, *) {
24 | homeController = .init(style: .insetGrouped)
25 | } else {
26 | homeController = .init(style: .grouped)
27 | }
28 | let navigationController = UINavigationController(rootViewController: homeController)
29 | windows.rootViewController = navigationController
30 | windows.makeKeyAndVisible()
31 | self.window = windows
32 | return true
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Example/Classes/Controller/CustomPickerCellViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CustomPickerCellViewController.swift
3 | // Example
4 | //
5 | // Created by Slience on 2021/3/16.
6 | //
7 |
8 | import UIKit
9 | import HXPHPicker
10 |
11 | class CustomPickerCellViewController: UIViewController {
12 |
13 | var config: PickerConfiguration = PhotoTools.getWXPickerConfig(isMoment: false)
14 |
15 | override func viewDidLoad() {
16 | super.viewDidLoad()
17 | config.photoSelectionTapAction = .quickSelect
18 | config.videoSelectionTapAction = .quickSelect
19 | // config.photoList.cell.customSingleCellClass = CustomPickerViewCell.self
20 | config.photoList.cell.customSelectableCellClass = CustomPickerViewCell.self
21 | view.backgroundColor = .white
22 | title = "CustomCell"
23 | navigationItem.rightBarButtonItem = UIBarButtonItem(
24 | title: "打开选择器",
25 | style: .done,
26 | target: self,
27 | action: #selector(openPickerController)
28 | )
29 | }
30 |
31 | @objc func openPickerController() {
32 | let pickerController = PhotoPickerController.init(config: config)
33 | pickerController.pickerDelegate = self
34 | pickerController.autoDismiss = false
35 | present(pickerController, animated: true, completion: nil)
36 | }
37 | }
38 | extension CustomPickerCellViewController: PhotoPickerControllerDelegate {
39 | func pickerController(_ pickerController: PhotoPickerController, didFinishSelection result: PickerResult) {
40 | pickerController.dismiss(true) {
41 | let pickerResultVC = PickerResultViewController.init()
42 | pickerResultVC.config = pickerController.config
43 | pickerResultVC.selectedAssets = result.photoAssets
44 | pickerResultVC.isOriginal = result.isOriginal
45 | self.navigationController?.pushViewController(pickerResultVC, animated: true)
46 | }
47 | }
48 | func pickerController(didCancel pickerController: PhotoPickerController) {
49 | pickerController.dismiss(animated: true, completion: nil)
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/Example/Classes/Example-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | //
2 | // Use this file to import your target's public headers that you would like to expose to Swift.
3 | //
4 |
5 | #import "GPUImageBeautifyFilter.h"
6 |
--------------------------------------------------------------------------------
/Example/Classes/Extension/Core+UIColor.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+UIColor.swift
3 | // Example
4 | //
5 | // Created by Slience on 2021/3/16.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(hexString: String) {
13 | let hexString = hexString.trimmingCharacters(in: .whitespacesAndNewlines)
14 | let scanner = Scanner(string: hexString)
15 | if hexString.hasPrefix("#") {
16 | scanner.scanLocation = 1
17 | }
18 | var color: UInt32 = 0
19 | scanner.scanHexInt32(&color)
20 | let mask = 0x000000FF
21 | let r = Int(color >> 16) & mask
22 | let g = Int(color >> 8) & mask
23 | let b = Int(color) & mask
24 | let red = CGFloat(r) / 255.0
25 | let green = CGFloat(g) / 255.0
26 | let blue = CGFloat(b) / 255.0
27 | self.init(red: red, green: green, blue: blue, alpha: 1)
28 | }
29 | class var systemTintColor: UIColor {
30 | UIColor.init(red: 0, green: 0.47843137254901963, blue: 1, alpha: 1)
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Example/Classes/Extension/RowTypeRule.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RowTypeRule.swift
3 | // Example
4 | //
5 | // Created by Slience on 2021/3/16.
6 | //
7 |
8 | import UIKit
9 | import HXPHPicker
10 |
11 | protocol HomeRowTypeRule {
12 | var title: String { get }
13 | var controller: UIViewController { get }
14 | }
15 |
16 | protocol ConfigRowTypeRule {
17 | var title: String { get }
18 | var detailTitle: String { get }
19 |
20 | func getFunction(_ controller: T) -> ((IndexPath) -> Void)
21 | }
22 |
--------------------------------------------------------------------------------
/Example/Classes/Extension/String+Extension.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extension.swift
3 | // Example
4 | //
5 | // Created by 洪欣 on 2023/5/2.
6 | //
7 |
8 | import Foundation
9 |
10 |
11 | extension String {
12 |
13 | subscript(_ indexs: ClosedRange) -> String {
14 | let beginIndex = index(startIndex, offsetBy: indexs.lowerBound)
15 | let endIndex = index(startIndex, offsetBy: indexs.upperBound)
16 | return String(self[beginIndex...endIndex])
17 | }
18 |
19 | subscript(_ indexs: Range) -> String {
20 | let beginIndex = index(startIndex, offsetBy: indexs.lowerBound)
21 | let endIndex = index(startIndex, offsetBy: indexs.upperBound)
22 | return String(self[beginIndex..) -> String {
26 | let endIndex = index(startIndex, offsetBy: indexs.upperBound)
27 | return String(self[startIndex...endIndex])
28 | }
29 |
30 | subscript(_ indexs: PartialRangeFrom) -> String {
31 | let beginIndex = index(startIndex, offsetBy: indexs.lowerBound)
32 | return String(self[beginIndex..) -> String {
36 | let endIndex = index(startIndex, offsetBy: indexs.upperBound)
37 | return String(self[startIndex.. UIFont {
13 | let font = UIFont.init(name: "PingFangSC-Regular", size: size)
14 | return font ?? UIFont.systemFont(ofSize: size)
15 | }
16 | static func mediumPingFang(ofSize size: CGFloat) -> UIFont {
17 | let font = UIFont.init(name: "PingFangSC-Medium", size: size)
18 | return font ?? UIFont.systemFont(ofSize: size)
19 | }
20 | static func semiboldPingFang(ofSize size: CGFloat) -> UIFont {
21 | let font = UIFont.init(name: "PingFangSC-Semibold", size: size)
22 | return font ?? UIFont.systemFont(ofSize: size)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Example/Classes/Model/GPUImageBeautifyFilter.h:
--------------------------------------------------------------------------------
1 | //
2 | // GPUImageBeautifyFilter.h
3 | // BeautifyFaceDemo
4 | //
5 | // Created by guikz on 16/4/28.
6 | // Copyright © 2016年 guikz. All rights reserved.
7 | //
8 |
9 | #if __has_include()
10 | #import "GPUImage/GPUImage.h"
11 |
12 | @class GPUImageCombinationFilter;
13 |
14 | @interface GPUImageBeautifyFilter : GPUImageFilterGroup {
15 | GPUImageBilateralFilter *bilateralFilter;
16 | GPUImageCannyEdgeDetectionFilter *cannyEdgeFilter;
17 | GPUImageCombinationFilter *combinationFilter;
18 | GPUImageHSBFilter *hsbFilter;
19 | }
20 |
21 | //设置美化强度
22 | - (id)initWithDegree:(float)degree;
23 |
24 | @end
25 |
26 | #endif
27 |
--------------------------------------------------------------------------------
/Example/Classes/Model/ImageFilter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ImageFilter.swift
3 | // Example
4 | //
5 | // Created by Slience on 2022/2/18.
6 | //
7 |
8 | #if canImport(GPUImage)
9 | import UIKit
10 | import VideoToolbox
11 | import HXPHPicker
12 | import GPUImage
13 |
14 | struct FilterTools {
15 | static func filters() -> [CameraFilter] {
16 | [
17 | BeautifyFilter(), InstantFilter(), Apply1977Filter(), ToasterFilter(), TransferFilter()
18 | ]
19 | }
20 | }
21 |
22 | class BeautifyFilter: CameraFilter {
23 | var filterName: String {
24 | return "美白"
25 | }
26 |
27 | var filter: GPUImageBeautifyFilter?
28 |
29 | func prepare(_ size: CGSize) {
30 | filter = GPUImageBeautifyFilter(degree: 0.6)
31 | }
32 |
33 | func render(_ pixelBuffer: CVPixelBuffer) -> CIImage? {
34 | var cgImage: CGImage?
35 | VTCreateCGImageFromCVPixelBuffer(pixelBuffer, options: nil, imageOut: &cgImage)
36 | guard let cgImage = cgImage, let bilateralFilter = filter else {
37 | return nil
38 | }
39 | let picture = GPUImagePicture(cgImage: cgImage)
40 | picture?.addTarget(bilateralFilter)
41 | bilateralFilter.useNextFrameForImageCapture()
42 | picture?.processImage()
43 | let result = bilateralFilter.newCGImageFromCurrentlyProcessedOutput().takeRetainedValue()
44 | return .init(cgImage: result)
45 | }
46 |
47 | func reset() {
48 | filter = nil
49 | }
50 | }
51 |
52 | #endif
53 |
--------------------------------------------------------------------------------
/Example/Classes/View/CustomPickerCellView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CustomPickerCellView.swift
3 | // Example
4 | //
5 | // Created by Slience on 2021/3/16.
6 | //
7 |
8 | import UIKit
9 | import HXPHPicker
10 |
11 | class CustomPickerViewCell: PhotoPickerViewCell {
12 | lazy var selectedMaskView: UIView = {
13 | let view = UIView.init()
14 | view.layer.borderWidth = 5
15 | view.layer.borderColor = UIColor(hexString: "#07c160").cgColor
16 | view.backgroundColor = UIColor.black.withAlphaComponent(0.6)
17 | view.addSubview(numberLb)
18 | view.isHidden = true
19 | return view
20 | }()
21 |
22 | lazy var numberLb: UILabel = {
23 | let label = UILabel.init()
24 | label.textColor = UIColor(hexString: "#ffffff")
25 | label.textAlignment = .center
26 | label.font = .boldSystemFont(ofSize: 35)
27 | label.adjustsFontSizeToFitWidth = true
28 | return label
29 | }()
30 |
31 | override func initView() {
32 | super.initView()
33 | contentView.addSubview(selectedMaskView)
34 | }
35 |
36 | override func updateSelectedState(isSelected: Bool, animated: Bool) {
37 | super.updateSelectedState(isSelected: isSelected, animated: animated)
38 | numberLb.text = String(photoAsset.selectIndex + 1)
39 | selectedMaskView.isHidden = !isSelected
40 | }
41 |
42 | override func layoutView() {
43 | super.layoutView()
44 | selectedMaskView.frame = bounds
45 | numberLb.frame = selectedMaskView.bounds
46 | }
47 |
48 | }
49 |
--------------------------------------------------------------------------------
/Example/Example.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.device.audio-input
8 |
9 | com.apple.security.device.camera
10 |
11 | com.apple.security.network.client
12 |
13 | com.apple.security.personal-information.location
14 |
15 | com.apple.security.personal-information.photos-library
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-1024.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-76.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Notify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Notify.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Notify@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Notify@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Notify@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Notify@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/camera_overturn.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "filename" : "camera_overturn@2x.png",
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "filename" : "camera_overturn@3x.png",
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/camera_overturn.imageset/camera_overturn@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/camera_overturn.imageset/camera_overturn@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/camera_overturn.imageset/camera_overturn@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/camera_overturn.imageset/camera_overturn@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_compose_delete.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "filename" : "hx_compose_delete@2x.png",
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "filename" : "hx_compose_delete@3x.png",
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_compose_delete.imageset/hx_compose_delete@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_compose_delete.imageset/hx_compose_delete@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_compose_delete.imageset/hx_compose_delete@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_compose_delete.imageset/hx_compose_delete@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_clip.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "filename" : "hx_photo_edit_tools_clip@2x.png",
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "filename" : "hx_photo_edit_tools_clip@3x.png",
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_clip.imageset/hx_photo_edit_tools_clip@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_clip.imageset/hx_photo_edit_tools_clip@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_clip.imageset/hx_photo_edit_tools_clip@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_clip.imageset/hx_photo_edit_tools_clip@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_emoji.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "filename" : "hx_photo_edit_tools_emoji@2x.png",
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "filename" : "hx_photo_edit_tools_emoji@3x.png",
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_emoji.imageset/hx_photo_edit_tools_emoji@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_emoji.imageset/hx_photo_edit_tools_emoji@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_emoji.imageset/hx_photo_edit_tools_emoji@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_emoji.imageset/hx_photo_edit_tools_emoji@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_graffiti.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "filename" : "hx_photo_edit_tools_graffiti@2x.png",
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "filename" : "hx_photo_edit_tools_graffiti@3x.png",
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_graffiti.imageset/hx_photo_edit_tools_graffiti@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_graffiti.imageset/hx_photo_edit_tools_graffiti@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_graffiti.imageset/hx_photo_edit_tools_graffiti@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_graffiti.imageset/hx_photo_edit_tools_graffiti@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_mosaic.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "filename" : "hx_photo_edit_tools_mosaic@2x.png",
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "filename" : "hx_photo_edit_tools_mosaic@3x.png",
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_mosaic.imageset/hx_photo_edit_tools_mosaic@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_mosaic.imageset/hx_photo_edit_tools_mosaic@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_mosaic.imageset/hx_photo_edit_tools_mosaic@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_mosaic.imageset/hx_photo_edit_tools_mosaic@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_text.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "filename" : "hx_photo_edit_tools_text@2x.png",
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "filename" : "hx_photo_edit_tools_text@3x.png",
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_text.imageset/hx_photo_edit_tools_text@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_text.imageset/hx_photo_edit_tools_text@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_photo_edit_tools_text.imageset/hx_photo_edit_tools_text@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_photo_edit_tools_text.imageset/hx_photo_edit_tools_text@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_picker_add_img.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "filename" : "hx_picker_add_img@2x.png",
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "filename" : "hx_picker_add_img@3x.png",
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_picker_add_img.imageset/hx_picker_add_img@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_picker_add_img.imageset/hx_picker_add_img@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_picker_add_img.imageset/hx_picker_add_img@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_picker_add_img.imageset/hx_picker_add_img@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_picker_cell_video_play.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "filename" : "hx_picker_cell_video_play@2x.png",
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "filename" : "hx_picker_cell_video_play@3x.png",
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_picker_cell_video_play.imageset/hx_picker_cell_video_play@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_picker_cell_video_play.imageset/hx_picker_cell_video_play@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_picker_cell_video_play.imageset/hx_picker_cell_video_play@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_picker_cell_video_play.imageset/hx_picker_cell_video_play@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_sticker_cover.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "filename" : "hx_sticker_cover@2x.png",
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "filename" : "hx_sticker_cover@3x.png",
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_sticker_cover.imageset/hx_sticker_cover@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_sticker_cover.imageset/hx_sticker_cover@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/hx_sticker_cover.imageset/hx_sticker_cover@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/hx_sticker_cover.imageset/hx_sticker_cover@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/select_photo.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "filename" : "select_photo@2x.png",
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "filename" : "select_photo@3x.png",
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/select_photo.imageset/select_photo@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/select_photo.imageset/select_photo@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/select_photo.imageset/select_photo@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/select_photo.imageset/select_photo@3x.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/wx_head_icon.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "filename" : "wx_head_icon@2x.png",
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/Resources/Assets.xcassets/wx_head_icon.imageset/wx_head_icon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Assets.xcassets/wx_head_icon.imageset/wx_head_icon@2x.png
--------------------------------------------------------------------------------
/Example/Resources/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_chongya.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_chongya.png
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_haoxinqing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_haoxinqing.png
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_housailei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_housailei.png
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_jintianfenkeai.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_jintianfenkeai.png
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_keaibiaoq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_keaibiaoq.png
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_kehaixing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_kehaixing.png
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_saihong.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_saihong.png
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_wow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_wow.png
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_woxiangfazipai.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_woxiangfazipai.png
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_xiaochuzhujiao.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_xiaochuzhujiao.png
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_yuanqimanman.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_yuanqimanman.png
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_yuanqishaonv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_yuanqishaonv.png
--------------------------------------------------------------------------------
/Example/Resources/Images/hx_sticker_zaizaijia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/hx_sticker_zaizaijia.png
--------------------------------------------------------------------------------
/Example/Resources/Images/livephoto_image.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/livephoto_image.jpeg
--------------------------------------------------------------------------------
/Example/Resources/Images/love.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/love.png
--------------------------------------------------------------------------------
/Example/Resources/Images/love_text.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/love_text.png
--------------------------------------------------------------------------------
/Example/Resources/Images/picker_example_gif_image.GIF:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/picker_example_gif_image.GIF
--------------------------------------------------------------------------------
/Example/Resources/Images/picker_example_image.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/picker_example_image.JPG
--------------------------------------------------------------------------------
/Example/Resources/Images/portrait.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/portrait.png
--------------------------------------------------------------------------------
/Example/Resources/Images/qiy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/qiy.png
--------------------------------------------------------------------------------
/Example/Resources/Images/stars.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/stars.png
--------------------------------------------------------------------------------
/Example/Resources/Images/text.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Images/text.png
--------------------------------------------------------------------------------
/Example/Resources/Music/世间美好与你环环相扣:
--------------------------------------------------------------------------------
1 | [ti:世间美好与你环环相扣]
2 | [ar:妮达Anita]
3 | [al:妮达COVER片段合辑]
4 | [t_time:(00:31)]
5 | [00:02.44]此时已莺飞草长爱的人正在路上
6 | [00:06.502]我知他风雨兼程途经日暮不赏
7 | [00:10.510]穿越人海只为与你相拥
8 | [00:16.53]此刻已皓月当空爱的人手捧星光
9 | [00:20.530]我知他乘风破浪去了黑暗一趟
10 | [00:24.538]感同身受给你救赎热望
11 |
--------------------------------------------------------------------------------
/Example/Resources/Music/世间美好与你环环相扣.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/世间美好与你环环相扣.mp3
--------------------------------------------------------------------------------
/Example/Resources/Music/嘉宾:
--------------------------------------------------------------------------------
1 | [ti:嘉宾]
2 | [t_time:(00:55)]
3 | [00:00.000]感谢你特别邀请
4 | [00:03.000]来见证你的爱情
5 | [00:06.341]我时刻提醒自己 别逃避
6 | [00:11.727]拿着喜帖一步一步走近
7 | [00:15.951]他精心布置的场地
8 | [00:19.680]可惜这是属于你的风景
9 | [00:23.450]而我只是嘉宾
10 | [00:25.982]我放下所有回忆
11 | [00:28.820]来成全你的爱情
12 | [00:32.179]却始终不愿相信 这是命
13 | [00:38.191]好久不见的你有点疏离
14 | [00:42.080]握手寒暄如此客气
15 | [00:45.250]何必要在他的面前刻意
16 | [00:49.020]隐瞒我的世界 有过你
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/Example/Resources/Music/嘉宾.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/嘉宾.mp3
--------------------------------------------------------------------------------
/Example/Resources/Music/天外来物:
--------------------------------------------------------------------------------
1 | [ti:天外来物]
2 | [t_time:(00:38)]
3 | [00:00.000]你像 天外来物一样 求之不得
4 | [00:07.689]你在世俗里的名字 不重要了
5 | [00:14.689]正好 我隐藏的人格是契而不舍
6 | [00:21.689]直到蜂拥而至的人都透明了
7 | [00:28.689]我在 不近又不远处
8 | [00:33.189]用明天换你 靠近我
9 |
--------------------------------------------------------------------------------
/Example/Resources/Music/天外来物.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/天外来物.mp3
--------------------------------------------------------------------------------
/Example/Resources/Music/少女的祈祷:
--------------------------------------------------------------------------------
1 | [ar:杨千嬅]
2 | [ti:少女的祈祷]
3 | [t_time:(00:34)]
4 | [00:00.000]祈求天地放过一双恋人
5 | [00:03.500]怕发生的永远别发生
6 | [00:07.959]从来未顺利遇上好景降临
7 | [00:12.200]如何能重拾信心
8 | [00:16.000]祈求天父做十分钟好人
9 | [00:19.600]赐我他的吻 如怜悯罪人
10 | [00:23.750]我爱主 同时亦爱一位世人
11 | [00:27.950]祈求沿途未变心 请给我护荫
12 |
--------------------------------------------------------------------------------
/Example/Resources/Music/少女的祈祷.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/少女的祈祷.mp3
--------------------------------------------------------------------------------
/Example/Resources/Music/无赖:
--------------------------------------------------------------------------------
1 | [ar:郑中基]
2 | [ti:无赖]
3 | [t_time:(00:38)]
4 | [00:00.00]为何还喜欢我我这种无赖
5 | [00:05.90]是话你蠢还是很伟大
6 | [00:10.00]在座每位都将我踩
7 | [00:12.00]口碑有多坏
8 | [00:15.00]但你亦永远不见怪
9 | [00:18.870]何必跟我我这种无赖
10 | [00:23.00]活大半生还是很失败
11 | [00:27.80]但是你死都不变心
12 | [00:30.00]跟我笑着挨
13 | [00:32.00]换转别个也不忍心偷偷作怪
14 |
--------------------------------------------------------------------------------
/Example/Resources/Music/无赖.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/无赖.mp3
--------------------------------------------------------------------------------
/Example/Resources/Music/时光正好:
--------------------------------------------------------------------------------
1 | [ar:郁可唯]
2 | [ti:时光正好]
3 | [t_time:(00:34)]
4 | [00:00.000]我爱你啊
5 | [00:03.000]很想念很感谢有你的夏天
6 | [00:08.000]没有人说谎啊
7 | [00:11.000]可时间会擦掉承诺的话
8 | [00:15.300]很爱你啊
9 | [00:18.200]以沉默以眼泪以正好时光
10 | [00:23.300]我站在那年那夜那一天
11 | [00:29.100]你不来我不老
12 |
--------------------------------------------------------------------------------
/Example/Resources/Music/时光正好.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/时光正好.mp3
--------------------------------------------------------------------------------
/Example/Resources/Music/爱你:
--------------------------------------------------------------------------------
1 | [ti:爱你]
2 | [ar:团子]
3 | [t_time:(00:52)]
4 | [00:00.482]如果 你突然打了个喷嚏
5 | [00:04.245]那 一定就是我在想你
6 | [00:06.998]如果半夜被手机吵醒
7 | [00:09.505]啊 那是因为我关心
8 | [00:11.763]常常想你说的话
9 | [00:14.771]是不是别有用心
10 | [00:17.530]明明很想相信
11 | [00:19.785]却又忍不住怀疑
12 | [00:22.544]在你的心里
13 | [00:24.802]我是否就是唯一
14 | [00:27.309]爱就是有我常烦着你
15 | [00:31.575]so baby 情话多说一点
16 | [00:34.584]想我就多看一眼
17 | [00:37.344]表现多一点点
18 | [00:39.099]让我能真的看见
19 | [00:42.107]oh bye 少说一点
20 | [00:44.364]想陪你不只一天
21 | [00:46.873]多一点让我心甘情愿
22 | [00:50.385]爱你
23 |
--------------------------------------------------------------------------------
/Example/Resources/Music/爱你.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/爱你.mp3
--------------------------------------------------------------------------------
/Example/Resources/Music/野孩子:
--------------------------------------------------------------------------------
1 | [ar:杨千嬅]
2 | [ti:野孩子]
3 | [t_time:(00:36)]
4 | [00:00.000]明知爱这种男孩子
5 | [00:03.000]也许只能如此
6 | [00:05.500]但我会成为你最牵挂的一个女子
7 | [00:09.400]朝朝暮暮让你猜想如何驯服我
8 | [00:13.000]若果亲手抱住
9 | [00:15.000]或者不必如此
10 | [00:17.600]许多旁人说我不太明了男孩子
11 | [00:21.500]不受命令就是一种最坏名字
12 | [00:25.200]笑我这个毫无办法管束的野孩子
13 | [00:31.000]连没有幸福都不介意
14 |
--------------------------------------------------------------------------------
/Example/Resources/Music/野孩子.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Music/野孩子.mp3
--------------------------------------------------------------------------------
/Example/Resources/Video/livephoto_video.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Example/Resources/Video/livephoto_video.mp4
--------------------------------------------------------------------------------
/HXPHPicker.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/HXPHPicker.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/HXPHPicker.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/HXPHPicker.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/HXPHPicker.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 silence
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 |
--------------------------------------------------------------------------------
/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "Kingfisher",
6 | "repositoryURL": "https://github.com/onevcat/Kingfisher.git",
7 | "state": {
8 | "branch": null,
9 | "revision": "3f6992b5cd3143e83b02300ea59c400d4cf0747a",
10 | "version": "7.8.0"
11 | }
12 | }
13 | ]
14 | },
15 | "version": 1
16 | }
17 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:5.3
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: "HXPHPicker",
8 | platforms: [.iOS(.v12)],
9 | products: [
10 | // Products define the executables and libraries a package produces, and make them visible to other packages.
11 | .library(
12 | name: "HXPHPicker",
13 | targets: ["HXPHPicker"]),
14 | ],
15 | dependencies: [
16 | // Dependencies declare other packages that this package depends on.
17 | // .package(url: /* package url */, from: "1.0.0"),
18 | .package(url: "https://github.com/onevcat/Kingfisher.git", from: "7.0.0"),
19 | ],
20 | targets: [
21 | // Targets are the basic building blocks of a package. A target can define a module or a test suite.
22 | // Targets can depend on other targets in this package, and on products in packages this package depends on.
23 | .target(
24 | name: "HXPHPicker",
25 | dependencies: ["Kingfisher"],
26 | resources: [
27 | .process("Resources")
28 | ],
29 | swiftSettings: [
30 | .define("HXPICKER_ENABLE_SPM"),
31 | .define("HXPICKER_ENABLE_PICKER"),
32 | .define("HXPICKER_ENABLE_EDITOR"),
33 | .define("HXPICKER_ENABLE_CAMERA")
34 | ]),
35 | ]
36 | )
37 |
--------------------------------------------------------------------------------
/Podfile:
--------------------------------------------------------------------------------
1 | source 'https://github.com/CocoaPods/Specs.git'
2 | platform :ios, '12.0'
3 |
4 | install! 'cocoapods',
5 | #:deterministic_uuids=>false,
6 | disable_input_output_paths: true,
7 | warn_for_unused_master_specs_repo: false
8 |
9 | use_frameworks!
10 |
11 | target 'Example' do
12 | # 包含所有功能,网络图片使用的是 'Kingfisher', '~> 7.0'
13 | pod 'HXPHPicker', :path => './'
14 |
15 | pod 'GDPerformanceView-Swift'
16 |
17 | # pod 'SwiftLint' // ${PODS_ROOT}/SwiftLint/swiftlint
18 | # pod 'GPUImage'
19 | end
20 |
21 | #post_install do |installer|
22 | # installer.pods_project.targets.each do |target|
23 | # if target.name == 'Pods-Example'
24 | ## Pod::UI.puts "'target':#{target}"
25 | # target.build_configurations.each do |config|
26 | # config.build_settings['MACH_O_TYPE'] = 'mh_dylib'
27 | # end
28 | # end
29 | # end
30 | #end
31 |
32 | # https://github.com/CocoaPods/CocoaPods/issues/11402
33 | post_install do |installer|
34 | installer.pods_project.targets.each do |target|
35 | if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
36 | target.build_configurations.each do |config|
37 | config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
38 | end
39 | end
40 | end
41 | end
42 |
--------------------------------------------------------------------------------
/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - GDPerformanceView-Swift (2.1.1)
3 | - HXPHPicker (2.0.0):
4 | - HXPHPicker/Full (= 2.0.0)
5 | - HXPHPicker/Camera (2.0.0):
6 | - HXPHPicker/Camera/Lite (= 2.0.0)
7 | - HXPHPicker/Camera/Location (= 2.0.0)
8 | - HXPHPicker/Camera/Lite (2.0.0):
9 | - HXPHPicker/Core
10 | - HXPHPicker/Camera/Location (2.0.0):
11 | - HXPHPicker/Camera/Lite
12 | - HXPHPicker/Core (2.0.0)
13 | - HXPHPicker/Editor (2.0.0):
14 | - HXPHPicker/Editor/KF (= 2.0.0)
15 | - HXPHPicker/Editor/Lite (= 2.0.0)
16 | - HXPHPicker/Editor/KF (2.0.0):
17 | - HXPHPicker/Editor/Lite
18 | - HXPHPicker/EditorView/KF
19 | - Kingfisher (~> 7.0)
20 | - HXPHPicker/Editor/Lite (2.0.0):
21 | - HXPHPicker/EditorView/Lite
22 | - HXPHPicker/EditorView/KF (2.0.0):
23 | - HXPHPicker/EditorView/Lite
24 | - Kingfisher (~> 7.0)
25 | - HXPHPicker/EditorView/Lite (2.0.0):
26 | - HXPHPicker/Core
27 | - HXPHPicker/Full (2.0.0):
28 | - HXPHPicker/Camera
29 | - HXPHPicker/Editor
30 | - HXPHPicker/Picker
31 | - HXPHPicker/Picker (2.0.0):
32 | - HXPHPicker/Picker/KF (= 2.0.0)
33 | - HXPHPicker/Picker/Lite (= 2.0.0)
34 | - HXPHPicker/Picker/KF (2.0.0):
35 | - HXPHPicker/Picker/Lite
36 | - Kingfisher (~> 7.0)
37 | - HXPHPicker/Picker/Lite (2.0.0):
38 | - HXPHPicker/Core
39 | - Kingfisher (7.6.2)
40 |
41 | DEPENDENCIES:
42 | - GDPerformanceView-Swift
43 | - HXPHPicker (from `./`)
44 |
45 | SPEC REPOS:
46 | https://github.com/CocoaPods/Specs.git:
47 | - GDPerformanceView-Swift
48 | - Kingfisher
49 |
50 | EXTERNAL SOURCES:
51 | HXPHPicker:
52 | :path: "./"
53 |
54 | SPEC CHECKSUMS:
55 | GDPerformanceView-Swift: 22d964fe40b19e3d914dba2586237d064de8fd77
56 | HXPHPicker: 4fdbc2c27e0ca43a8f2c0060e128dfead5255594
57 | Kingfisher: 6c5449c6450c5239166510ba04afe374a98afc4f
58 |
59 | PODFILE CHECKSUM: 022685221be8605f1ae599c42b709a8786891c1b
60 |
61 | COCOAPODS: 1.12.1
62 |
--------------------------------------------------------------------------------
/Pods/GDPerformanceView-Swift/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 Gavrilov Daniil
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 NON INFRINGEMENT. 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 |
--------------------------------------------------------------------------------
/Pods/Kingfisher/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2019 Wei Wang
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 |
23 |
--------------------------------------------------------------------------------
/Pods/Kingfisher/Sources/Utility/Box.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Box.swift
3 | // Kingfisher
4 | //
5 | // Created by Wei Wang on 2018/3/17.
6 | // Copyright (c) 2019 Wei Wang
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 | import Foundation
27 |
28 | class Box {
29 | var value: T
30 |
31 | init(_ value: T) {
32 | self.value = value
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Pods/Kingfisher/Sources/Utility/Runtime.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Runtime.swift
3 | // Kingfisher
4 | //
5 | // Created by Wei Wang on 2018/10/12.
6 | //
7 | // Copyright (c) 2019 Wei Wang
8 | //
9 | // Permission is hereby granted, free of charge, to any person obtaining a copy
10 | // of this software and associated documentation files (the "Software"), to deal
11 | // in the Software without restriction, including without limitation the rights
12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 | // copies of the Software, and to permit persons to whom the Software is
14 | // furnished to do so, subject to the following conditions:
15 | //
16 | // The above copyright notice and this permission notice shall be included in
17 | // all copies or substantial portions of the Software.
18 | //
19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 | // THE SOFTWARE.
26 |
27 | import Foundation
28 |
29 | func getAssociatedObject(_ object: Any, _ key: UnsafeRawPointer) -> T? {
30 | return objc_getAssociatedObject(object, key) as? T
31 | }
32 |
33 | func setRetainedAssociatedObject(_ object: Any, _ key: UnsafeRawPointer, _ value: T) {
34 | objc_setAssociatedObject(object, key, value, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
35 | }
36 |
--------------------------------------------------------------------------------
/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - GDPerformanceView-Swift (2.1.1)
3 | - HXPHPicker (2.0.0):
4 | - HXPHPicker/Full (= 2.0.0)
5 | - HXPHPicker/Camera (2.0.0):
6 | - HXPHPicker/Camera/Lite (= 2.0.0)
7 | - HXPHPicker/Camera/Location (= 2.0.0)
8 | - HXPHPicker/Camera/Lite (2.0.0):
9 | - HXPHPicker/Core
10 | - HXPHPicker/Camera/Location (2.0.0):
11 | - HXPHPicker/Camera/Lite
12 | - HXPHPicker/Core (2.0.0)
13 | - HXPHPicker/Editor (2.0.0):
14 | - HXPHPicker/Editor/KF (= 2.0.0)
15 | - HXPHPicker/Editor/Lite (= 2.0.0)
16 | - HXPHPicker/Editor/KF (2.0.0):
17 | - HXPHPicker/Editor/Lite
18 | - HXPHPicker/EditorView/KF
19 | - Kingfisher (~> 7.0)
20 | - HXPHPicker/Editor/Lite (2.0.0):
21 | - HXPHPicker/EditorView/Lite
22 | - HXPHPicker/EditorView/KF (2.0.0):
23 | - HXPHPicker/EditorView/Lite
24 | - Kingfisher (~> 7.0)
25 | - HXPHPicker/EditorView/Lite (2.0.0):
26 | - HXPHPicker/Core
27 | - HXPHPicker/Full (2.0.0):
28 | - HXPHPicker/Camera
29 | - HXPHPicker/Editor
30 | - HXPHPicker/Picker
31 | - HXPHPicker/Picker (2.0.0):
32 | - HXPHPicker/Picker/KF (= 2.0.0)
33 | - HXPHPicker/Picker/Lite (= 2.0.0)
34 | - HXPHPicker/Picker/KF (2.0.0):
35 | - HXPHPicker/Picker/Lite
36 | - Kingfisher (~> 7.0)
37 | - HXPHPicker/Picker/Lite (2.0.0):
38 | - HXPHPicker/Core
39 | - Kingfisher (7.6.2)
40 |
41 | DEPENDENCIES:
42 | - GDPerformanceView-Swift
43 | - HXPHPicker (from `./`)
44 |
45 | SPEC REPOS:
46 | https://github.com/CocoaPods/Specs.git:
47 | - GDPerformanceView-Swift
48 | - Kingfisher
49 |
50 | EXTERNAL SOURCES:
51 | HXPHPicker:
52 | :path: "./"
53 |
54 | SPEC CHECKSUMS:
55 | GDPerformanceView-Swift: 22d964fe40b19e3d914dba2586237d064de8fd77
56 | HXPHPicker: 4fdbc2c27e0ca43a8f2c0060e128dfead5255594
57 | Kingfisher: 6c5449c6450c5239166510ba04afe374a98afc4f
58 |
59 | PODFILE CHECKSUM: 022685221be8605f1ae599c42b709a8786891c1b
60 |
61 | COCOAPODS: 1.12.1
62 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | ${PODS_DEVELOPMENT_LANGUAGE}
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 2.1.1
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_GDPerformanceView_Swift : NSObject
3 | @end
4 | @implementation PodsDummy_GDPerformanceView_Swift
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift-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 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift-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 GDPerformanceView_SwiftVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char GDPerformanceView_SwiftVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GDPerformanceView-Swift
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 "QuartzCore" -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_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
10 | PODS_ROOT = ${SRCROOT}
11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/GDPerformanceView-Swift
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 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift.modulemap:
--------------------------------------------------------------------------------
1 | framework module GDPerformanceView_Swift {
2 | umbrella header "GDPerformanceView-Swift-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/GDPerformanceView-Swift/GDPerformanceView-Swift.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GDPerformanceView-Swift
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 "QuartzCore" -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_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
10 | PODS_ROOT = ${SRCROOT}
11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/GDPerformanceView-Swift
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 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/HXPHPicker/HXPHPicker-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | ${PODS_DEVELOPMENT_LANGUAGE}
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 2.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/HXPHPicker/HXPHPicker-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_HXPHPicker : NSObject
3 | @end
4 | @implementation PodsDummy_HXPHPicker
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/HXPHPicker/HXPHPicker-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 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/HXPHPicker/HXPHPicker-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 HXPHPickerVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char HXPHPickerVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/HXPHPicker/HXPHPicker.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/HXPHPicker
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher"
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 "Accelerate" -framework "CFNetwork" -framework "Kingfisher" -framework "Photos" -framework "PhotosUI" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI"
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_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
11 | PODS_ROOT = ${SRCROOT}
12 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/..
13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
14 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
15 | SKIP_INSTALL = YES
16 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = HXPICKER_ENABLE_CAMERA HXPICKER_ENABLE_CAMERA_LOCATION HXPICKER_ENABLE_EDITOR HXPICKER_ENABLE_EDITOR_VIEW HXPICKER_ENABLE_PICKER
17 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
18 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/HXPHPicker/HXPHPicker.modulemap:
--------------------------------------------------------------------------------
1 | framework module HXPHPicker {
2 | umbrella header "HXPHPicker-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/HXPHPicker/HXPHPicker.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/HXPHPicker
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher"
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 "Accelerate" -framework "CFNetwork" -framework "Kingfisher" -framework "Photos" -framework "PhotosUI" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI"
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_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
11 | PODS_ROOT = ${SRCROOT}
12 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/..
13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
14 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
15 | SKIP_INSTALL = YES
16 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = HXPICKER_ENABLE_CAMERA HXPICKER_ENABLE_CAMERA_LOCATION HXPICKER_ENABLE_EDITOR HXPICKER_ENABLE_EDITOR_VIEW HXPICKER_ENABLE_PICKER
17 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
18 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Kingfisher/Kingfisher-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | ${PODS_DEVELOPMENT_LANGUAGE}
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 7.6.2
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Kingfisher/Kingfisher-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Kingfisher : NSObject
3 | @end
4 | @implementation PodsDummy_Kingfisher
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Kingfisher/Kingfisher-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 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Kingfisher/Kingfisher-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 KingfisherVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char KingfisherVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Kingfisher/Kingfisher.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher
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 "Accelerate" -framework "CFNetwork" -weak_framework "Combine" -weak_framework "SwiftUI"
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_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
10 | PODS_ROOT = ${SRCROOT}
11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Kingfisher
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 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Kingfisher/Kingfisher.modulemap:
--------------------------------------------------------------------------------
1 | framework module Kingfisher {
2 | umbrella header "Kingfisher-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Kingfisher/Kingfisher.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher
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 "Accelerate" -framework "CFNetwork" -weak_framework "Combine" -weak_framework "SwiftUI"
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_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
10 | PODS_ROOT = ${SRCROOT}
11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Kingfisher
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 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | ${PODS_DEVELOPMENT_LANGUAGE}
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Pods_Example : NSObject
3 | @end
4 | @implementation PodsDummy_Pods_Example
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-Example/Pods-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_ExampleVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char Pods_ExampleVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-Example/Pods-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}/GDPerformanceView-Swift" "${PODS_CONFIGURATION_BUILD_DIR}/HXPHPicker" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GDPerformanceView-Swift/GDPerformanceView_Swift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/HXPHPicker/HXPHPicker.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.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 "Accelerate" -framework "CFNetwork" -framework "Foundation" -framework "GDPerformanceView_Swift" -framework "HXPHPicker" -framework "Kingfisher" -framework "Photos" -framework "PhotosUI" -framework "QuartzCore" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI"
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 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap:
--------------------------------------------------------------------------------
1 | framework module Pods_Example {
2 | umbrella header "Pods-Example-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-Example/Pods-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}/GDPerformanceView-Swift" "${PODS_CONFIGURATION_BUILD_DIR}/HXPHPicker" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GDPerformanceView-Swift/GDPerformanceView_Swift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/HXPHPicker/HXPHPicker.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.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 "Accelerate" -framework "CFNetwork" -framework "Foundation" -framework "GDPerformanceView_Swift" -framework "HXPHPicker" -framework "Kingfisher" -framework "Photos" -framework "PhotosUI" -framework "QuartzCore" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI"
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 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Camera+Location/CameraViewController+Location.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CameraViewController+Location.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/9/1.
6 | //
7 |
8 | #if HXPICKER_ENABLE_CAMERA_LOCATION
9 | import UIKit
10 | import CoreLocation
11 |
12 | extension CameraViewController: CLLocationManagerDelegate {
13 |
14 | var allowLocation: Bool {
15 | let whenIn = Bundle.main.object(forInfoDictionaryKey: "NSLocationWhenInUseUsageDescription") != nil
16 | let always = Bundle.main.object(forInfoDictionaryKey: "NSLocationAlwaysUsageDescription") != nil
17 | return config.allowLocation && (whenIn || always)
18 | }
19 |
20 | func startLocation() {
21 | if !allowLocation { return }
22 | if CLLocationManager.authorizationStatus() != .denied {
23 | locationManager.startUpdatingLocation()
24 | didLocation = true
25 | }
26 | }
27 |
28 | public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
29 | if !locations.isEmpty {
30 | currentLocation = locations.last
31 | }
32 | }
33 | }
34 | #endif
35 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Camera/Controller/CameraViewController+Editor.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CameraViewController+Editor.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/8/31.
6 | //
7 |
8 | import UIKit
9 |
10 | #if HXPICKER_ENABLE_EDITOR
11 | extension CameraViewController: EditorViewControllerDelegate {
12 | public func editorViewController(_ editorViewController: EditorViewController, didFinish asset: EditorAsset) {
13 | guard let result = asset.result else {
14 | if let image = asset.type.image {
15 | didFinish(withImage: image)
16 | }
17 | if let videoURL = asset.type.videoURL {
18 | didFinish(withVideo: videoURL)
19 | }
20 | return
21 | }
22 | switch result {
23 | case .image(let editedResult, _):
24 | if let image = UIImage(contentsOfFile: editedResult.url.path) {
25 | didFinish(withImage: image)
26 | }
27 | case .video(let editedResult, _):
28 | didFinish(withVideo: editedResult.url)
29 | }
30 | }
31 | }
32 | extension CameraViewController{
33 | func openPhotoEditor(_ image: UIImage) {
34 | config.editor.isAutoBack = autoDismiss
35 | let vc = EditorViewController(
36 | .init(type: .image(image)),
37 | config: config.editor,
38 | delegate: self
39 | )
40 | navigationController?.pushViewController(vc, animated: false)
41 | }
42 | }
43 | extension CameraViewController {
44 | func openVideoEditor(_ videoURL: URL) {
45 | config.editor.isAutoBack = autoDismiss
46 | let vc = EditorViewController(
47 | .init(type: .video(videoURL)),
48 | config: config.editor,
49 | delegate: self
50 | )
51 | navigationController?.pushViewController(vc, animated: false)
52 | }
53 | }
54 | #endif
55 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Camera/Controller/CameraViewController+Preview.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CameraViewController+Preview.swift
3 | // CameraViewController+Preview
4 | //
5 | // Created by Slience on 2021/10/19.
6 | //
7 |
8 | import UIKit
9 |
10 | extension CameraViewController: CameraPreviewViewDelegate {
11 | func previewView(didPreviewing previewView: CameraPreviewView) {
12 | bottomView.hiddenTip()
13 | if !config.videoFilters.isEmpty && firstShowFilterName && cameraManager.filterIndex > 0 {
14 | if config.changeFilterShowName {
15 | previewView.showFilterName(
16 | cameraManager.videoFilter.currentFilterName,
17 | true
18 | )
19 | }
20 | firstShowFilterName = false
21 | }
22 | bottomView.isGestureEnable = true
23 | }
24 | func previewView(_ previewView: CameraPreviewView, pinchGestureScale scale: CGFloat) {
25 | cameraManager.zoomFacto = scale
26 | }
27 |
28 | func previewView(_ previewView: CameraPreviewView, tappedToFocusAt point: CGPoint) {
29 | try? cameraManager.expose(at: point)
30 | }
31 |
32 | func previewView(didLeftSwipe previewView: CameraPreviewView) {
33 | if !config.videoFilters.isEmpty {
34 | cameraManager.filterIndex += 1
35 | if config.changeFilterShowName {
36 | previewView.showFilterName(
37 | cameraManager.videoFilter.currentFilterName,
38 | false
39 | )
40 | }
41 | }
42 | }
43 |
44 | func previewView(didRightSwipe previewView: CameraPreviewView) {
45 | if !config.videoFilters.isEmpty {
46 | cameraManager.filterIndex -= 1
47 | if config.changeFilterShowName {
48 | previewView.showFilterName(
49 | cameraManager.videoFilter.currentFilterName,
50 | true
51 | )
52 | }
53 | }
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Camera/View/PassThrough.metal:
--------------------------------------------------------------------------------
1 | /*
2 | See LICENSE folder for this sample’s licensing information.
3 |
4 | Abstract:
5 | Pass-through shader (used for preview).
6 | */
7 |
8 | #include
9 | using namespace metal;
10 |
11 | // Vertex input/output structure for passing results from vertex shader to fragment shader
12 | struct VertexIO
13 | {
14 | float4 position [[position]];
15 | float2 textureCoord [[user(texturecoord)]];
16 | };
17 |
18 | // Vertex shader for a textured quad
19 | vertex VertexIO vertexPassThrough(const device packed_float4 *pPosition [[ buffer(0) ]],
20 | const device packed_float2 *pTexCoords [[ buffer(1) ]],
21 | uint vid [[ vertex_id ]])
22 | {
23 | VertexIO outVertex;
24 |
25 | outVertex.position = pPosition[vid];
26 | outVertex.textureCoord = pTexCoords[vid];
27 |
28 | return outVertex;
29 | }
30 |
31 | // Fragment shader for a textured quad
32 | fragment half4 fragmentPassThrough(VertexIO inputFragment [[ stage_in ]],
33 | texture2d inputTexture [[ texture(0) ]],
34 | sampler samplr [[ sampler(0) ]])
35 | {
36 | return inputTexture.sample(samplr, inputFragment.textureCoord);
37 | }
38 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Config/SelectBoxConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SelectBoxConfiguration.swift
3 | // HXPHPickerExample
4 | //
5 | // Created by Slience on 2020/12/29.
6 | // Copyright © 2020 Silence. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | // MARK: 选择框配置类
12 | public struct SelectBoxConfiguration {
13 |
14 | /// 选择框的大小
15 | public var size: CGSize = CGSize(width: 25, height: 25)
16 |
17 | /// 选择框的样式
18 | public var style: SelectBoxView.Style = .number
19 |
20 | /// 标题的文字大小
21 | public var titleFontSize: CGFloat = 16
22 |
23 | /// 选中之后的 标题 颜色
24 | public var titleColor: UIColor = .white
25 |
26 | /// 暗黑风格下选中之后的 标题 颜色
27 | public var titleDarkColor: UIColor = .white
28 |
29 | /// 选中状态下勾勾的宽度
30 | public var tickWidth: CGFloat = 1.5
31 |
32 | /// 选中之后的 勾勾 颜色
33 | public var tickColor: UIColor = .white
34 |
35 | /// 暗黑风格下选中之后的 勾勾 颜色
36 | public var tickDarkColor: UIColor = .white
37 |
38 | /// 未选中时框框中间的颜色
39 | public var backgroundColor: UIColor = .black.withAlphaComponent(0.4)
40 |
41 | /// 暗黑风格下未选中时框框中间的颜色
42 | public var darkBackgroundColor: UIColor = .black.withAlphaComponent(0.4)
43 |
44 | /// 选中之后的背景颜色
45 | public var selectedBackgroundColor: UIColor = HXPickerWrapper.systemTintColor
46 |
47 | /// 暗黑风格下选中之后的背景颜色
48 | public var selectedBackgroudDarkColor: UIColor = HXPickerWrapper.systemTintColor
49 |
50 | /// 未选中时的边框宽度
51 | public var borderWidth: CGFloat = 1.5
52 |
53 | /// 未选中时的边框颜色
54 | public var borderColor: UIColor = .white
55 |
56 | /// 暗黑风格下未选中时的边框颜色
57 | public var borderDarkColor: UIColor = .white
58 |
59 | public init() { }
60 | }
61 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+Bundle.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+Bundle.swift
3 | // HXPHPickerExample
4 | //
5 | // Created by Silence on 2020/11/15.
6 | // Copyright © 2020 Silence. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | extension Bundle {
12 |
13 | static func localizedString(for key: String) -> String {
14 | return localizedString(for: key, value: nil)
15 | }
16 |
17 | static func localizedString(for key: String, value: String?) -> String {
18 | let bundle = PhotoManager.shared.languageBundle
19 | var newValue = bundle?.localizedString(forKey: key, value: value, table: nil)
20 | if newValue == nil {
21 | newValue = key
22 | }
23 | return newValue!
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+CALayer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+CALayer.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/7/14.
6 | //
7 |
8 | import UIKit
9 |
10 | extension CALayer {
11 | func convertedToImage(
12 | size: CGSize = .zero,
13 | scale: CGFloat = UIScreen.main.scale
14 | ) -> UIImage? {
15 | var toSize: CGSize
16 | if size.equalTo(.zero) {
17 | toSize = frame.size
18 | }else {
19 | toSize = size
20 | }
21 | UIGraphicsBeginImageContextWithOptions(toSize, false, scale)
22 | guard let context = UIGraphicsGetCurrentContext() else {
23 | return nil
24 | }
25 | render(in: context)
26 | let image = UIGraphicsGetImageFromCurrentImageContext()
27 | UIGraphicsEndImageContext()
28 | return image
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+CGFloat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+CGFloat.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2023/1/31.
6 | //
7 |
8 | import Foundation
9 |
10 | extension CGFloat {
11 |
12 | static var max: CGFloat {
13 | CGFloat(MAXFLOAT)
14 | }
15 |
16 | var compressionQuality: CGFloat {
17 | if self > 30000000 {
18 | return 30000000 / self
19 | }else if self > 15000000 {
20 | return 10000000 / self
21 | }else if self > 10000000 {
22 | return 6000000 / self
23 | }else {
24 | return 3000000 / self
25 | }
26 | }
27 |
28 | var transitionCompressionQuality: CGFloat {
29 | if self > 6000000 {
30 | return 3000000 / self
31 | }else if self > 3000000 {
32 | return 1000000 / self
33 | }else if self > 1000000 {
34 | return 600000 / self
35 | }else {
36 | return 1000000 / self
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+Data.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+Data.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/5/20.
6 | //
7 |
8 | import Foundation
9 |
10 | extension Data {
11 |
12 | var imageContentType: ImageContentType {
13 | var values = [UInt8](repeating: 0, count: 1)
14 | copyBytes(to: &values, count: 1)
15 | switch values[0] {
16 | case 0xFF:
17 | return .jpg
18 | case 0x89:
19 | return .png
20 | case 0x47, 0x49, 0x46:
21 | return .gif
22 | default:
23 | return .unknown
24 | }
25 | }
26 |
27 | var isGif: Bool {
28 | imageContentType == .gif
29 | }
30 |
31 |
32 | var fileType: FileType {
33 | guard let firstByte = first else {
34 | return .unknown
35 | }
36 | switch firstByte {
37 | case 0xFF:
38 | return .image
39 | case 0x25:
40 | return .auido
41 | case 0x00:
42 | return .video
43 | default:
44 | return .unknown
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+Dictionary.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+Dictionary.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/1/7.
6 | //
7 |
8 | import Photos
9 |
10 | extension Dictionary {
11 |
12 | /// 资源是否存在iCloud上
13 | var inICloud: Bool {
14 | if let isICloud = self[AnyHashable(PHImageResultIsInCloudKey) as! Key] as? Int {
15 | return isICloud == 1
16 | }
17 | return false
18 | }
19 |
20 | /// 资源是否取消了下载
21 | var isCancel: Bool {
22 | if let isCancel = self[AnyHashable(PHImageCancelledKey) as! Key] as? Int {
23 | return isCancel == 1
24 | }
25 | return false
26 | }
27 | var error: Error? {
28 | self[AnyHashable(PHImageErrorKey) as! Key] as? Error
29 | }
30 | /// 判断资源是否下载错误
31 | var isError: Bool {
32 | self[AnyHashable(PHImageErrorKey) as! Key] != nil
33 | }
34 |
35 | /// 判断资源下载得到的是否为退化的
36 | var isDegraded: Bool {
37 | if let isDegraded = self[AnyHashable(PHImageResultIsDegradedKey) as! Key] as? Int {
38 | return isDegraded == 1
39 | }
40 | return false
41 | }
42 |
43 | /// 判断资源是否下载完成
44 | var downloadFinined: Bool {
45 | !isCancel && !isError && !isDegraded
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+DispatchQueue.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+DispatchQueue.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/5/14.
6 | //
7 |
8 | import Foundation
9 |
10 | extension DispatchQueue {
11 | // 注意此方法为 static
12 | private static var token: DispatchSpecificKey<()> = {
13 | // 初始化一个 key
14 | let key = DispatchSpecificKey<()>()
15 | // 在主队列上关联一个空元组
16 | DispatchQueue.main.setSpecific(key: key, value: ())
17 | return key
18 | }()
19 |
20 | // 通过队列上是否有绑定 token 对应的值来判断是否为主队列
21 | static var isMain: Bool {
22 | return DispatchQueue.getSpecific(key: token) != nil
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+FileManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+FileManager.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2022/10/1.
6 | //
7 |
8 | import Foundation
9 |
10 | extension FileManager: HXPickerCompatible {
11 | class var documentPath: String {
12 | NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last ?? ""
13 | }
14 | class var cachesPath: String {
15 | NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).last ?? ""
16 | }
17 | class var tempPath: String {
18 | NSTemporaryDirectory()
19 | }
20 | }
21 |
22 | public extension HXPickerWrapper where Base: FileManager {
23 | static var documentPath: String {
24 | Base.documentPath
25 | }
26 | static var cachesPath: String {
27 | Base.cachesPath
28 | }
29 | static var tempPath: String {
30 | Base.tempPath
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+PHAssetCollection.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+PHAssetCollection.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/1/7.
6 | //
7 |
8 | import UIKit
9 | import Photos
10 |
11 | extension PHAssetCollection: HXPickerCompatible {
12 |
13 | /// 是否相机胶卷
14 | var isCameraRoll: Bool {
15 | var versionStr = UIDevice.current.systemVersion.replacingOccurrences(of: ".", with: "")
16 | if versionStr.count <= 1 {
17 | versionStr.append("00")
18 | }else if versionStr.count <= 2 {
19 | versionStr.append("0")
20 | }
21 | let version = Int(versionStr) ?? 0
22 | if version >= 800 && version <= 802 {
23 | return assetCollectionSubtype == .smartAlbumRecentlyAdded
24 | }else {
25 | return assetCollectionSubtype == .smartAlbumUserLibrary
26 | }
27 | }
28 | }
29 |
30 | public extension HXPickerWrapper where Base: PHAssetCollection {
31 | var isCameraRoll: Bool {
32 | base.isCameraRoll
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+UIApplication.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+UIApplication.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2022/9/26.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIApplication {
11 | class var _keyWindow: UIWindow? {
12 | var window: UIWindow?
13 | if #available(iOS 13.0, *) {
14 | window = shared.windows.filter({ $0.isKeyWindow }).last
15 | } else {
16 | window = shared.delegate?.window ?? shared.keyWindow
17 | }
18 | return window
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+UIFont.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+UIFont.swift
3 | // HXPHPickerExample
4 | //
5 | // Created by Silence on 2020/11/13.
6 | // Copyright © 2020 Silence. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | extension UIFont {
12 |
13 | static func regularPingFang(ofSize size: CGFloat) -> UIFont {
14 | let font = UIFont.init(name: "PingFangSC-Regular", size: size)
15 | return font ?? UIFont.systemFont(ofSize: size)
16 | }
17 |
18 | static func mediumPingFang(ofSize size: CGFloat) -> UIFont {
19 | let font = UIFont.init(name: "PingFangSC-Medium", size: size)
20 | return font ?? UIFont.systemFont(ofSize: size)
21 | }
22 |
23 | static func semiboldPingFang(ofSize size: CGFloat) -> UIFont {
24 | let font = UIFont.init(name: "PingFangSC-Semibold", size: size)
25 | return font ?? UIFont.systemFont(ofSize: size)
26 | }
27 | }
28 |
29 | public extension HXPickerWrapper where Base == UIFont {
30 |
31 | static func regularPingFang(ofSize size: CGFloat) -> UIFont {
32 | Base.regularPingFang(ofSize: size)
33 | }
34 |
35 | static func mediumPingFang(ofSize size: CGFloat) -> UIFont {
36 | Base.mediumPingFang(ofSize: size)
37 | }
38 |
39 | static func semiboldPingFang(ofSize size: CGFloat) -> UIFont {
40 | Base.semiboldPingFang(ofSize: size)
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+UIImageView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+UIImageView.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/1/9.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIImageView {
11 |
12 | func setImage(_ image: UIImage?, duration: CFTimeInterval = 0.2, animated: Bool = true) {
13 | if let image = image {
14 | self.image = image
15 | if animated {
16 | let transition = CATransition()
17 | transition.type = .fade
18 | transition.duration = duration
19 | transition.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
20 | layer.add(transition, forKey: nil)
21 | }
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+UILabel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+UILabel.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/10/22.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UILabel {
11 | var textHeight: CGFloat {
12 | text?.height(ofFont: font, maxWidth: width > 0 ? width : .max) ?? 0
13 | }
14 | var textWidth: CGFloat {
15 | text?.width(ofFont: font, maxHeight: height > 0 ? height : .max) ?? 0
16 | }
17 | var textSize: CGSize {
18 | text?.size(ofFont: font, maxWidth: .max, maxHeight: .max) ?? .zero
19 | }
20 | }
21 |
22 | public extension HXPickerWrapper where Base: UILabel {
23 | var textWidth: CGFloat {
24 | base.textWidth
25 | }
26 | var textHeight: CGFloat {
27 | base.textHeight
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+UIViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+UIViewController.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/8/16.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController: HXPickerCompatible {
11 |
12 | class var topViewController: UIViewController? {
13 | let window = UIApplication._keyWindow
14 | if var topViewController = window?.rootViewController {
15 | while true {
16 | if let controller = topViewController.presentedViewController {
17 | topViewController = controller
18 | }else if let navController = topViewController as? UINavigationController,
19 | let controller = navController.topViewController {
20 | topViewController = controller
21 | }else if let tabbarController = topViewController as? UITabBarController,
22 | let controller = tabbarController.selectedViewController {
23 | topViewController = controller
24 | }else {
25 | break
26 | }
27 | }
28 | return topViewController
29 | }
30 | return nil
31 | }
32 | }
33 |
34 | public extension HXPickerWrapper where Base: UIViewController {
35 | static var topViewController: UIViewController? {
36 | Base.topViewController
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Extension/Core+URL.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Core+URL.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/6/17.
6 | //
7 |
8 | import Foundation
9 | #if canImport(Kingfisher)
10 | import Kingfisher
11 | #endif
12 |
13 | extension URL: HXPickerCompatibleValue {
14 | var isGif: Bool {
15 | absoluteString.hasSuffix("gif") || absoluteString.hasSuffix("GIF")
16 | }
17 | var fileSize: Int {
18 | guard let fileSize = try? resourceValues(forKeys: [.fileSizeKey]) else {
19 | return 0
20 | }
21 | return fileSize.fileSize ?? 0
22 | }
23 |
24 | #if canImport(Kingfisher)
25 | var isCache: Bool {
26 | ImageCache.default.isCached(forKey: cacheKey)
27 | }
28 | #endif
29 |
30 | var fileType: FileType {
31 | guard let fileData = try? Data(contentsOf: self) else {
32 | return .unknown
33 | }
34 | return fileData.fileType
35 | }
36 | }
37 |
38 |
39 | public extension HXPickerWrapper where Base == URL {
40 | #if canImport(Kingfisher)
41 | var isCache: Bool {
42 | base.isCache
43 | }
44 | #endif
45 | }
46 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Model/AppearanceStyle.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppearanceStyle.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/1/7.
6 | //
7 |
8 | import Foundation
9 |
10 | public enum AppearanceStyle: Int {
11 | /// 跟随系统变化
12 | case varied = 0
13 | /// 正常风格,不会跟随系统变化
14 | case normal = 1
15 | /// 暗黑风格
16 | case dark = 2
17 | }
18 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Model/CustomLanguage.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CustomLanguage.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/1/7.
6 | //
7 |
8 | import Foundation
9 |
10 | public class CustomLanguage {
11 | /// 语言
12 | /// 会与 Locale.preferredLanguages 进行匹配,匹配成功的才会使用。请确保正确性
13 | public let language: String
14 | /// 语言文件路径
15 | public let path: String
16 |
17 | public init(language: String,
18 | path: String) {
19 | self.language = language
20 | self.path = path
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Model/ExportPreset.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ExportPreset.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/8/18.
6 | //
7 |
8 | import UIKit
9 | import AVKit
10 |
11 | public struct VideoExportParameter {
12 | /// 视频导出的分辨率
13 | public let preset: ExportPreset
14 | /// 视频质量 [1 - 10]
15 | public let quality: Int
16 |
17 | /// 设置视频导出参数
18 | /// - Parameters:
19 | /// - exportPreset: 视频导出的分辨率
20 | /// - videoQuality: 视频质量 [1 - 10]
21 | public init(
22 | preset: ExportPreset,
23 | quality: Int
24 | ) {
25 | self.preset = preset
26 | self.quality = quality
27 | }
28 | }
29 |
30 | public enum ExportPreset {
31 | case lowQuality
32 | case mediumQuality
33 | case highQuality
34 | case ratio_640x480
35 | case ratio_960x540
36 | case ratio_1280x720
37 |
38 | public var name: String {
39 | switch self {
40 | case .lowQuality:
41 | return AVAssetExportPresetLowQuality
42 | case .mediumQuality:
43 | return AVAssetExportPresetMediumQuality
44 | case .highQuality:
45 | return AVAssetExportPresetHighestQuality
46 | case .ratio_640x480:
47 | return AVAssetExportPreset640x480
48 | case .ratio_960x540:
49 | return AVAssetExportPreset960x540
50 | case .ratio_1280x720:
51 | return AVAssetExportPreset1280x720
52 | }
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Model/ImageContentType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ImageContentType.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/5/21.
6 | //
7 |
8 | import UIKit
9 |
10 | public enum ImageContentType: String {
11 | case jpg, png, gif, unknown
12 | public var fileExtension: String {
13 | return self.rawValue
14 | }
15 | }
16 |
17 | enum FileType: String {
18 | case unknown
19 | case image
20 | case auido
21 | case video
22 | }
23 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Model/IndicatorType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // IndicatorType.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/1/8.
6 | //
7 |
8 | import UIKit
9 |
10 | public enum IndicatorType {
11 | /// gradient ring
12 | /// 渐变圆环
13 | case circle
14 | /// System chrysanthemum
15 | /// 系统菊花
16 | case system
17 | }
18 |
19 | public protocol IndicatorTypeConfig {
20 | /// Loading indicator type
21 | /// 加载指示器类型
22 | var indicatorType: IndicatorType { get set }
23 | }
24 |
25 | public extension IndicatorTypeConfig {
26 | var indicatorType: IndicatorType {
27 | get { PhotoManager.shared.indicatorType }
28 | set { PhotoManager.shared.indicatorType = newValue }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Model/LanguageType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LanguageType.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/1/7.
6 | //
7 |
8 | import Foundation
9 |
10 | public enum LanguageType: Int {
11 | /// 跟随系统语言
12 | case system = 0
13 | /// 中文简体
14 | case simplifiedChinese = 1
15 | /// 中文繁体
16 | case traditionalChinese = 2
17 | /// 日文
18 | case japanese = 3
19 | /// 韩文
20 | case korean = 4
21 | /// 英文
22 | case english = 5
23 | /// 泰语
24 | case thai = 6
25 | /// 印尼语
26 | case indonesia = 7
27 | /// 越南语
28 | case vietnamese = 8
29 | /// 俄语
30 | case russian = 9
31 | /// 德语
32 | case german = 10
33 | /// 法语
34 | case french = 11
35 | /// 阿拉伯
36 | case arabic = 12
37 | }
38 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Model/LivePhotoError.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LivePhotoError.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/1/7.
6 | //
7 |
8 | import Foundation
9 |
10 | public enum LivePhotoError {
11 | case imageError(Error?)
12 | case videoError(Error?)
13 | case allError(Error?, Error?)
14 | }
15 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/Model/PhotoPanGestureRecognizer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PhotoPanGestureRecognizer.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/7/1.
6 | //
7 |
8 | import UIKit
9 |
10 | class PhotoPanGestureRecognizer: UIPanGestureRecognizer {
11 | override func touchesBegan(_ touches: Set, with event: UIEvent) {
12 | super.touchesBegan(touches, with: event)
13 | state = .began
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Core/View/VideoPlayerView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // VideoPlayerView.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/1/9.
6 | //
7 |
8 | import UIKit
9 | import AVKit
10 |
11 | class VideoPlayerView: UIView {
12 |
13 | override class var layerClass: AnyClass {
14 | return AVPlayerLayer.self
15 | }
16 |
17 | lazy var player: AVPlayer = {
18 | let player = AVPlayer()
19 | return player
20 | }()
21 | var playerLayer: AVPlayerLayer {
22 | return layer as! AVPlayerLayer
23 | }
24 |
25 | var avAsset: AVAsset?
26 |
27 | init() {
28 | super.init(frame: .zero)
29 | }
30 |
31 | required init?(coder: NSCoder) {
32 | fatalError("init(coder:) has not been implemented")
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor+View/Extension/EditorView+AVAsset.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorView+AVAsset.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2023/2/25.
6 | //
7 |
8 | import UIKit
9 | import AVFoundation
10 |
11 | extension AVAsset {
12 |
13 | var videoOrientation: AVCaptureVideoOrientation {
14 | guard let videoTrack = tracks(withMediaType: .video).first else {
15 | return .landscapeRight
16 | }
17 |
18 | let t = videoTrack.preferredTransform
19 |
20 | if (t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0) ||
21 | (t.a == 0 && t.b == 1.0 && t.c == 1.0 && t.d == 0) {
22 | return .portrait // 90
23 | } else if (t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0) ||
24 | (t.a == 0 && t.b == -1.0 && t.c == -1.0 && t.d == 0) {
25 | return .portraitUpsideDown // 270
26 | } else if t.a == 1.0 && t.b == 0 && t.c == 0 && t.d == 1.0 {
27 | return .landscapeRight // 0
28 | } else if t.a == -1.0 && t.b == 0 && t.c == 0 && t.d == -1.0 {
29 | return .landscapeLeft // 180
30 | } else {
31 | return .landscapeRight
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor+View/Extension/EditorView+CGFloat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CGFloat+EditorView.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2023/1/19.
6 | //
7 |
8 | import Foundation
9 |
10 | extension CGFloat {
11 | var angle: CGFloat {
12 | self * (180 / .pi)
13 | }
14 | var radians: CGFloat {
15 | self / 180 * .pi
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor+View/Extension/EditorView+UIView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIView+EditorView.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2023/1/19.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIView {
11 | func color(for point: CGPoint) -> UIColor? {
12 | // 用来存放目标像素值
13 | var pixel = [UInt8](repeatElement(0, count: 4))
14 | // 颜色空间为 RGB,这决定了输出颜色的编码是 RGB 还是其他(比如 YUV)
15 | let colorSpace = CGColorSpaceCreateDeviceRGB()
16 | // 设置位图颜色分布为 RGBA
17 | let bitmapInfo = CGImageAlphaInfo.premultipliedLast.rawValue
18 | guard let context = CGContext(
19 | data: &pixel,
20 | width: 1,
21 | height: 1,
22 | bitsPerComponent: 8,
23 | bytesPerRow: 4,
24 | space: colorSpace,
25 | bitmapInfo: bitmapInfo
26 | ) else {
27 | return nil
28 | }
29 | // 设置 context 原点偏移为目标位置所有坐标
30 | context.translateBy(x: -point.x, y: -point.y)
31 | // 将图像渲染到 context 中
32 | layer.render(in: context)
33 |
34 | return UIColor(red: CGFloat(pixel[0]) / 255.0,
35 | green: CGFloat(pixel[1]) / 255.0,
36 | blue: CGFloat(pixel[2]) / 255.0,
37 | alpha: CGFloat(pixel[3]) / 255.0)
38 | }
39 |
40 | class func animate(
41 | animations: @escaping () -> Void,
42 | completion: ((Bool) -> Void)? = nil
43 | ) {
44 | animate(
45 | withDuration: 0.3,
46 | delay: 0,
47 | options: [.curveEaseOut, .layoutSubviews],
48 | animations: animations,
49 | completion: completion
50 | )
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor+View/VideoEditedResult.swift:
--------------------------------------------------------------------------------
1 | //
2 | // VideoEditedResult.swift
3 | // HXPHPicker
4 | //
5 | // Created by Silence on 2023/5/26.
6 | //
7 |
8 | import UIKit
9 |
10 | public struct VideoEditedResult {
11 |
12 | /// 编辑后的视频地址
13 | public var url: URL {
14 | urlConfig.url
15 | }
16 |
17 | public let urlConfig: EditorURLConfig
18 |
19 | /// 编辑后的视频封面
20 | public let coverImage: UIImage?
21 |
22 | /// 编辑后的视频大小
23 | public let fileSize: Int
24 |
25 | /// 视频时长 格式:00:00
26 | public let videoTime: String
27 |
28 | /// 视频时长 秒
29 | public let videoDuration: TimeInterval
30 |
31 | /// 编辑视图的状态
32 | public let data: EditAdjustmentData?
33 |
34 | public init(data: EditAdjustmentData? = nil) {
35 | self.data = data
36 | urlConfig = .empty
37 | coverImage = nil
38 | fileSize = 0
39 | videoTime = "00:00"
40 | videoDuration = 0
41 | }
42 |
43 | init(
44 | urlConfig: EditorURLConfig,
45 | coverImage: UIImage?,
46 | fileSize: Int,
47 | videoTime: String,
48 | videoDuration: TimeInterval,
49 | data: EditAdjustmentData?
50 | ) {
51 | self.urlConfig = urlConfig
52 | self.coverImage = coverImage
53 | self.fileSize = fileSize
54 | self.videoTime = videoTime
55 | self.videoDuration = videoDuration
56 | self.data = data
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor+View/View/EditorFrameView+Control.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorFrameView+Control.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2022/11/13.
6 | //
7 |
8 | import UIKit
9 |
10 | extension EditorFrameView: EditorControlViewDelegate {
11 | func controlView(beganChanged controlView: EditorControlView, _ rect: CGRect) {
12 | if !controlView.isUserInteractionEnabled {
13 | return
14 | }
15 | hideMaskBgView()
16 | maskLinesView.hideGridGraylinesView(animated: true)
17 | stopControlTimer()
18 | delegate?.frameView(beganChanged: self, rect)
19 | hideVideoSilder(true)
20 | }
21 |
22 | func controlView(didChanged controlView: EditorControlView, _ rect: CGRect) {
23 | if !controlView.isUserInteractionEnabled {
24 | return
25 | }
26 | stopControlTimer()
27 | maskBgView.updateLayers(rect, false)
28 | customMaskView.updateLayers(rect, false)
29 | maskLinesView.updateLayers(rect, false)
30 | updateVideoSlider(to: rect, animated: false)
31 | delegate?.frameView(didChanged: self, rect)
32 | }
33 |
34 | func controlView(endChanged controlView: EditorControlView, _ rect: CGRect) {
35 | if !controlView.isUserInteractionEnabled {
36 | return
37 | }
38 | startControlTimer()
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor+View/View/EditorFrameView+VideoPlay.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorFrameView+VideoPlay.swift
3 | // HXPHPicker
4 | //
5 | // Created by 洪欣 on 2023/5/4.
6 | //
7 |
8 | import UIKit
9 |
10 | extension EditorFrameView: VideoPlaySliderViewDelegate {
11 |
12 | func videoSliderView(
13 | _ videoSliderView: VideoPlaySliderView,
14 | didChangedPlayDuration duration: CGFloat,
15 | state: VideoControlEvent
16 | ) {
17 | delegate?.frameView(self, didChangedPlayTime: duration, for: state)
18 | }
19 |
20 | func videoSliderView(
21 | _ videoSliderView: VideoPlaySliderView,
22 | didPlayButtonClick isSelected: Bool
23 | ) {
24 | delegate?.frameView(self, didPlayButtonClick: isSelected)
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor+View/View/EditorView+GestureRecognizer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorView+GestureRecognizer.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2022/11/13.
6 | //
7 |
8 | import UIKit
9 |
10 | extension EditorView: UIGestureRecognizerDelegate {
11 |
12 | public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
13 | if gestureRecognizer is UIPanGestureRecognizer {
14 | if isDrawEnabled || isMosaicEnabled {
15 | return false
16 | }
17 | }
18 | return true
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor+View/View/EditorView+ScrollView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorView+ScrollView.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2022/11/13.
6 | //
7 |
8 | import UIKit
9 |
10 | extension EditorView: UIScrollViewDelegate {
11 |
12 | public func viewForZooming(in scrollView: UIScrollView) -> UIView? {
13 | allowZoom ? adjusterView : nil
14 | }
15 | public func scrollViewDidZoom(_ scrollView: UIScrollView) {
16 | if !allowZoom {
17 | return
18 | }
19 | let viewWidth = scrollView.width - scrollView.contentInset.left - scrollView.contentInset.right
20 | let viewHeight = scrollView.height - scrollView.contentInset.top - scrollView.contentInset.bottom
21 | let offsetX = (viewWidth > scrollView.contentSize.width) ?
22 | (viewWidth - scrollView.contentSize.width) * 0.5 : 0
23 | let offsetY = (viewHeight > scrollView.contentSize.height) ?
24 | (viewHeight - scrollView.contentSize.height) * 0.5 : 0
25 | let centerX = scrollView.contentSize.width * 0.5 + offsetX
26 | let centerY = scrollView.contentSize.height * 0.5 + offsetY
27 | adjusterView.center = CGPoint(x: centerX, y: centerY)
28 | }
29 | public func scrollViewDidEndZooming(
30 | _ scrollView: UIScrollView,
31 | with view: UIView?,
32 | atScale scale: CGFloat
33 | ) {
34 | adjusterView.zoomScale = scale
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor/Controller/EditorViewController+Mosaic.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorViewController+Mosaic.swift
3 | // HXPHPicker
4 | //
5 | // Created by Silence on 2023/5/20.
6 | //
7 |
8 | import UIKit
9 |
10 | extension EditorViewController: EditorMosaicToolViewDelegate {
11 | func mosaicToolView(_ mosaicToolView: EditorMosaicToolView, didChangedMosaicType type: EditorMosaicType) {
12 | editorView.mosaicType = type
13 | }
14 |
15 | func mosaicToolView(didUndoClick mosaicToolView: EditorMosaicToolView) {
16 | editorView.undoMosaic()
17 | mosaicToolView.canUndo = editorView.isCanUndoMosaic
18 | checkFinishButtonState()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor/Controller/EditorViewController+Ratio.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorViewController+Ratio.swift
3 | // HXPHPicker
4 | //
5 | // Created by Silence on 2023/5/17.
6 | //
7 |
8 | import UIKit
9 |
10 | extension EditorViewController: EditorRatioToolViewDelegate {
11 | func ratioToolView(_ ratioToolView: EditorRatioToolView, didSelectedRatioAt ratio: CGSize) {
12 | if ratio.width < 0 || ratio.height < 0 {
13 | editorView.isFixedRatio = true
14 | editorView.setAspectRatio(editorView.originalAspectRatio, animated: true)
15 | }else {
16 | if ratio == .zero {
17 | editorView.isFixedRatio = false
18 | }else {
19 | editorView.isFixedRatio = true
20 | editorView.setAspectRatio(ratio, animated: true)
21 | }
22 | }
23 | resetButton.isEnabled = isReset
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor/Controller/EditorViewController+Text.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorViewController+Text.swift
3 | // HXPHPicker
4 | //
5 | // Created by Silence on 2023/5/17.
6 | //
7 |
8 | import UIKit
9 |
10 | extension EditorViewController: EditorStickerTextViewControllerDelegate {
11 | func stickerTextViewController(_ controller: EditorStickerTextViewController, didFinish stickerText: EditorStickerText) {
12 | deselectedDrawTool()
13 | if let tool = selectedTool,
14 | tool.type == .graffiti || tool.type == .graffiti {
15 | selectedTool = nil
16 | }
17 | editorView.addSticker(stickerText)
18 | checkSelectedTool()
19 | checkFinishButtonState()
20 | }
21 |
22 | func stickerTextViewController(
23 | _ controller: EditorStickerTextViewController,
24 | didFinishUpdate stickerText: EditorStickerText
25 | ) {
26 | deselectedDrawTool()
27 | if let tool = selectedTool,
28 | tool.type == .graffiti || tool.type == .graffiti {
29 | selectedTool = nil
30 | }
31 | editorView.updateSticker(stickerText)
32 | checkSelectedTool()
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor/Model/EditorChartlet.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorChartlet.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/7/26.
6 | //
7 |
8 | import UIKit
9 |
10 | public typealias EditorTitleChartletResponse = ([EditorChartlet]) -> Void
11 | public typealias EditorChartletListResponse = (Int, [EditorChartlet]) -> Void
12 |
13 | public struct EditorChartlet {
14 |
15 | /// 贴图对应的 UIImage 对象, 视频支持gif
16 | public let image: UIImage?
17 |
18 | public let imageData: Data?
19 |
20 | #if canImport(Kingfisher)
21 | /// 贴图对应的 网络地址(视频支持gif)
22 | public let url: URL?
23 | #endif
24 |
25 | public let ext: Any?
26 |
27 | public init(
28 | image: UIImage?,
29 | imageData: Data? = nil,
30 | ext: Any? = nil
31 | ) {
32 | self.image = image
33 | self.imageData = imageData
34 | self.ext = ext
35 | #if canImport(Kingfisher)
36 | url = nil
37 | #endif
38 | }
39 |
40 | #if canImport(Kingfisher)
41 | public init(
42 | url: URL?,
43 | ext: Any? = nil
44 | ) {
45 | self.url = url
46 | self.ext = ext
47 | image = nil
48 | imageData = nil
49 | }
50 | #endif
51 | }
52 |
53 | class EditorChartletTitle {
54 |
55 | /// 标题图标 对应的 UIImage 数据
56 | let image: UIImage?
57 |
58 | #if canImport(Kingfisher)
59 | /// 标题图标 对应的 网络地址
60 | let url: URL?
61 | #endif
62 |
63 | init(image: UIImage?) {
64 | self.image = image
65 | #if canImport(Kingfisher)
66 | url = nil
67 | #endif
68 | }
69 |
70 | #if canImport(Kingfisher)
71 | init(url: URL?) {
72 | self.url = url
73 | image = nil
74 | }
75 | #endif
76 |
77 | var isSelected = false
78 | var isLoading = false
79 | var isAlbum = false
80 | var chartletList: [EditorChartlet] = []
81 | }
82 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor/View/EditorBrushBlockView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorBrushBlockView.swift
3 | // HXPHPicker
4 | //
5 | // Created by Silence on 2023/5/10.
6 | //
7 |
8 | import UIKit
9 |
10 | class EditorBrushBlockView: UIView {
11 |
12 | var color: UIColor? {
13 | didSet {
14 | guard let color = color else {
15 | borderLayer.fillColor = UIColor.clear.cgColor
16 | return
17 | }
18 | borderLayer.fillColor = color.cgColor
19 | }
20 | }
21 |
22 | lazy var borderLayer: CAShapeLayer = {
23 | let borderLayer = CAShapeLayer()
24 | borderLayer.strokeColor = UIColor.white.cgColor
25 | borderLayer.fillColor = UIColor.clear.cgColor
26 | borderLayer.lineWidth = 2
27 | borderLayer.shadowColor = UIColor.black.cgColor
28 | borderLayer.shadowRadius = 2
29 | borderLayer.shadowOpacity = 0.4
30 | borderLayer.shadowOffset = CGSize(width: 0, height: 0)
31 | return borderLayer
32 | }()
33 |
34 | override init(frame: CGRect) {
35 | super.init(frame: frame)
36 | layer.addSublayer(borderLayer)
37 | }
38 |
39 | override func layoutSubviews() {
40 | super.layoutSubviews()
41 | borderLayer.frame = bounds
42 |
43 | let path = UIBezierPath(
44 | arcCenter: CGPoint(x: width * 0.5, y: height * 0.5),
45 | radius: width * 0.5 - 1,
46 | startAngle: 0,
47 | endAngle: CGFloat.pi * 2,
48 | clockwise: true
49 | )
50 | borderLayer.path = path.cgPath
51 | }
52 |
53 | required init?(coder: NSCoder) {
54 | fatalError("init(coder:) has not been implemented")
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor/View/EditorCollectionView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorCollectionView.swift
3 | // HXPHPicker
4 | //
5 | // Created by Silence on 2023/5/10.
6 | //
7 |
8 | import UIKit
9 |
10 | class EditorCollectionView: UICollectionView {
11 | public override func touchesShouldCancel(in view: UIView) -> Bool {
12 | true
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor/View/EditorMusicLyricViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorMusicLyricViewCell.swift
3 | // HXPHPicker
4 | //
5 | // Created by Silence on 2023/5/20.
6 | //
7 |
8 | import UIKit
9 |
10 | class EditorMusicLyricViewCell: UICollectionViewCell {
11 |
12 | lazy var lyricLb: UILabel = {
13 | let label = UILabel.init()
14 | label.font = .mediumPingFang(ofSize: 16)
15 | label.textColor = .white
16 | return label
17 | }()
18 |
19 | var lyric: VideoEditorLyric! {
20 | didSet {
21 | lyricLb.text = lyric.lyric
22 | }
23 | }
24 | override init(frame: CGRect) {
25 | super.init(frame: frame)
26 | contentView.addSubview(lyricLb)
27 | }
28 | override func layoutSubviews() {
29 | super.layoutSubviews()
30 | lyricLb.frame = bounds
31 | }
32 | required init?(coder: NSCoder) {
33 | fatalError("init(coder:) has not been implemented")
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor/View/EditorStickerTextView+CollectionView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorStickerTextView+CollectionView.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/8/25.
6 | //
7 |
8 | import UIKit
9 |
10 | extension EditorStickerTextView: UICollectionViewDataSource,
11 | UICollectionViewDelegate {
12 | func collectionView(
13 | _ collectionView: UICollectionView,
14 | numberOfItemsInSection section: Int
15 | ) -> Int {
16 | config.colors.count
17 | }
18 | func collectionView(
19 | _ collectionView: UICollectionView,
20 | cellForItemAt indexPath: IndexPath
21 | ) -> UICollectionViewCell {
22 | let cell = collectionView.dequeueReusableCell(
23 | withReuseIdentifier: "EditorStickerTextViewCellID",
24 | for: indexPath
25 | ) as! EditorStickerTextViewCell
26 | cell.colorHex = config.colors[indexPath.item]
27 | return cell
28 | }
29 | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
30 | if currentSelectedIndex == indexPath.item {
31 | return
32 | }
33 | collectionView.deselectItem(at: IndexPath(item: currentSelectedIndex, section: 0), animated: true)
34 | let color = config.colors[indexPath.item].color
35 | currentSelectedColor = color
36 | currentSelectedIndex = indexPath.item
37 | if showBackgroudColor {
38 | useBgColor = color
39 | if color.isWhite {
40 | changeTextColor(color: .black)
41 | }else {
42 | changeTextColor(color: .white)
43 | }
44 | }else {
45 | changeTextColor(color: color)
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor/View/EditorStickerTextView+Delegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorStickerTextView+Delegate.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/8/25.
6 | //
7 |
8 | import UIKit
9 |
10 | extension EditorStickerTextView: UITextViewDelegate {
11 | func textViewDidChange(_ textView: UITextView) {
12 | textView.typingAttributes = typingAttributes
13 | if textIsDelete {
14 | drawTextBackgroudColor()
15 | textIsDelete = false
16 | }
17 | if !textView.text.isEmpty {
18 | if textView.text.count > config.maximumLimitTextLength &&
19 | config.maximumLimitTextLength > 0 {
20 | let text = textView.text[.. Bool {
28 | if text.isEmpty {
29 | textIsDelete = true
30 | }
31 | return true
32 | }
33 | }
34 |
35 | extension EditorStickerTextView: NSLayoutManagerDelegate {
36 | func layoutManager(
37 | _ layoutManager: NSLayoutManager,
38 | didCompleteLayoutFor textContainer: NSTextContainer?,
39 | atEnd layoutFinishedFlag: Bool
40 | ) {
41 | if layoutFinishedFlag {
42 | drawTextBackgroudColor()
43 | }
44 | }
45 | }
46 |
47 | class EditorStickerTextLayer: CAShapeLayer {
48 | }
49 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Editor/View/EditorVideoControlViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EditorVideoControlViewCell.swift
3 | // HXPHPicker
4 | //
5 | // Created by Silence on 2023/5/13.
6 | //
7 |
8 | import UIKit
9 |
10 | class EditorVideoControlViewCell: UICollectionViewCell {
11 |
12 | lazy var imageView: UIImageView = {
13 | let imageView = UIImageView()
14 | imageView.clipsToBounds = true
15 | imageView.contentMode = .scaleAspectFill
16 | return imageView
17 | }()
18 |
19 | var image: UIImage? {
20 | didSet {
21 | if let image = image {
22 | imageView.setImage(image, animated: true)
23 | }
24 | }
25 | }
26 |
27 | override init(frame: CGRect) {
28 | super.init(frame: frame)
29 | addSubview(imageView)
30 | }
31 |
32 | required init?(coder: NSCoder) {
33 | fatalError("init(coder:) has not been implemented")
34 | }
35 |
36 | override func layoutSubviews() {
37 | super.layoutSubviews()
38 | imageView.frame = bounds
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/AssetURLResult.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AssetURLResult.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/8/25.
6 | //
7 |
8 | import Foundation
9 |
10 | public struct AssetURLResult {
11 |
12 | public enum URLType {
13 | case local
14 | case network
15 | }
16 |
17 | /// Contents of LivePhoto
18 | /// LivePhoto包含的内容
19 | public struct LivePhoto {
20 |
21 | public let imageURL: URL
22 | public let imageURLType: URLType
23 | public let videoURL: URL
24 | public let videoURLType: URLType
25 |
26 | init(
27 | imageURL: URL,
28 | imageURLType: URLType = .local,
29 | videoURL: URL,
30 | videoURLType: URLType = .local
31 | ) {
32 | self.imageURL = imageURL
33 | self.imageURLType = imageURLType
34 | self.videoURL = videoURL
35 | self.videoURLType = videoURLType
36 | }
37 | }
38 | public let url: URL
39 | public let urlType: URLType
40 | public let mediaType: PhotoAsset.MediaType
41 |
42 | /// Contents of LivePhoto
43 | /// selectOptions needs to include livePhoto
44 | /// LivePhoto里包含的资源
45 | /// selectOptions 需包含 livePhoto
46 | public let livePhoto: LivePhoto?
47 |
48 | init(
49 | url: URL,
50 | urlType: URLType,
51 | mediaType: PhotoAsset.MediaType,
52 | livePhoto: LivePhoto? = nil
53 | ) {
54 | self.url = url
55 | self.urlType = urlType
56 | self.mediaType = mediaType
57 | self.livePhoto = livePhoto
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/Config/AlbumTitleViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AlbumTitleViewConfiguration.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/8/30.
6 | //
7 |
8 | import UIKit
9 |
10 | // MARK: Album title view configuration class, valid when the pop-up window displays the album list / 相册标题视图配置类,弹窗展示相册列表时有效
11 | public struct AlbumTitleViewConfiguration {
12 |
13 | public var backgroundColor: UIColor?
14 |
15 | /// Background color in dark style
16 | /// 暗黑风格下背景颜色
17 | public var backgroudDarkColor: UIColor?
18 |
19 | /// Arrow configuration
20 | /// 箭头配置
21 | public var arrow: ArrowViewConfiguration = .init()
22 |
23 | public init() { }
24 | }
25 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/Config/ArrowViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ArrowViewConfiguration.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/8/30.
6 | //
7 |
8 | import UIKit
9 |
10 | // MARK: Album title view configuration class, valid when the pop-up window displays the album list / 相册标题视图配置类,弹窗展示相册列表时有效
11 | public struct ArrowViewConfiguration {
12 |
13 | /// 箭头背景颜色
14 | public var backgroundColor: UIColor = HXPickerWrapper.systemTintColor
15 |
16 | /// 箭头颜色
17 | public var arrowColor: UIColor = "#ffffff".hx.color
18 |
19 | /// 暗黑风格下箭头背景颜色
20 | public var backgroudDarkColor: UIColor = HXPickerWrapper.systemTintColor
21 |
22 | /// 暗黑风格下箭头颜色
23 | public var arrowDarkColor: UIColor = "#ffffff".hx.color
24 |
25 | public init() { }
26 | }
27 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/Config/EmptyViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EmptyViewConfiguration.swift
3 | // HXPHPickerExample
4 | //
5 | // Created by Slience on 2020/12/29.
6 | // Copyright © 2020 Silence. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | // MARK: 照片列表空资源时展示的视图
12 | public struct EmptyViewConfiguration {
13 |
14 | /// 标题颜色
15 | public var titleColor: UIColor = "#666666".hx.color
16 |
17 | /// 暗黑风格下标题颜色
18 | public var titleDarkColor: UIColor = "#ffffff".hx.color
19 |
20 | /// 子标题颜色
21 | public var subTitleColor: UIColor = "#999999".hx.color
22 |
23 | /// 暗黑风格下子标题颜色
24 | public var subTitleDarkColor: UIColor = "#dadada".hx.color
25 |
26 | public init() { }
27 | }
28 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/Config/NotAuthorizedConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NotAuthorizedConfiguration.swift
3 | // HXPHPickerExample
4 | //
5 | // Created by Slience on 2020/12/29.
6 | // Copyright © 2020 Silence. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | // MARK: 未授权界面配置类
12 | public struct NotAuthorizedConfiguration {
13 |
14 | /// 背景颜色
15 | public var backgroundColor: UIColor = .white
16 |
17 | /// 暗黑风格下的背景颜色
18 | public var darkBackgroundColor: UIColor = "#2E2F30".hx.color
19 |
20 | /// 关闭按钮图片名
21 | public var closeButtonImageName: String = "hx_picker_notAuthorized_close"
22 |
23 | /// 暗黑风格下的关闭按钮图片名
24 | public var closeButtonDarkImageName: String = "hx_picker_notAuthorized_close_dark"
25 |
26 | /// 隐藏关闭按钮
27 | public var isHiddenCloseButton: Bool = false
28 |
29 | /// 标题颜色
30 | public var titleColor: UIColor = .black
31 |
32 | /// 暗黑风格下的标题颜色
33 | public var titleDarkColor: UIColor = .white
34 |
35 | /// 子标题颜色
36 | public var subTitleColor: UIColor = "#444444".hx.color
37 |
38 | /// 暗黑风格下的子标题颜色
39 | public var darkSubTitleColor: UIColor = .white
40 |
41 | /// 跳转按钮背景颜色
42 | public var jumpButtonBackgroundColor: UIColor = "#333333".hx.color
43 |
44 | /// 暗黑风格下跳转按钮背景颜色
45 | public var jumpButtonDarkBackgroundColor: UIColor = .white
46 |
47 | /// 跳转按钮文字颜色
48 | public var jumpButtonTitleColor: UIColor = "#ffffff".hx.color
49 |
50 | /// 暗黑风格下跳转按钮文字颜色
51 | public var jumpButtonTitleDarkColor: UIColor = "#333333".hx.color
52 |
53 | public init() { }
54 | }
55 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/Config/SystemCameraConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SystemCameraConfiguration.swift
3 | // HXPHPickerExample
4 | //
5 | // Created by Slience on 2020/12/29.
6 | // Copyright © 2020 Silence. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import AVFoundation
11 |
12 | // MARK: System camera configuration class / 系统相机配置类
13 | public struct SystemCameraConfiguration {
14 |
15 | /// 媒体类型
16 | /// [kUTTypeImage, kUTTypeMovie]
17 | public var mediaTypes: [String] = []
18 |
19 | /// Maximum video recording time
20 | /// 视频最大录制时长
21 | public var videoMaximumDuration: TimeInterval = 60
22 |
23 | /// Video quality at the time of shooting
24 | /// 拍摄时的视频质量
25 | public var videoQuality: UIImagePickerController.QualityType = .typeHigh
26 |
27 | /// Video Editing Crop Export Resolution
28 | /// 视频编辑裁剪导出的分辨率
29 | public var editExportPreset: ExportPreset = .ratio_960x540
30 |
31 | /// Video Editing Cropping Export Quality
32 | /// 视频编辑裁剪导出的质量
33 | public var editVideoQuality: Int = 6
34 |
35 | /// Use the rear camera by default
36 | /// 默认使用后置相机
37 | public var cameraDevice: UIImagePickerController.CameraDevice = .rear
38 |
39 | /// allow editing
40 | /// 允许编辑
41 | public var allowsEditing: Bool = true
42 |
43 | public init() { }
44 | }
45 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/Controller/PhotoPickerViewController+BottomView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PhotoPickerViewController+BottomView.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/8/27.
6 | //
7 |
8 | import Foundation
9 |
10 | // MARK: PhotoPickerBottomViewDelegate
11 | extension PhotoPickerViewController: PhotoPickerBottomViewDelegate {
12 |
13 | func bottomView(
14 | didPreviewButtonClick bottomView: PhotoPickerBottomView
15 | ) {
16 | guard let picker = pickerController else { return }
17 | pushPreviewViewController(
18 | previewAssets: picker.selectedAssetArray,
19 | currentPreviewIndex: 0,
20 | animated: true
21 | )
22 | }
23 | func bottomView(
24 | didFinishButtonClick bottomView: PhotoPickerBottomView
25 | ) {
26 | pickerController?.finishCallback()
27 | }
28 | func bottomView(
29 | _ bottomView: PhotoPickerBottomView,
30 | didOriginalButtonClick isOriginal: Bool
31 | ) {
32 | pickerController?.originalButtonCallback()
33 | }
34 |
35 | public func setOriginal(_ isOriginal: Bool) {
36 | bottomView.boxControl.isSelected = isOriginal
37 | if !isOriginal {
38 | // 取消
39 | bottomView.cancelRequestAssetFileSize()
40 | }else {
41 | // 选中
42 | bottomView.requestAssetBytes()
43 | }
44 | pickerController?.isOriginal = isOriginal
45 | pickerController?.originalButtonCallback()
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/Controller/PhotoPreviewViewController+NavigationController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PhotoPreviewViewController+NavigationController.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/8/27.
6 | //
7 |
8 | import UIKit
9 |
10 | // MARK: UINavigationControllerDelegate
11 | extension PhotoPreviewViewController: UINavigationControllerDelegate {
12 |
13 | public func navigationController(
14 | _ navigationController: UINavigationController,
15 | animationControllerFor operation: UINavigationController.Operation,
16 | from fromVC: UIViewController,
17 | to toVC: UIViewController
18 | ) -> UIViewControllerAnimatedTransitioning? {
19 | if operation == .push {
20 | if toVC is PhotoPreviewViewController && fromVC is PhotoPickerViewController {
21 | return PickerTransition.init(type: .push)
22 | }
23 | }else if operation == .pop {
24 | if fromVC is PhotoPreviewViewController && toVC is PhotoPickerViewController {
25 | let cell = getCell(for: currentPreviewIndex)
26 | cell?.scrollContentView.hiddenOtherSubview()
27 | return PickerTransition.init(type: .pop)
28 | }
29 | }
30 | return nil
31 | }
32 | public func navigationController(
33 | _ navigationController: UINavigationController,
34 | interactionControllerFor
35 | animationController: UIViewControllerAnimatedTransitioning
36 | ) -> UIViewControllerInteractiveTransitioning? {
37 | if let canInteration = interactiveTransition?.canInteration, canInteration {
38 | return interactiveTransition
39 | }
40 | return nil
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/Extension/Picker+Int.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Picker+Int.swift
3 | // HXPHPicker
4 | //
5 | // Created by Silence on 2023/5/5.
6 | //
7 |
8 | import Foundation
9 |
10 | extension Int {
11 |
12 | var bytesString: String {
13 | let formatter = ByteCountFormatter()
14 | formatter.allowedUnits = [.useBytes, .useKB, .useMB]
15 | formatter.countStyle = .file
16 | return formatter.string(fromByteCount: Int64(self))
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/View/AlbumTickView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AlbumTickView.swift
3 | // HXPHPickerExample
4 | //
5 | // Created by Slience on 2020/12/29.
6 | // Copyright © 2020 Silence. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | public class AlbumTickView: UIView {
12 | public lazy var tickLayer: CAShapeLayer = {
13 | let tickLayer = CAShapeLayer.init()
14 | tickLayer.contentsScale = UIScreen.main.scale
15 | let tickPath = UIBezierPath.init()
16 | tickPath.move(to: CGPoint(x: scale(8), y: height * 0.5 + scale(1)))
17 | tickPath.addLine(to: CGPoint(x: width * 0.5 - scale(2), y: height - scale(8)))
18 | tickPath.addLine(to: CGPoint(x: width - scale(7), y: scale(9)))
19 | tickLayer.path = tickPath.cgPath
20 | tickLayer.lineWidth = 1.5
21 | tickLayer.strokeColor = UIColor.black.cgColor
22 | tickLayer.fillColor = UIColor.clear.cgColor
23 | return tickLayer
24 | }()
25 | override init(frame: CGRect) {
26 | super.init(frame: frame)
27 | layer.addSublayer(tickLayer)
28 | }
29 |
30 | private func scale(_ numerator: CGFloat) -> CGFloat {
31 | return numerator / 30 * height
32 | }
33 |
34 | required init?(coder: NSCoder) {
35 | fatalError("init(coder:) has not been implemented")
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/View/Cell/PhotoPickerWeChatViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PhotoPickerWeChatViewCell.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/10/25.
6 | //
7 |
8 | import UIKit
9 |
10 | open class PhotoPickerWeChatViewCell: PhotoPickerSelectableViewCell {
11 |
12 | lazy var titleLb: UILabel = {
13 | let titleLb = UILabel()
14 | titleLb.textAlignment = .center
15 | titleLb.textColor = .white
16 | titleLb.font = .semiboldPingFang(ofSize: 15)
17 | titleLb.isHidden = true
18 | return titleLb
19 | }()
20 |
21 | open override func initView() {
22 | super.initView()
23 | contentView.insertSubview(titleLb, belowSubview: selectControl)
24 | }
25 |
26 | open override func updateSelectedState(isSelected: Bool, animated: Bool) {
27 | super.updateSelectedState(isSelected: isSelected, animated: animated)
28 | titleLb.isHidden = !isSelected
29 | titleLb.text = "\(photoAsset.selectIndex + 1)"
30 | titleLb.height = 18
31 | titleLb.width = titleLb.textWidth
32 | titleLb.centerY = selectControl.centerY
33 | }
34 |
35 | open override func layoutView() {
36 | super.layoutView()
37 | titleLb.x = 10
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/View/Cell/PreviewPhotoViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PreviewPhotoViewCell.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/3/12.
6 | //
7 |
8 | import UIKit
9 |
10 | class PreviewPhotoViewCell: PhotoPreviewViewCell, PhotoPreviewContentViewDelete {
11 |
12 | override init(frame: CGRect) {
13 | super.init(frame: frame)
14 | scrollContentView = PhotoPreviewContentView.init(type: .photo)
15 | scrollContentView.delegate = self
16 | initView()
17 | }
18 | required init?(coder: NSCoder) {
19 | fatalError("init(coder:) has not been implemented")
20 | }
21 | func contentView(requestSucceed contentView: PhotoPreviewContentView) {
22 | delegate?.cell(requestSucceed: self)
23 | }
24 | func contentView(requestFailed contentView: PhotoPreviewContentView) {
25 | delegate?.cell(requestFailed: self)
26 | }
27 | func contentView(updateContentSize contentView: PhotoPreviewContentView) {
28 | setupScrollViewContentSize()
29 | }
30 |
31 | func contentView(networkImagedownloadSuccess contentView: PhotoPreviewContentView) {
32 | delegate?.photoCell(networkImagedownloadSuccess: self)
33 | }
34 | func contentView(networkImagedownloadFailed contentView: PhotoPreviewContentView) {
35 | delegate?.photoCell(networkImagedownloadFailed: self)
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Picker/View/PhotoPickerSwitchLayout.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PhotoPickerSwitchLayout.swift
3 | // HXPHPicker
4 | //
5 | // Created by Slience on 2021/9/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class PhotoPickerSwitchLayout: UICollectionViewFlowLayout {
11 | var changing: Bool = false
12 | override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint {
13 | if changing {
14 | return CGPoint(x: -collectionView!.contentInset.left, y: -collectionView!.contentInset.top)
15 | }
16 | return super.targetContentOffset(forProposedContentOffset: proposedContentOffset)
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/.DS_Store
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/ar.lproj/Localizable.strings:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/ar.lproj/Localizable.strings
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/de.lproj/Localizable.strings:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/de.lproj/Localizable.strings
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/en.lproj/Localizable.strings:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/en.lproj/Localizable.strings
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/fr.lproj/Localizable.strings:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/fr.lproj/Localizable.strings
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_down_back@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_down_back@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_down_back@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_down_back@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_overturn@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_overturn@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_overturn@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_camera_overturn@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_back@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_back@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_back@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_back@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_color_custom@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_color_custom@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_color_custom@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_color_custom@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_repeal@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_repeal@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_repeal@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_brush_repeal@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_change_asset@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_change_asset@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_change_asset@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_change_asset@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_crop_mask_list@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_crop_mask_list@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_crop_mask_list@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_crop_mask_list@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_brightness@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_brightness@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_brightness@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_brightness@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_contrast@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_contrast@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_contrast@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_contrast@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_saturation@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_saturation@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_saturation@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_saturation@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_sharpen@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_sharpen@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_sharpen@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_sharpen@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_vignette@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_vignette@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_vignette@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_vignette@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_warmth@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_warmth@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_warmth@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_filter_edit_warmth@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_mosaic_brush_image@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_mosaic_brush_image@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_mosaic_brush_image@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_mosaic_brush_image@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop_free@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop_free@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop_free@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_crop_free@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_horizontally@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_horizontally@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_horizontally@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_horizontally@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_vertically@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_vertically@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_vertically@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_mirror_vertically@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_left@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_left@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_left@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_left@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_right@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_right@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_right@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_rotate_right@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_normal@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_normal@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_normal@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_normal@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_selected@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_selected@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_selected@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_text_selected@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_emoji@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_emoji@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_emoji@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_emoji@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_text@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_text@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_text@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_tools_text@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_close@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_close@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_close@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_close@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_open@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_open@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_open@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_photo_trash_open@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_color@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_color@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_color@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_color@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_normal@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_normal@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_normal@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tool_mosaic_normal@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_chartle_album@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_chartle_album@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_chartle_album@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_chartle_album@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_change@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_change@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_change@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_change@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_edit@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_edit@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_edit@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_filter_edit@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_graffiti@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_graffiti@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_graffiti@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_graffiti@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_mosaic@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_mosaic@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_mosaic@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_mosaic@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_music@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_music@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_music@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_music@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_play@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_play@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_play@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_tools_play@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_left@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_left@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_left@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_left@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_right@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_right@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_right@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_arrow_right@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_pause@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_pause@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_pause@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_pause@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_play@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_play@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_play@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_control_play@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_crop@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_crop@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_crop@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_crop@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_search@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_search@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_search@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_search@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_volume@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_volume@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_volume@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_video_music_volume@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_delete@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_delete@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_delete@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_delete@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_rotate@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_rotate@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_rotate@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_rotate@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_scale@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_scale@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_scale@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_editor_view_sticker_item_scale@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_normal@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_normal@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_normal@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_normal@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_selected@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_selected@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_selected@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_box_selected@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_edit_pull_down@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_edit_pull_down@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_edit_pull_down@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_photo_edit_pull_down@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_add_img@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_add_img@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_add_img@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_add_img@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_album_empty@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_album_empty@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_album_empty@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_album_empty@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_livephoto_icon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_livephoto_icon@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_livephoto_icon@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_livephoto_icon@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_photo_edit_icon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_photo_edit_icon@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_photo_edit_icon@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_photo_edit_icon@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_edit_icon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_edit_icon@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_edit_icon@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_edit_icon@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_icon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_icon@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_icon@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_icon@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_play@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_play@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_play@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_cell_video_play@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_livePhoto@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_livePhoto@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_livePhoto@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_livePhoto@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close_dark@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close_dark@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close_dark@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_notAuthorized_close_dark@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph_white@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph_white@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph_white@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photoList_photograph_white@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photo_icloud_mark@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photo_icloud_mark@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photo_icloud_mark@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photo_icloud_mark@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt_arrow@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt_arrow@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt_arrow@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_bottom_prompt_arrow@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_cancel@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_cancel@2x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_cancel@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/images/hx_picker_photolist_cancel@3x.png
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/metal/default.metallib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/metal/default.metallib
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/musics/天外来物:
--------------------------------------------------------------------------------
1 | [ti:天外来物]
2 | [t_time:(00:38)]
3 | [00:00.000]你像 天外来物一样 求之不得
4 | [00:07.689]你在世俗里的名字 不重要了
5 | [00:14.689]正好 我隐藏的人格是契而不舍
6 | [00:21.689]直到蜂拥而至的人都透明了
7 | [00:28.689]我在 不近又不远处
8 | [00:33.189]用明天换你 靠近我
9 |
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/ru.lproj/Localizable.strings:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/ru.lproj/Localizable.strings
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/vi.lproj/Localizable.strings:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/vi.lproj/Localizable.strings
--------------------------------------------------------------------------------
/Sources/HXPHPicker/Resources/HXPHPicker.bundle/zh-Hans.lproj/Localizable.strings:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SilenceLove/HXPHPicker/af9e094d5e6cbf7bdc352a1862405b80018c699d/Sources/HXPHPicker/Resources/HXPHPicker.bundle/zh-Hans.lproj/Localizable.strings
--------------------------------------------------------------------------------
/Sources/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | $(MARKETING_VERSION)
19 | CFBundleVersion
20 | $(CURRENT_PROJECT_VERSION)
21 |
22 |
23 |
--------------------------------------------------------------------------------
/tmp.xcconfig:
--------------------------------------------------------------------------------
1 | EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64=arm64 arm64e armv7 armv7s armv6 armv8\
2 | EXCLUDED_ARCHS=$(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT))}
3 |
--------------------------------------------------------------------------------